首页
社区
课程
招聘
[原创]手脱PECompact 2.x+IAT修复的简单方法
发表于: 2011-7-29 01:55 13211

[原创]手脱PECompact 2.x+IAT修复的简单方法

2011-7-29 01:55
13211
【目标程序】:MU私服客户端Season6.2 main.exe主程序
【外壳】PECompact2.x
【脱壳工具】PEID0.95、OD、 LordPE、 ImportREC
【作者】本人
【脱壳修复】这个壳属于比较简单的壳,那么我们也来简单地脱下!
1.查壳 
      用Peid0.95查壳,显示PECompact 2.x,经确认无误。
2.脱壳
     OD载入main.exe主程序,停在这里:
00401000 >  B8 60B42F09     mov     eax, 092FB460
00401005    50              push    eax
00401006    64:FF35 0000000>push    dword ptr fs:[0]
0040100D    64:8925 0000000>mov     dword ptr fs:[0], esp
00401014    33C0            xor     eax, eax
00401016    8908            mov     dword ptr [eax], ecx
00401018    50              push    eax
00401019    45              inc     ebp
0040101A    43              inc     ebx
0040101B    6F              outs    dx, dword ptr es:[edi]
0040101C    6D              ins     dword ptr es:[edi], dx
0040101D    70 61           jo      short 00401080
0040101F    637432 00       arpl    word ptr [edx+esi], si
00401023    5F              pop     edi
00401024    46              inc     esi
00401025    5F              pop     edi
00401026    9B              wait
下断 bp VirtualAlloc,中断两次,停在这里
753479FF >  8BFF            mov     edi, edi
75347A01    55              push    ebp
75347A02    8BEC            mov     ebp, esp
75347A04    FF75 14         push    dword ptr [ebp+14]
75347A07    FF75 10         push    dword ptr [ebp+10]
75347A0A    FF75 0C         push    dword ptr [ebp+C]
75347A0D    FF75 08         push    dword ptr [ebp+8]
75347A10    6A FF           push    -1
75347A12    E8 A1FFFFFF     call    VirtualAllocEx
75347A17    5D              pop     ebp
75347A18    C2 1000         retn    10
取消断点,Ctrl+F9,执行到返回,停在这里
00020AC4    8985 272F0010   mov     dword ptr [ebp+10002F27], eax
00020ACA    56              push    esi
00020ACB    E8 F6030000     call    00020EC6
00020AD0    8D8D BD2D0010   lea     ecx, dword ptr [ebp+10002DBD]
00020AD6    85C0            test    eax, eax
00020AD8    0F85 94000000   jnz     00020B72
00020ADE    56              push    esi
00020ADF    E8 40030000     call    00020E24
00020AE4    56              push    esi
00020AE5    E8 55020000     call    00020D3F
00020AEA    90              nop
00020AEB    90              nop
00020AEC    90              nop
00020AED    90              nop
00020AEE    90              nop
00020AEF    90              nop
00020AF0    90              nop
00020AF1    90              nop
00020AF2    90              nop
00020AF3    90              nop
00020AF4    90              nop
00020AF5    90              nop
00020AF6    90              nop
00020AF7    90              nop
00020AF8    8B4E 34         mov     ecx, dword ptr [esi+34]
00020AFB    85C9            test    ecx, ecx
00020AFD    0F84 89000000   je      00020B8C
00020B03    034E 08         add     ecx, dword ptr [esi+8]
00020B06    51              push    ecx
00020B07    56              push    esi
00020B08    E8 47060000     call    00021154
在00020AF8处F2下断,F9运行到这里,然后F8单步(看下面提示,两种修改方法)
00020AF8    8B4E 34         mov     ecx, dword ptr [esi+34]          ; main.08EF6000
00020AFB    85C9            test    ecx, ecx(1.将这里的ECX寄存器置0)
00020AFD    0F84 89000000   je      00020B8C(或者2.将这里改为JMP或JNZ或置标志位 Z为1)
00020B03    034E 08         add     ecx, dword ptr [esi+8]
00020B06    51              push    ecx
00020B07    56              push    esi
00020B08    E8 47060000     call    00021154
单步到这里
00020B8C    8B7B 08         mov     edi, dword ptr [ebx+8]
00020B8F    8BDE            mov     ebx, esi
00020B91    837B 48 01      cmp     dword ptr [ebx+48], 1
00020B95    75 15           jnz     short 00020BAC
00020B97    8B43 0C         mov     eax, dword ptr [ebx+C]
00020B9A    8B4B 40         mov     ecx, dword ptr [ebx+40]
00020B9D    8BF1            mov     esi, ecx
00020B9F    03F7            add     esi, edi
00020BA1    C606 E9         mov     byte ptr [esi], 0E9
00020BA4    83C1 05         add     ecx, 5
00020BA7    2BC1            sub     eax, ecx
00020BA9    8946 01         mov     dword ptr [esi+1], eax
00020BAC    8BF3            mov     esi, ebx
下断bp VirtualFree,F9运行,停在这里
75347A74 >  8BFF            mov     edi, edi                         ; main.00400000
75347A76    55              push    ebp
75347A77    8BEC            mov     ebp, esp
75347A79    FF75 10         push    dword ptr [ebp+10]
75347A7C    FF75 0C         push    dword ptr [ebp+C]
75347A7F    FF75 08         push    dword ptr [ebp+8]
75347A82    6A FF           push    -1
75347A84    E8 A3FFFFFF     call    VirtualFreeEx
75347A89    5D              pop     ebp
75347A8A    C2 0C00         retn    0C
取消断点,Ctrl+F9,执行到返回,到这里
00020BDF    8B46 0C         mov     eax, dword ptr [esi+C]           ; main.004ED9E6
00020BE2    03C7            add     eax, edi
00020BE4    5D              pop     ebp
00020BE5    5E              pop     esi
00020BE6    5F              pop     edi
00020BE7    5B              pop     ebx
00020BE8    C3              retn
F8单步,曙光就要出现,一直到这里
092FB518    FF11            call    dword ptr [ecx]
092FB51A    8BC6            mov     eax, esi
092FB51C    5A              pop     edx                              ; main.<模块入口点>
092FB51D    5E              pop     esi
092FB51E    5F              pop     edi
092FB51F    59              pop     ecx
092FB520    5B              pop     ebx
092FB521    5D              pop     ebp
092FB522    FFE0            jmp     eax(这里跳到OEP)
那么,就跳到OEP去吧
008ED9E6    55              push    ebp
008ED9E7    8BEC            mov     ebp, esp
008ED9E9    6A FF           push    -1
008ED9EB    68 D0DE9200     push    0092DED0
008ED9F0    68 28E58E00     push    008EE528
008ED9F5    64:A1 00000000  mov     eax, dword ptr fs:[0]
008ED9FB    50              push    eax
2.IAT修复。壳脱完了,自然就得修复一下了,不然程序还是个半残疾。
     用ImportREC载入修复,效果如下:

