欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

一个可以根除自效验极其蝴蝶效应的方法

一个可以根除自效验极其蝴蝶效应的方法

自效验我一般直接替换他计算此个文件出来的效验值的字符串  在他入栈的时候  这样就可以根除后边一系列的蝴蝶效应  也就是说 替换了蝴蝶 - - -  方法就是 找到他对此个文件计算出来的效验代码第一次入栈或者转移的地方,然后跳到一个没用的地方,如果这个地方上边有跳转最好JMP或者NOP掉,防止误入此处引起崩溃,然后把那个地方原来的代码抹去(自效验代码通常都很长),写入正确版本的效验字符串,然后把字串的地址入栈或放到某个寄存器,然后跳回原处,然后....基本就OK了
用这样的方法杀掉了蝴蝶,比阻止飓风更可靠,而且更简便 - - 飓风也就是那些杀窗啊 错误操作啊 关机啊 什么的,但是那些东西都有一个共同点 就是来自于自效验这只小小的蝴蝶- - 而且有些程序不是直接比较明码字串的,而是把计算的结果放到某个地方, 适当的时候他会某个地方给你来下比较 抽其中的某个字符去跟原本的对应字符比较,而且操作上也没什么可用的函数,这个时候,更要找的就是这只蝴蝶了,然后修改此个文件计算出来的字符串结果 给你来段代码
(修改前文件名字:蚂蚁精灵.修改后名字:KK,在此注释,以示区别)

=========================修改前=======================
修改前1  这段代码就是一开始感觉没用的地方 直接全部充00
0040BAF5  |. /0F8D 72000000 jge 蚂蚁精灵.0040BB6D
0040BAFB     |6A 00         push 0x0
0040BAFD     |68 01000000   push 0x1
0040BB02     |6A FF         push -0x1
0040BB04     |6A 06         push 0x6
0040BB06     |68 D1360116   push 0x160136D1
0040BB0B     |68 01000152   push 0x52010001
0040BB10     |E8 E1F40200   call 蚂蚁精灵.0043AFF6
0040BB15     |83C4 18       add esp,0x18
0040BB18     |6A 01         push 0x1
0040BB1A     |68 01000000   push 0x1
0040BB1F     |B8 5C654C00   mov eax,蚂蚁精灵.004C655C                    ;  
0040BB24     |8945 D8       mov dword ptr ss:[ebp-0x28],eax
0040BB27     |8D45 D8       lea eax,dword ptr ss:[ebp-0x28]
0040BB2A     |50            push eax
0040BB2B     |E8 7D64FFFF   call 蚂蚁精灵.00401FAD
0040BB30     |8B5D D8       mov ebx,dword ptr ss:[ebp-0x28]
0040BB33     |85DB          test ebx,ebx
0040BB35     |74 09         je short 蚂蚁精灵.0040BB40
0040BB37     |53            push ebx
0040BB38     |E8 8FF40200   call 蚂蚁精灵.0043AFCC
0040BB3D     |83C4 04       add esp,0x4
0040BB40     |6A 01         push 0x1
0040BB42     |68 01000000   push 0x1
0040BB47     |B8 81654C00   mov eax,蚂蚁精灵.004C6581                    ;
0040BB4C     |8945 D8       mov dword ptr ss:[ebp-0x28],eax
0040BB4F     |8D45 D8       lea eax,dword ptr ss:[ebp-0x28]
0040BB52     |50            push eax
0040BB53     |E8 5564FFFF   call 蚂蚁精灵.00401FAD
0040BB58     |8B5D D8       mov ebx,dword ptr ss:[ebp-0x28]
0040BB5B     |85DB          test ebx,ebx
0040BB5D     |74 09         je short 蚂蚁精灵.0040BB68
0040BB5F     |53            push ebx
0040BB60     |E8 67F40200   call 蚂蚁精灵.0043AFCC
0040BB65     |83C4 04       add esp,0x4
0040BB68     |E9 07030000   jmp 蚂蚁精灵.0040BE74
修改前2  自效验计算完成后把结果字符串转移入栈的地方
0049CFB6      E8 95000000   call 蚂蚁精灵.0049D050
0049CFBB      8D4424 0C     lea eax,dword ptr ss:[esp+0xC]        //把计算结果转到EAX
0049CFBF      50            push eax                               //    EAX入栈  也就是压入了结果  所以上边的指令也可以NOP
0049CFC0      E8 8BFFFFFF   call 蚂蚁精灵.0049CF50
0049CFC5   .  8B4C24 38     mov ecx,dword ptr ss:[esp+0x38]
0049CFC9   .  8901          mov dword ptr ds:[ecx],eax
0049CFCB   .  83C4 34       add esp,0x34
0049CFCE   .  C3            retn

