小马甲 发表于 2010-3-19 17:28

加密狗破解 之 SoftDog脱壳

搞一个试炼品,插上狗狗,开OD,OK,我们继续往下看吧,


载入后,OEP处是这样的
00468FAC > $60            pushad
00468FAD   $55            push    ebp
00468FAE   .8BEC          mov   ebp, esp
00468FB0   .81EC 54030000 sub   esp, 354
00468FB6   .53            push    ebx
00468FB7   .56            push    esi
00468FB8   .57            push    edi
00468FB9   .C685 F4FEFFFF>mov   byte ptr , 0
00468FC0   .C685 F5FEFFFF>mov   byte ptr , 0
00468FC7   .C685 F6FEFFFF>mov   byte ptr , 0
00468FCE   .C685 F7FEFFFF>mov   byte ptr , 0
00468FD5   .8DBD F8FEFFFF lea   edi, dword ptr
00468FDB   .33C0          xor   eax, eax
00468FDD   .B9 3F000000   mov   ecx, 3F
00468FE2   .F3:AB         rep   stos dword ptr es:
00468FE4   .C685 A4FDFFFF>mov   byte ptr , 0
00468FEB   .C685 A5FDFFFF>mov   byte ptr , 0
00468FF2   .C685 A6FDFFFF>mov   byte ptr , 0
00468FF9   .C685 A7FDFFFF>mov   byte ptr , 0
00469000   .8DBD A8FDFFFF lea   edi, dword ptr

PEiD标志

signature = 60 55 8B EC 81 EC ?? ?? ?? ?? 53 56 57 C6 85 F4 FE FF FF 00 C6 85 F5 FE FF FF 00 C6 85 F6 FE FF FF 00 C6 85 F7 FE FF FF 00 8D BD F8 FE FF FF 33 C0 B9 3F 00 00 00 F3 AB C6 85 A4 FD FF FF 00 C6 85 A5 FD FF FF 00 C6 85 A6 FD FF FF 00 C6 85 A7 FD FF FF 00 8D BD A8 FD FF FF 33 C0 B9 3F 00 00 00 F3 AB
ep_only = true


第一层壳子,esp之

0046924D   >-/FF25 08A14600         jmp   dword ptr                ;05MAC.00455D3F

单步走一回,来到这里

00455D3F    55                      push    ebp
00455D40    8BEC                  mov   ebp, esp
00455D42    81EC EC020000         sub   esp, 2EC
00455D48    53                      push    ebx
00455D49    56                      push    esi
00455D4A    57                      push    edi
00455D4B    56                      push    esi
00455D4C    57                      push    edi
00455D4D    52                      push    edx
00455D4E    51                      push    ecx
00455D4F    53                      push    ebx
00455D50    50                      push    eax
00455D51    833D 402B4600 00      cmp   dword ptr , 0
00455D58    0F85 8B150000         jnz   004572E9
00455D5E    C685 C0FEFFFF 49      mov   byte ptr , 49
00455D65    C685 C1FEFFFF 73      mov   byte ptr , 73
00455D6C    C685 C2FEFFFF 44      mov   byte ptr , 44
00455D73    C685 CAFEFFFF 50      mov   byte ptr , 50
00455D7A    C685 CBFEFFFF 72      mov   byte ptr , 72
00455D81    C685 CCFEFFFF 65      mov   byte ptr , 65
00455D88    C685 CDFEFFFF 73      mov   byte ptr , 73
00455D8F    C685 CEFEFFFF 65      mov   byte ptr , 65
00455D96    A1 582B4600             mov   eax, dword ptr
00455D9B    8985 D4FEFFFF         mov   dword ptr , eax
00455DA1    A1 682B4600             mov   eax, dword ptr
00455DA6    8985 A4FEFFFF         mov   dword ptr , eax
00455DAC    C785 80FEFFFF 00000000mov   dword ptr , 0


如果有狗的话,可以插上加密狗,直接esp之,没有的话,需要patch一下,今天不讲,日后在说!:)


我有狗,再esp之,走一步,就是OEP了,到了OEP之后,可以发现,输入表调用被处理了,他修改了
jmp dword ptr    
call dword ptr    这两种的调用

变成了

nop
jmp xxxxxxxx

nop
call xxxxxxxx

这个样子,我不会在壳解码的时候patch,所以只能写脚本,由于刚刚分析,而且最近一直忙着找工作,所以没有时间写脚本了,我讲一个大概的思路,有条件有兴趣的同学可以自己去写这个脚本。


随便找一个调用的地方, 先找jmp api的地方,我们跟入,慢慢的走啊走啊走,走到如下位置的时候,就出现了API地址了


004553DA    BB E8030000             mov   ebx, 3E8
004553DF    2BD2                  sub   edx, edx
004553E1    F7F3                  div   ebx
004553E3    3BC8                  cmp   ecx, eax
004553E5    76 13                   jbe   short 004553FA
004553E7    8B45 DC               mov   eax, dword ptr
004553EA    8945 04               mov   dword ptr , eax
004553ED    5F                      pop   edi
004553EE    5E                      pop   esi
004553EF    5A                      pop   edx
004553F0    59                      pop   ecx
004553F1    5B                      pop   ebx
004553F2    58                      pop   eax
004553F3    C9                      leave
004553F4    C3                      retn                              //到这里的时候, dword ptr 就是要跳转到的api地址, esp+4是返回调用的地址


二进制搜索特征码
BB E8 03 00 00 2B D2 F7 F3 3B C8 76 13 8B 45 DC 89 45 04 5F 5E 5A 59 5B 58 C9 C3

这个数据是固定的,根据我研究发现 call 和jmp 调用都是要到这里的,所以修复的思路也就出来了。   我们先定义代码段的 开始和结束 地址,然后 搜索特征码,比如 jmp 这种的可以搜索90 EB ?? ?? ?? 00call的可以搜索 90 e8 ?? ?? ?? 00 ,这个样子,具体问题具体分析,搜索到特征码后,修改eip到jmp或者call的地方,在 retn 那里下断点,run,然后根据esp指向的api数据对搜索到的地方进行修改,脚本跑完后,再用uif工具修复一下,然后dump+fix iat 就 O 啦, 重定位表没加密,dll脱壳后改一下基址为OD里看到的就OK了。



好了,教程到此结束,谢谢收看!


ps:其实他原来的输入表根本没擦除,所以,如果把代码修复后,直接dump,然后改一下输入表段,就直接能用了,嘿嘿!点到为止,下面的不讲不讲~~~

dxshen 发表于 2010-3-19 17:58

看不懂,不过还是顶一下。

秋风夜雪 发表于 2010-3-21 14:48

飞过!!

半瓶水 发表于 2010-3-21 21:15

有时间再慢慢学习,现在帮你顶。

fywy 发表于 2010-3-22 09:28

不明白!!!!

zjj 发表于 2010-4-30 17:58

保留很多呵!

zjh1968 发表于 2010-4-30 18:03

看不懂,慢慢学

shzlk999 发表于 2010-5-20 15:30

感觉教的很笼统……

babyinsun 发表于 2010-7-9 15:52

笼统了些. 无法真正用于实战.

ymcoming 发表于 2010-7-9 22:05

虽然不能实战,因为我们也没狗呀,学习一下思路还是可以的,感谢
页: [1] 2 3
查看完整版本: 加密狗破解 之 SoftDog脱壳