全是否,IAT加密了,只有修复了,搜索了下网上,没有看到合适的修复方法,就自己动手吧!
双击第一个无效函数

此时,先回到OD里,在OEP处下硬件执行断点,然后Ctrl+G到第一个无效的RVA(00525000)处,在数据窗口中硬件访问断点(word),
OD重新载入程序,一直F9到OEP处,看数据窗口:
00925000  760E4620  advapi32.InitializeSecurityDescriptor
00925004  760DDF7E  advapi32.CryptGetHashParam
00925008  76113188  advapi32.CryptDeriveKey
0092500C  76113178  advapi32.CryptDecrypt
00925010  760DDF4E  advapi32.CryptCreateHash
00925014  760DDF36  advapi32.CryptHashData
00925018  761132C8  advapi32.CryptVerifySignatureA
0092501C  760DDF66  advapi32.CryptDestroyHash
00925020  760DCF49  advapi32.RegEnumValueA
00925024  760FA4B4  advapi32.GetUserNameA
00925028  760D91DD  advapi32.CryptAcquireContextA
0092502C  760DC532  advapi32.CryptImportKey
好熟悉的东东吧,用ImportREC修复吧

全为YES了,完美脱壳并修复完毕。
来这里同大家交流一下,不足之处,请批评指正!

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

上传的附件:
收藏
免费 7
支持
分享
最新回复 (10)
雪    币: 243
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
可以下bp VirtualFree断点,断下后查找关键字push 8000,F8几下,就到OEP了
2011-8-3 08:31
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
看不懂啊,功力不行。呵呵
2011-8-5 08:10
0
雪    币: 416
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我是直接用VirtualProtect下斷,返回程式領空,單步沒多久就到了OEP。
2011-8-5 09:42
0
雪    币: 118
活跃值: (106)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
5
bp VirtualFree?为什么可以这么断啊,是不是所有壳都可以这么断啊?
2011-8-26 15:29
0
雪    币: 1534
活跃值: (738)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
6
并不是所有的壳都可以,到达你想的流程点。

可以尝试其他断点,通常脱一些壳花大量的时间做一些很多无用功的断点,多次尝试下某个断点吧。
2011-8-26 17:15
0
雪    币: 217
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
看了半天,OEP到底是多少?
应该是008ED9E6,为什么ImportREC中是004ED9E6??
刚学脱壳,不要笑我。。。
2011-8-29 10:43
0
雪    币: 200
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
很复杂啊。。。。。。。。
2011-10-23 13:17
0
雪    币: 319
活跃值: (49)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
我也新手ing,但能给你解释下OEP(008ED9E6) -  基址(400000)= ImportREC中是004ED9E6
2011-10-31 08:29
0
雪    币: 57
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
等下试下.....
2011-12-2 20:57
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
学习,一定要好好学习
2011-12-17 00:04
0
游客
登录 | 注册 方可回帖
返回
//