00903000 >  55              push ebp               //程序载入停在这里
00903001    8BEC            mov ebp,esp            //由于壳是双进程的,所以我们需要先干掉双进程
00903003    6A FF           push -0x1              //至于为什么是双进程你OD运行下就知道啦
00903005    68 1D321305     push 0x513321D         //壳比较**,网上搜索了下都是最后一次异常法
0090300A    68 88888808     push 0x8888888         //但是SOD太强啦,减少保护他也一样无法异常
0090300F    64:A1 00000000  mov eax,dword ptr fs:[0]    //使用其他隐藏插件也未果,总被检测出调试器
00903015    50              push eax                    //于是便有了此法,具体请看下文
00903016    64:8925 0000000>mov dword ptr fs:[0],esp    //Ctrl+g查找CreateFileA,F2在函数末尾下断免检测
0090301D    58              pop eax                     //此壳异常N多,还有效验初始化时间,检测调试器,诸多检测
0090301E    64:A3 00000000  mov dword ptr fs:[0],eax    //Die64查编写是DELPHI,好啦,我们就以**制**吧
━━━━━━━━━━━━━━━━━━━━━━━━━━
7C801A28 >  8BFF            mov edi,edi                     //查找到了这里
7C801A2A    55              push ebp
7C801A2B    8BEC            mov ebp,esp
7C801A2D    FF75 08         push dword ptr ss:[ebp+0x8]
7C801A30    E8 8FC60000     call kernel32.7C80E0C4
7C801A35    85C0            test eax,eax
7C801A37    74 1E           je short kernel32.7C801A57
7C801A39    FF75 20         push dword ptr ss:[ebp+0x20]
7C801A3C    FF75 1C         push dword ptr ss:[ebp+0x1C]
7C801A3F    FF75 18         push dword ptr ss:[ebp+0x18]
7C801A42    FF75 14         push dword ptr ss:[ebp+0x14]
7C801A45    FF75 10         push dword ptr ss:[ebp+0x10]
7C801A48    FF75 0C         push dword ptr ss:[ebp+0xC]
7C801A4B    FF70 04         push dword ptr ds:[eax+0x4]
7C801A4E    E8 5DED0000     call kernel32.CreateFileW
7C801A53    5D              pop ebp
7C801A54    C2 1C00         retn 0x1C                           //在这里F2下断
7C801A57    83C8 FF         or eax,-0x1                         //shift+f9运行程序
7C801A5A  ^ EB F7           jmp short kernel32.7C801A53         //停下后ait+f9返回,记住返回前取消断点
━━━━━━━━━━━━━━━━━━━━━━━━━━
0090F554    8BF0            mov esi,eax                         //返回到了这里
0090F556    83FE FF         cmp esi,-0x1                        //F8单步小心跟踪
0090F559    0F84 72010000   je SparkNot.0090F6D1
0090F55F    8D4C24 1C       lea ecx,dword ptr ss:[esp+0x1C]
0090F563    6A 00           push 0x0
0090F565    51              push ecx
0090F566    8D5424 18       lea edx,dword ptr ss:[esp+0x18]
0090F56A    6A 0C           push 0xC
━━━━━━━━━━━━━━━━━━━━━━━━━━
0090F593    837C24 1C 0C    cmp dword ptr ss:[esp+0x1C],0xC   //下面的jnb修改C标志位让他跳
0090F598    73 76           jnb short SparkNot.0090F610       //这里让他跳不跳就死啦
0090F59A    E8 F7FDFFFF     call SparkNot.0090F396            //不跳就死
0090F59F    894424 10       mov dword ptr ss:[esp+0x10],eax   
0090F5A3    8D4424 10       lea eax,dword ptr ss:[esp+0x10]
0090F5A7    50              push eax
━━━━━━━━━━━━━━━━━━━━━━━━━━
0012FE84  00 00 00 00 EA FE 12 00 7E 74 65 6D 70 30 2D 31  ....掰.~temp0-1     //上面一句时就可以看见分离子进程
0012FE94  35 34 31 31 31 30 37 30 31 2E 74 6D 70 00 90 00  541110701.tmp.?
0012FEA4  10 00 00 00 00 FE 12 00 54 0E 90 61 10 35 1A 5F  ....?.T5_
0012FEB4  07 1D B2 E4 58 D6 4B 15 43 3A 5C 44 4F 43 55 4D  蹭XC:\DOCUM
0012FEC4  45 7E 31 5C 66 61 6E 66 61 6E 5C 4C 4F 43 41 4C  E~1\fanfan\LOCAL
0012FED4  53 7E 31 5C 54 65 6D 70 5C 7E 74 65 6D 70 30 2D  S~1\Temp\~temp0-
0012FEE4  31 35 34 31 31 31 30 37 30 31 2E 74 6D 70 00 90  1541110701.tmp.
━━━━━━━━━━━━━━━━━━━━━━━━━━
0090F642    81FF 803E0000   cmp edi,0x3E80                      //这里判断是否需要分离进程
0090F648    897C24 20       mov dword ptr ss:[esp+0x20],edi     //下面的jbe修改C标志位让他跳
0090F64C    76 08           jbe short SparkNot.0090F656         //这里也让他跳
0090F64E    83FB 05         cmp ebx,0x5                         //不然跳到JMP下去又是死循环
0090F651    74 7E           je short SparkNot.0090F6D1
0090F653    43              inc ebx
0090F654    EB 57           jmp short SparkNot.0090F6AD
0090F656    85FF            test edi,edi
0090F658    0F85 B0000000   jnz SparkNot.0090F70E              //通过修改跳转后我们的jnz实现了跳转
0090F65E    E8 33FDFFFF     call SparkNot.0090F396             //我们让jnz跳过分离进程
0090F663    8BF8            mov edi,eax                        //单步F8跟
0090F665    8B4424 10       mov eax,dword ptr ss:[esp+0x10]
━━━━━━━━━━━━━━━━━━━━━━━━━━
0090F70E    5F              pop edi                 
0090F70F    5E              pop esi                   //jnz跳转实现后来到这里
0090F710    5D              pop ebp                   //我们Ctrl+g查找GetModuleHandleA,F2在函数末尾下断免检测
0090F711    B8 08000000     mov eax,0x8
0090F716    5B              pop ebx
0090F717    81C4 48010000   add esp,0x148
0090F71D    C3              retn
━━━━━━━━━━━━━━━━━━━━━━━━━━
7C80B6F1 >  8BFF            mov edi,edi                   //我们查找到了这里
7C80B6F3    55              push ebp                      //在函数尾下断吧
7C80B6F4    8BEC            mov ebp,esp
7C80B6F6    837D 08 00      cmp dword ptr ss:[ebp+0x8],0x0
7C80B6FA    74 18           je short kernel32.7C80B714
7C80B6FC    FF75 08         push dword ptr ss:[ebp+0x8]
7C80B6FF    E8 C0290000     call kernel32.7C80E0C4
7C80B704    85C0            test eax,eax
7C80B706    74 08           je short kernel32.7C80B710
7C80B708    FF70 04         push dword ptr ds:[eax+0x4]
7C80B70B    E8 7D2D0000     call kernel32.GetModuleHandleW
7C80B710    5D              pop ebp
7C80B711    C2 0400         retn 0x4                       //在这里F2下断
7C80B714    64:A1 18000000  mov eax,dword ptr fs:[0x18]        //shift+f9运行
7C80B71A    8B40 30         mov eax,dword ptr ds:[eax+0x30]    //注意堆栈和寄存器
7C80B71D    8B40 08         mov eax,dword ptr ds:[eax+0x8]     //我们需要找返回时机
7C80B720  ^ EB EE           jmp short kernel32.7C80B710
━━━━━━━━━━━━━━━━━━━━━━━━━━
0012DB80   0090DFE8  返回到 SparkNot.0090DFE8 来自 SparkNot.009129D2
0012DB84   00000000                                                    //当堆栈窗口这样显示时就是我们的返回时机啦
0012DB88   0000020B                                                    //此时可以在上面的返回到右键跟随过去也可以ait+f9
0012DB8C   00903100  SparkNot.00903100
0012DB90   7C800000  kernel32.7C800000
0012DB94   7C80262C  kernel32.7C80262C
0012DB98   00911264  ASCII "IsDebuggerPresent"
0012DB9C   0090C7E9  返回到 SparkNot.0090C7E9 来自 SparkNot.00908D62
0012DBA0   7C8074C7  ASCII "IsDebuggerPresent"
0012DBA4   00911264  ASCII "IsDebuggerPresent"
━━━━━━━━━━━━━━━━━━━━━━━━━━
0090DFE8    50              push eax                            //返回到了这里,我们看看程序是否解码
0090DFE9    E8 C7B1FFFF     call SparkNot.009091B5              //ait+e双击程序进程
0090DFEE    E8 CBA3FFFF     call SparkNot.009083BE
0090DFF3    8BF0            mov esi,eax
0090DFF5    81EE 00010000   sub esi,0x100
0090DFFB    E8 DFABFFFF     call SparkNot.00908BDF
0090E000    8BF8            mov edi,eax
0090E002    8D4424 08       lea eax,dword ptr ss:[esp+0x8]
0090E006    50              push eax
0090E007    E8 E0B2FFFF     call SparkNot.009092EC
━━━━━━━━━━━━━━━━━━━━━━━━━━
007BD000    3243 6C         xor al,byte ptr ds:[ebx+0x6C]               //双击进来后
007BD003    6963 6B 0952657>imul esp,dword ptr ds:[ebx+0x6B],0x73655>    //倒程序代码乱的
007BD00A    48              dec eax                                      //我们来看看我们的基址是多少
007BD00B    61              popad
007BD00C    6E              outs dx,byte ptr es:[edi]
007BD00D    64:6C           ins byte ptr es:[edi],dx
007BD00F    65:0200         add al,byte ptr gs:[eax]
007BD012    0000            add byte ptr ds:[eax],al
007BD014    0000            add byte ptr ds:[eax],al
━━━━━━━━━━━━━━━━━━━━━━━━━━
Memory map, 条目 19                    //我们程序的基址是00400000
 地址=00400000                         //而我们上面对应的地址却是00700000的地址
 大小=00001000 (4096.)                 //看来我们是跑进父进程的代码啦
 属主=SparkNot 00400000 (自身)         //Ctrl+g查找00401000看看
 区段=
 包含=PE 文件头
 类型=Imag 01001002
 访问=R
 初始访问=RWE
