zoukankan      html  css  js  c++  java
  • xxxx(三)“黑吃黑”: 破解别人外挂

         1、所谓挂外,本质上是改变原有软件的执行流程。方式有两种:

    •   通过改函数的参数来函数的执行流程
    •      直接改代码,尤其是JCC、 call等跳转指令。

         外挂的形式大致也有两种:

    •     dll注入
    •     直接改原软件的exe、dll等PE文件
    •     shellcode

          破解别人的外挂,本质上就是找到这个外挂更改了原软件的哪些点,比如改了哪些函数的参数? 改了哪些关键的指令? 今天分享一些破解别人外挂的经历。

         2、还是以xxxx这种软件为例:有dll/shellcode注入的外挂,也有直接替换关键dll的外挂,这两种外挂的破解方式原理一样,不过表现形式稍微有点不同:

    •      dll/shellcode注入:代码注入后,肯定会改变原有代码或数据,怎么找到哪些地方被改变了? 用PChunter!再应用层钩子->进程钩子这里能看到exe或dll的哪些地方被挂钩(更改前是什么、更改后又是什么);这种方法适合动态查看挂钩的地方;

         

    •    直接替换关键dll:由于exe加载执行时已经用了替换后的dll,PChunter没法比对,所以是检测不到挂钩点的,这时只能先静态分析了

         3、(1)在网上找了一个能多开和防止消息撤回功能的外挂,只有一个dll,名字和官方版本的相同,直接替换就行。为了区分,我把挂外的dll名字后面加上了patch,官方原版dll的名字不变;

              (2)010Editor在tools->compare files功能,可以对比两个二进制文件的异同,如下:一共找到8个diffrence,下面挨个看看这8个地方都改了啥

                

             (3)先看看改动最多的一个,地址在0x986D20这里,一共改了5个字节;从IDA来看,直接NOP掉了一个call。看到了这里大家一定很好奇,这个call到底是干什么,为啥会被直接干掉了?

               

             进入被NOP掉的函数:从字符串看,貌似是和登陆界面相关的函数,猜测应该是初始化登陆界面的。正常函数一开始应该是push ebp, mov ebp,esp, sub esp,xxxx等。但是这个函数一进来就是call跳转,此处反常必有妖,继续跟进这个call函数;

             

             看到这里相比大家都明白了:这是防止多开的函数,通过mutex防止被多开,所以这个被NOP掉的函数逻辑就清晰了:第一次运行时先建立mutex,再初始化登陆界面;第二次运行时发现已经有这个mutext,程序直接退出

             

            (4)再从头看看其他被改动的代码都是啥了,如下:

              第一个:把JZ改成JMP,也就是无条件跳转(原本是bl等于0才跳转)

              

              第二个:test eax,eax改成xor eax,eax,导致后面的JZ无条件执行

             

            第三个:原本eax大于9才执行的ja语句,这里也改成无条件执行jmp了:

           

          第四个:test被改成xor,ecx被清零,jz语句被改成必须执行;

         

         第五个:同上,原本al等于0才跳转,这里改成jmp无条件跳转

         

        第六、七同上:test改成xor,把ZF置1,让JNZ肯定执行;

        

         

         上面各种被强制跳转/不跳转的代码到底是做什么的了?有啥业务意义了?下面继续通过OD动态调试查看。

        (5)先看看效果:外挂dll放在虚拟机,另一个账号在物理机;物理机的账号给虚拟机发消息“测试‘,然后撤回,物理机会显示“你撤回了一条消息”;此时虚拟机账号也会显示一条消息是“xxx撤回了一条消息”,但虚拟机账号任然能看到”测试“这条消息,说明撤回功能是ok的!

         

         站在正向开发的角度考虑撤回消息的流程: 

    •    发送方选择撤回,此时在消息窗口不再显示这条消息,同时给接收方发送消息撤回的指令
    •    接收方收到撤回的指令后,立即从消息框中抹掉刚才展示的消息,然后展示”xxx测绘了一条消息“; 整个撤回最关键的地方就在这里了:接收方收到撤回指令后拒绝,或走另一个不撤回的分支,这也是上面所有防撤回功能都更改JCC指令的原因

          现在挨个分析更改地方都做了啥:

    •    第一个明显是防止多开的,这个不用调试了,其他都是改变JCC指令来改变原有的执行流程,挨个下断点看看都干了啥(实现啥功能);

          

         

         

         

         

         下断点的时候注意:这个关键dll的基址是66B00000,上面静态分析找到偏移,调试时断点的位置都是通过基址+偏移方式找到的

         这里打个岔: 下面看到了VMP0段,终于开始加壳保护了!后续有时间会单独分析这个vmp0段到底干了啥(肯定是很重要的代码,否则没必要加壳了)!

         

         经过几次重复实际测试:上面下了7个断点,只有这一个断下来了!其他6个都没用,也不知道外挂作者是怎么想的,为啥要改那么多没用的地方............

         

           继续跟踪,进入je这个跳转看看都走了啥:这里push了一个session会话,猜测可能和聊天对象(也就是消息的接收人)相关:

        

         继续单步调试进入call:这里就非常清晰了,从字面意思都能看出来是解析撤回内容的!

        

         突然想到有个IM软件叫”电报“,是不是也能通过这种方式防止别人撤回了(我还没试过........)?

        xxxx软件的版本:3.1.0.41

  • 相关阅读:
    SpringBoot监听Redis的Key过期事件
    because there was insufficient free space available after evicting expired cache entries
    springboot遇见netty 获取配置文件参数值为null
    spring cloud/spring boot同时支持http和https访问
    spring项目中引入AspectJ相关的Maven依赖【复制即可】
    解决spring中使用声明事务java.lang.NoClassDefFoundError: org/aspectj/util/PartialOrder$PartialComparable.
    maplestory【Lotus prequest】---2.2、request
    maplestory【Lotus prequest】---2.1、princess
    maplestory【Lotus prequest】---1.7、invincible
    maplestory【Lotus prequest】---1.6、orchid
  • 原文地址:https://www.cnblogs.com/theseventhson/p/14269323.html
Copyright © 2011-2022 走看看