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

原文地址:https://www.cnblogs.com/theseventhson/p/14269323.html