━━━━━━━━━━━━━━━━━━━━━━━━━━ 
00401000    04 10           add al,0x10                //DELPHI的特征之一
00401002    40              inc eax                    //一般DELPHI在00401000处显示的都是这样几句
00401003    0003            add byte ptr ds:[ebx],al   //现在到了程序本身的代码啦,现在就差找OEP啦
00401005    07              pop es                     //现在我就来说说我对DELPHI特征的一点定义吧
00401006    42              inc edx                    //右键查找ASCII码
00401007    6F              outs dx,dword ptr es:[edi]  //把滚动条一直向下拉,拉到最底部
00401008    6F              outs dx,dword ptr es:[edi]   //通常我们DELPHI的程序就会有标题在那里显示
00401009    6C              ins byte ptr es:[edi],dx     //当然是指OEP没有被抽也没有被VM的情况下
0040100A    65:61           popad                        //具体的请看下图
0040100C    6E              outs dx,byte ptr es:[edi]
━━━━━━━━━━━━━━━━━━━━━━━━━━
005D95FE    BA D8965D00     mov edx,SparkNot.005D96D8                ; 星火记事本       //双击后来到这里
005D9603    E8 F483ECFF     call SparkNot.004A19FC                                      //现在我们找段首吧
005D9608    8B0D 6CDF5D00   mov ecx,dword ptr ds:[0x5DDF6C]          ; SparkNot.005DFC20  //段首就是我们的OEP啦
005D960E    8B09            mov ecx,dword ptr ds:[ecx]
005D9610    B2 01           mov dl,0x1
005D9612    A1 54ED5900     mov eax,dword ptr ds:[0x59ED54]          ; prH
005D9617    E8 C40EECFF     call SparkNot.0049A4E0
005D961C    8B15 80D95D00   mov edx,dword ptr ds:[0x5DD980]          ; SparkNot.005F85E8
005D9622    8902            mov dword ptr ds:[edx],eax
005D9624    A1 80D95D00     mov eax,dword ptr ds:[0x5DD980]
━━━━━━━━━━━━━━━━━━━━━━━━━━
005D9564    55              push ebp                    //OEP地址
005D9565    8BEC            mov ebp,esp                 //我们新建一下EIP,然后脱壳
005D9567    83C4 EC         add esp,-0x14               //Ctrl+b查找FF25随便找个IAT调用看看我们的IAT指针
005D956A    53              push ebx
005D956B    56              push esi
005D956C    33C0            xor eax,eax
005D956E    8945 EC         mov dword ptr ss:[ebp-0x14],eax
005D9571    B8 848E5D00     mov eax,SparkNot.005D8E84
005D9576    E8 99D9E2FF     call SparkNot.00406F14
━━━━━━━━━━━━━━━━━━━━━━━━━━
004012CC  - FF25 08F35F00   jmp dword ptr ds:[0x5FF308]       //右键数据窗口跟随看看我们的IAT被加密成什么形式啦
004012D2    8BC0            mov eax,eax
004012D4  - FF25 04F35F00   jmp dword ptr ds:[0x5FF304]
004012DA    8BC0            mov eax,eax
004012DC  - FF25 00F35F00   jmp dword ptr ds:[0x5FF300]
004012E2    8BC0            mov eax,eax
004012E4  - FF25 FCF25F00   jmp dword ptr ds:[0x5FF2FC]
004012EA    8BC0            mov eax,eax
004012EC  - FF25 F8F25F00   jmp dword ptr ds:[0x5FF2F8]
━━━━━━━━━━━━━━━━━━━━━━━━━━
005FF308  001116FA                //我们的指针全部被加密啦,没有一个好的
005FF30C  001116C8                //现在我们记录下OEP然后记录第一个被加密指针的地址
005FF310  00000000                //从载程序后寻找我们的IAT指针吧
005FF314  001117E2
005FF318  00111734
005FF31C  00111702
005FF320  00111750
005FF324  00000000