==========================修改后========================

修改后1         修改了最上边的跳转为JMP 无条件跳过这段代码
0040BAF5   /EB 76           jmp short kk.0040BB6D         //无条件跳过下边的代码
0040BAF7   |90                nop
0040BAF8   |90                nop
0040BAF9   |90                nop
0040BAFA   |90                nop
0040BAFB   |64:61           popad                                //字符串头部,对应da
0040BAFD   |34 64           xor al,0x64
0040BAFF   |3930            cmp dword ptr ds:[eax],esi
0040BB01   |3131            xor dword ptr ds:[ecx],esi
0040BB03   |3166 65         xor dword ptr ds:[esi+0x65],esp
0040BB06   |65:626464 62    bound esp,qword ptr gs:[esp+0x62]
0040BB0B   |386462 65       cmp byte ptr ds:[edx+0x65],ah
0040BB0F   |64:323437       xor dh,byte ptr fs:[edi+esi]
0040BB13   |3365 65         xor esp,dword ptr ss:[ebp+0x65]
0040BB16   |64:             prefix fs:
0040BB17   |36:6230         bound esi,qword ptr ss:[eax]       
0040BB1A   |3300            xor eax,dword ptr ds:[eax]            //字符串尾巴,对应03
0040BB1C   |68 FBBA4000     push kk.0040BAFB      //这个就是正确的效验值ASCII "da490111feebddb8dbed2473eed6b03"压入的是头部
0040BB21   |E8 2A140900     call kk.0049CF50                        //补的代码
0040BB26   |E9 9A140900     jmp kk.0049CFC5                      !!跳到0049CFC5  

修改后2   第一次将效验值字符串压入栈堆的地方
0049CFBB   .  90                     nop                            //也可以把下边的JMP写到这个地方 这样就可以不占用下边CALL位置了
0049CFBC   .  90                     nop
0049CFBD   .  90                     nop
0049CFBE   .  90                     nop
0049CFBF   .^ E9 58EBF6FF    jmp kk.0040BB1C      //跳向kk.0040BB1C,也就是新的字符串入栈的地方
0049CFC4      90                    nop                            //上边的JMP占用了此处字节,所以这个CALL也要在上边补上,然后!!跳到0049CFC5,也就是下边紧挨着的地址.
0049CFC5   >  8B4C24 38      mov ecx,dword ptr ss:[esp+0x38]
0049CFC9   .  8901                mov dword ptr ds:[ecx],eax
0049CFCB   .  83C4 34           add esp,0x34
0049CFCE   .  C3                    retn
ASCII字符串写法  右键-2进制-ASCII:XXXXXXXXX   如有需要允许改变大小
其他类型写法一样
如何对自效验下断找到此处:请下读取文件相关函数,比较常用的有CreateFileA(对应A字符)和CreateFileW (对应UN字符)
跟踪的时候 在你看到堆栈里有效验值出现的时候 就要注意他前边的CALL了
关键的入栈部分很可能在里边
=====================================后记====================================

后记:恩恩,上边图中的警告的确是对的,只要修改一个字符,就要在软件运行时面临一系列的错误,而且无止无境,好象永远都改不完,恩恩 的确 我也是在修改了一半的时候想到了这个方法 大家觉得怎么样,还有哇,这个程序没有必要往下破了,因为人家的东西真的是人工的,而且主要的限制功能还是在服务器上的操作的, 所以就算破了好象也只能上人家服务器上报个道吧哈哈- -

再扔两个文件效验值查看工具  这里用的就是MD532, 如果你看到的是2进制的字串的话,那么基本上就是CRC32的了,用这两个工具主要是原程序是加壳文件的话,查看时会更方便些

上传的附件 文件MD5和CRC32效验值查看工具.rar

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功