OEP:005D9564                      //得到这三句之后就好办啦
IAT起始:005FF258  001113AE         //从载程序
IAT结束:005FFBB8  0016BC76
━━━━━━━━━━━━━━━━━━━━━━━━━━
00903000 >  55              push ebp               //od从新载入程序
00903001    8BEC            mov ebp,esp            //现在我们在数据窗口找到005FF258下硬件写入
00903003    6A FF           push -0x1              //Ctrl+g查找CreateFileA,F2在函数末尾下断免检测
00903005    68 1D321305     push 0x513321D
0090300A    68 88888808     push 0x8888888
0090300F    64:A1 00000000  mov eax,dword ptr fs:[0]
00903015    50              push eax
00903016    64:8925 0000000>mov dword ptr fs:[0],esp
0090301D    58              pop eax
0090301E    64:A3 00000000  mov dword ptr fs:[0],eax
━━━━━━━━━━━━━━━━━━━━━━━━━━
0090F593    837C24 1C 0C    cmp dword ptr ss:[esp+0x1C],0xC        //下面就不分析具体为什么跳过上面有讲啦
0090F598    73 76           jnb short SparkNot.0090F610            //修改标志位跳过
0090F59A    E8 F7FDFFFF     call SparkNot.0090F396
0090F59F    894424 10       mov dword ptr ss:[esp+0x10],eax
━━━━━━━━━━━━━━━━━━━━━━━━━━
0090F648    897C24 20       mov dword ptr ss:[esp+0x20],edi
0090F64C    76 08           jbe short SparkNot.0090F656          //修改标志位跳过
0090F64E    83FB 05         cmp ebx,0x5
0090F651    74 7E           je short SparkNot.0090F6D1
━━━━━━━━━━━━━━━━━━━━━━━━━━
0090F70E    5F              pop edi            //我们Ctrl+g查找GetModuleHandleA,F2在函数末尾下断免检测
0090F70F    5E              pop esi
0090F710    5D              pop ebp
0090F711    B8 08000000     mov eax,0x8
0090F716    5B              pop ebx
0090F717    81C4 48010000   add esp,0x148
0090F71D    C3              retn
━━━━━━━━━━━━━━━━━━━━━━━━━━
005FF258  001113AE         //程序在我们下段后第12次运行,写入第一个加密指针
005FF25C  00000000         //现在反回回去看看吧
005FF260  00000000        
005FF264  00000000
005FF268  00000000
005FF26C  00000000
━━━━━━━━━━━━━━━━━━━━━━━━━━
这里通过下面这样的语句进程为程序指针完成加密操作
但是这里并未出现了任何我们程序的指针部分
所以我们可以在看看,程序是通过几句比较来判断指针属于那一个模块
008FAD17    8917            mov dword ptr ds:[edi],edx
━━━━━━━━━━━━━━━━━━━━━━━━━━
008FAE57    2B7C24 30       sub edi,dword ptr ss:[esp+0x30]          ; SparkNot.00401000
008FAE5B    8B5424 34       mov edx,dword ptr ss:[esp+0x34]           //在这里时我们出现了代码段地址
008FAE5F    893A            mov dword ptr ds:[edx],edi           //我们在继续像后面走走看看我们的程序流程
008FAE61    F7D8            neg eax                          //继续从新载入程序
008FAE63    83C4 0C         add esp,0xC               //同时我们在硬件断点窗口点跟随我们下的断点,或者直接数据窗口中查找
━━━━━━━━━━━━━━━━━━━━━━━━━━
005FF258  7C9313B1  ntdll.RtlDeleteCriticalSection           //又运行十几次之后发现我们的指针居然出现解密啦
005FF25C  001113C6                                           //此时我们的程序
005FF260  0011131E                                           //此时我们可以判断得出我们前面加密的地址在后面还会解密
005FF264  00111436                                           //此时正是处理指针的大好时机
005FF268  00111452
005FF26C  00111420
005FF270  00111470
005FF274  0011147C
━━━━━━━━━━━━━━━━━━━━━━━━━━
009105E7   /EB 1E           jmp short SparkNot.00910607          //此时我们程序到停在了这里
009105E9   |8B5424 10       mov edx,dword ptr ss:[esp+0x10]      //我们从新载入程序
009105ED   |57              push edi
009105EE   |52              push edx
009105EF   |E8 94C1FFFF     call SparkNot.0090C788
009105F4   |8906            mov dword ptr ds:[esi],eax
━━━━━━━━━━━━━━━━━━━━━━━━━━
00903000 >  55              push ebp                      //又一次从新载入程序
00903001    8BEC            mov ebp,esp                   //继续吧上面的步骤
00903003    6A FF           push -0x1                     //同样是先解决分离的进程然后下段继续
00903005    68 1D321305     push 0x513321D                //我就不多做介绍,直接到处理指针处
0090300A    68 88888808     push 0x8888888
0090300F    64:A1 00000000  mov eax,dword ptr fs:[0]
━━━━━━━━━━━━━━━━━━━━━━━━━━
0090BA33    8B4424 14       mov eax,dword ptr ss:[esp+0x14]      //这里时我们指针开始执行写入
0090BA37    40              inc eax                              //在执行几步会发现我们的第一个指针开始写入
0090BA38    0FBFE8          movsx ebp,ax
0090BA3B    894424 14       mov dword ptr ss:[esp+0x14],eax
0090BA3F    8B4424 28       mov eax,dword ptr ss:[esp+0x28]
0090BA43    3BE8            cmp ebp,eax
0090BA45  ^ 0F8C 53FFFFFF   jl SparkNot.0090B99E
━━━━━━━━━━━━━━━━━━━━━━━━━━
直接下着写入段点后发现指针目前只加密了一部分,这里我们就先锁定加密的那一部分
---------------------------------------------------------省略一部分指针
005FF30C  7C809B97  kernel32.CloseHandle
005FF310  00000000                      //这下可以清晰看见我们指针加密的是那一部分啦
005FF314  00154A14                      //此时把写入段点改为下005FF30C处,因为那里是最后一个未加密指针
005FF318  00154A4C                      //这样我们就可以快速定位到我们加密指针的地址
005FF31C  0090EAB3  SparkNot.0090EAB3       //继续从新载入程序现在完成我们脱壳的整个步骤
005FF320  00154A84
005FF324  00000000
005FF328  77DA7ABB  advapi32.RegQueryValueExA
005FF32C  77DA7852  advapi32.RegOpenKeyExA
005FF330  77DA6C27  advapi32.RegCloseKey
005FF334  00000000
005FF338  770F4880  oleaut32.SysFreeString
005FF33C  77124505  oleaut32.SysReAllocStringLen
005FF340  770F4BA7  oleaut32.SysAllocStringLen
005FF344  00000000
005FF348  7C809C15  kernel32.TlsSetValue
005FF34C  7C809790  kernel32.TlsGetValue
005FF350  7C8099DD  kernel32.LocalAlloc
005FF354  7C80B6F1  kernel32.GetModuleHandleA
005FF358  00000000
---------------------------------------------------------省略一部分指针
005FF6C0  00000000
005FF6C4  00154ABC
005FF6C8  00154AF4
005FF6CC  00154B2C
005FF6D0  00154B64
005FF6D4  00154B9C
005FF6D8  00154BD4
---------------------------------------------------------省略一部分指针
━━━━━━━━━━━━━━━━━━━━━━━━━━
0090CB85   /74 0A           je short SparkNot.0090CB91       //这里需要修改成JMP跳过效验
0090CB87   |E8 43B8FFFF     call SparkNot.009083CF
0090CB8C   |E8 DEFBFFFF     call SparkNot.0090C76F
0090CB91   \B8 01000000     mov eax,0x1
0090CB96    83C4 68         add esp,0x68
━━━━━━━━━━━━━━━━━━━━━━━━━━
00910352    8B4424 34       mov eax,dword ptr ss:[esp+0x34]
00910356    85C0            test eax,eax
00910358    0F84 36020000   je SparkNot.00910594              //这句JE就是判断是否加密我们的指针,如果加密则跳转不实现  
0091035E    68 56DC4000     push SparkNot.0040DC56            //修改上面的JE为JMP就可以达到我们想到的目的啦
00910363    E8 3D80FFFF     call SparkNot.009083A5            //但是获取IAT后发现程序还特殊处理了一个指针
00910368    50              push eax
00910369    57              push edi
━━━━━━━━━━━━━━━━━━━━━━━━━━
005FF314  77D311CB  user32.GetKeyboardType
005FF318  77D20FC8  user32.LoadStringA                  //我们对特殊的加密指针地址下硬件写入断点
005FF31C  0090EAB3  SparkNot.0090EAB3                  //根据判断应该是USER32模块里的指针
005FF320  77D20F70  user32.CharNextA                   //好我们从新来一次,这次我只负责找出这个指针加密,完成我们的脱壳
━━━━━━━━━━━━━━━━━━━━━━━━━━
00910358   /0F84 36020000   je SparkNot.00910594         //先把我们的加密指针的跳转给处理啦
0091035E   |68 56DC4000     push SparkNot.0040DC56       //然后在单步跟我们的特殊处理的指针
00910363   |E8 3D80FFFF     call SparkNot.009083A5
00910368   |50              push eax
00910369   |57              push edi
0091036A   |E8 F389FFFF     call SparkNot.00908D62
━━━━━━━━━━━━━━━━━━━━━━━━━━
0091059E    50              push eax                       //在这里时我们发现我们的指针的ASCII码出现
0091059F    57              push edi                       //我们可以看见信息窗口MessageBoxA
009105A0    E8 BD87FFFF     call SparkNot.00908D62
009105A5    85C0            test eax,eax
009105A7    75 0E           jnz short SparkNot.009105B7
━━━━━━━━━━━━━━━━━━━━━━━━━━
eax=0090FC4A (SparkNot.0090FC4A), ASCII "MessageBoxA"       //信息窗口显示如下
━━━━━━━━━━━━━━━━━━━━━━━━━━
009105A7   /75 0E           jnz short SparkNot.009105B7     //这里修改JMP跳过加密
009105A9   |68 B3CA4000     push SparkNot.0040CAB3          //修改后我们特殊处理的指针出现MessageBoxA
009105AE   |E8 F27DFFFF     call SparkNot.009083A5          //继续shift+f9把程序运行起来
009105B3   |8906            mov dword ptr ds:[esi],eax
009105B5   |EB 50           jmp short SparkNot.00910607
━━━━━━━━━━━━━━━━━━━━━━━━━━
此时填上我们事先第一次找来的OEP地址自动查找即可完成我们的脱壳
OEP:005D9564-程序基址00400000=1d9564
脱壳时发现我们的程序还有三个无效指针,不管他直接给剪掉即可
运行程序发现我们的程序有效验,载入我们脱壳后的程序
既然有效验,我们就逐一排除效验
首先肯定是排除文件名效验,因为简单又方便,把原程序文件名修改一下,原程序文件名改动就出现了效验
好我们把我们脱壳后的文件名改成程序原文件的文件名
试了下功能,发现点关于时程序会出现错误,点退出时程序也会出现错误
现在我们来解决这两处错误吧,用到DELPHI按钮事件
脚本如下:
var DelphiAddr
mov DelphiAddr,401000
Delphiloop:
find DelphiAddr,#740E8BD38B83????????FF93????????#
cmp $RESULT,0
je Exit
add $RESULT,0A
bp $RESULT
add $RESULT,1
mov DelphiAddr,$RESULT
jmp Delphiloop
Exit:
eval "按钮事件断点设置完毕!"
msg $RESULT
ret
━━━━━━━━━━━━━━━━━━━━━━━━━━
005B6E80    55              push ebp  //退出在下面就发生错误,既然是退出就好办多啦
005B6E81    8BEC            mov ebp,esp     //直接让EAX为0然后把跳转指向ExitProcess
005B6E83    83C4 F0         add esp,-0x10   //修改如下
修改后:
005B6E80   .  B8 00000000   mov eax,0x0
005B6E85   .^ E9 63D9E4FF   jmp SparkNot.004047ED
━━━━━━━━━━━━━━━━━━━━━━━━━━
0058F9B4    55              push ebp               //这里调用错误,我们直接把段首给RETN掉
0058F9B5    8BEC            mov ebp,esp            //修改如下
0058F9B7    83C4 C0         add esp,-0x40
0058F9BA    53              push ebx
0058F9BB    33D2            xor edx,edx
0058F9BD    8955 C0         mov dword ptr ss:[ebp-0x40],edx
修改后:
0058F9B4    C3              retn
━━━━━━━━━━━━━━━━━━━━━━━━━━
脱壳后程序
http://www.dbank.com/download.action?t=40&k=MzI0MjY3Nzc=&pcode=LCw4OTkyMTksODk5MjE5&rnd=4