A-new 发表于 2018-1-3 12:45

简单DLL脱壳之PECompact壳脱

看到求助区PECompact壳脱不下来这个帖子,就做个小教程吧,网上DLL脱壳的教程也不是很多,正好前一段整理 ExeinfoPE插件的时候也脱了好几个PECompact,这里偶也就再复习一下
长话短说进入正题

[*]找到OEP

载入od
00276794 >B8 7C772700   MOV   EAX, 7C96911B.0027777C
00276799    50            PUSH    EAX
0027679A    64:FF35 0000000>PUSH    DWORD PTR FS:
002767A1    64:8925 0000000>MOV   DWORD PTR FS:, ESP
002767A8    33C0            XOR   EAX, EAX
002767AA    8908            MOV   DWORD PTR DS:, ECX
002767AC    50            PUSH    EAX
002767AD    45            INC   EBP
002767AE    43            INC   EBX


F8两次到0027679A用ESP定律命令窗口 hr esp 然后F9四次到
002777AF    53            PUSH    EBX
002777B0    51            PUSH    ECX
002777B1    57            PUSH    EDI
002777B2    56            PUSH    ESI
002777B3    52            PUSH    EDX
002777B4    8D98 57120010   LEA   EBX, DWORD PTR DS:[EAX+0x1000125>
002777BA    8B53 18         MOV   EDX, DWORD PTR DS:
002777BD    52            PUSH    EDX
002777BE    8BE8            MOV   EBP, EAX
002777C0    6A 40         PUSH    0x40
002777C2    68 00100000   PUSH    0x1000
002777C7    FF73 04         PUSH    DWORD PTR DS:
002777CA    6A 00         PUSH    0x0
002777CC    8B4B 10         MOV   ECX, DWORD PTR DS:
002777CF    03CA            ADD   ECX, EDX
002777D1    8B01            MOV   EAX, DWORD PTR DS:
002777D3    FFD0            CALL    EAX
002777D5    5A            POP   EDX
002777D6    8BF8            MOV   EDI, EAX
002777D8    50            PUSH    EAX
002777D9    52            PUSH    EDX
002777DA    8B33            MOV   ESI, DWORD PTR DS:
002777DC    8B43 20         MOV   EAX, DWORD PTR DS:
002777DF    03C2            ADD   EAX, EDX
002777E1    8B08            MOV   ECX, DWORD PTR DS:
002777E3    894B 20         MOV   DWORD PTR DS:, ECX
002777E6    8B43 1C         MOV   EAX, DWORD PTR DS:
002777E9    03C2            ADD   EAX, EDX
002777EB    8B08            MOV   ECX, DWORD PTR DS:
002777ED    894B 1C         MOV   DWORD PTR DS:, ECX
002777F0    03F2            ADD   ESI, EDX
002777F2    8B4B 0C         MOV   ECX, DWORD PTR DS:
002777F5    03CA            ADD   ECX, EDX
002777F7    8D43 1C         LEA   EAX, DWORD PTR DS:
002777FA    50            PUSH    EAX
002777FB    57            PUSH    EDI
002777FC    56            PUSH    ESI
002777FD    FFD1            CALL    ECX
002777FF    5A            POP   EDX
00277800    58            POP   EAX
00277801    0343 08         ADD   EAX, DWORD PTR DS:
00277804    8BF8            MOV   EDI, EAX
00277806    52            PUSH    EDX
00277807    8BF0            MOV   ESI, EAX
00277809    8B46 FC         MOV   EAX, DWORD PTR DS:
0027780C    83C0 04         ADD   EAX, 0x4
0027780F    2BF0            SUB   ESI, EAX
00277811    8956 08         MOV   DWORD PTR DS:, EDX
00277814    8B4B 0C         MOV   ECX, DWORD PTR DS:
00277817    894E 14         MOV   DWORD PTR DS:, ECX
0027781A    FFD7            CALL    EDI
0027781C    5A            POP   EDX
0027781D    33C9            XOR   ECX, ECX
0027781F    66:3B4E 2A      CMP   CX, WORD PTR DS:
00277823    75 12         JNZ   SHORT 7C96911B.00277837
00277825    8BF0            MOV   ESI, EAX
00277827    68 00800000   PUSH    0x8000
0027782C    51            PUSH    ECX
0027782D    8B4B 14         MOV   ECX, DWORD PTR DS:
00277830    03CA            ADD   ECX, EDX
00277832    57            PUSH    EDI
00277833    FF11            CALL    DWORD PTR DS:
00277835    8BC6            MOV   EAX, ESI
00277837    5A            POP   EDX
00277838    5E            POP   ESI
00277839    5F            POP   EDI
0027783A    59            POP   ECX
0027783B    5B            POP   EBX
0027783C    5D            POP   EBP
0027783D    FFE0            JMP   EAX   


向下拉找到 0027783D FFE0 JMP EAXF2下断点,删除硬件断点,再运行然后单步F8到达OEP
0025D670    55            PUSH    EBP
0025D671    8BEC            MOV   EBP, ESP
0025D673    83C4 C0         ADD   ESP, -0x40
0025D676    B8 9CAC2500   MOV   EAX, 7C96911B.0025AC9C         ; UNICODE "("
0025D67B    E8 70F8FCFF   CALL    7C96911B.0022CEF0
0025D680    A1 506C2600   MOV   EAX, DWORD PTR DS:
0025D685    50            PUSH    EAX
0025D686    E8 39FFFCFF   CALL    7C96911B.0022D5C4
0025D68B    6A 00         PUSH    0x0
0025D68D    6A 00         PUSH    0x0
0025D68F    6A 00         PUSH    0x0
0025D691    68 38AC2500   PUSH    7C96911B.0025AC38
0025D696    6A 00         PUSH    0x0
0025D698    6A 00         PUSH    0x0
0025D69A    E8 1DFFFCFF   CALL    7C96911B.0022D5BC
0025D69F    50            PUSH    EAX
0025D6A0    E8 E7FEFCFF   CALL    7C96911B.0022D58C
0025D6A5    E8 DEABFCFF   CALL    7C96911B.00228288
0025D6AA    8BC0            MOV   EAX, EAX


接着就dump,我用od插件OllyDumpEx
Dump之前记得修正一下Image Base 顺手再点一下Fix Virtual Offfset和Get EIP as OEP

[*]修表

修表也简单说一下吧,和exe不大一样,exe的话直接选对应的进程就好了,dll的话先选od目录下的那个loaddll.exe进程,然后点Pick DLL选中调试的那个dll
然而用ImportREC或者Scylla直接AutoSearch都搜不到任何信息这就要用到修表利器UIF了
我也可以随便找个call进去看看API调用变成什么鬼样子了
002D02BC    B8 0E18F876   MOV   EAX, kernel32.CreateEventW
002D02C1    FFE0            JMP   EAX
002D02C3    B8 6A3BF876   MOV   EAX, kernel32.CompareStringW
002D02C8    FFE0            JMP   EAX
002D02CA    B8 E013F876   MOV   EAX, kernel32.CloseHandle
002D02CF    FFE0            JMP   EAX
002D02D1    B8 FF10F876   MOV   EAX, kernel32.Sleep
002D02D6    FFE0            JMP   EAX


找了几个发现都变成这个样子了也可以手动或者写个脚本自己修复,偶比较懒直接上UIF
填上loaddll的进程ID,代码开始结束就填上调试dll的code段就差不多了,关键是这个NEW IAT VA 这个一定要填一个dll内存范围内的地址,不然后面就麻烦了
接着用ImportREC 填上OEP、RAV、Size,获取输入表修复刚才dump的dll

[*]修复重定位

这个是最后一步,一般DLL都需修复一下,这里用到ReloX,再把此dll加载到不同基址Dump一份,然后用ReloX打开这两份Compare,最后Fix上一步完成修表的dll就好了

[*]总结

PECompact是个压缩壳,载入貌似有点复杂不要怕,绝大多数压缩壳可以用ESP定律搞定的大家记住这一点就好了。
要练手的话也可以用我稍早发布ExeinfoPE插件合集
https://www.52pojie.cn/thread-681775-1-1.html
中的PackUPX.dll这个dll来练练手,这两个要处理的基本差不多

A-new 发表于 2018-1-3 17:54

ReloX,就那几个按钮,没啥可讲的,不行抽空录一下脱壳修复过程好了

轮回v 发表于 2018-6-26 12:14

A-new 发表于 2018-5-2 21:16
是不是有校验,方便的话,发出来让大家都看看
感谢A-new师傅,因为是个外挂所以也没好意思上传。大家分析的话又需要游戏之类的。挺麻烦的,昨天自己找到了解决方法,说一下。。。第一个DLL加载进去,把第二个DLL的入口点改为死循环,注入第二个之后在入口点下断。然后恢复原来的入口点,走到OEP。就不继续运行了再dump下来修复重定位就可以了。。。

我猜是不是因为DLL在完全运行的状态下有些代码会不一样,被错误的识别成了重定位表然后导致了这样的问题。。。{:301_999:}

Hmily 发表于 2018-1-3 14:43

DLL脱壳和exe的最大差别就是处理重定位,A哥可以给大家拓展讲解下ReloX的操作,之前用不好还是找ap哥教我的。

bester 发表于 2018-1-3 18:57

到OEP我比较喜欢用virtualfree,或者virtualalloc,用virtualfree断一次,直接返回到程序领空搜push 8000,ctrl+N 搜下一个,然后F2断下,走出retn,下面就是jmp eax,只是昨天看到那个iat被变形了,所以不会修了

吓死宝宝了 发表于 2018-1-3 19:02

A-new 发表于 2018-1-3 17:54
ReloX,就那几个按钮,没啥可讲的,不行抽空录一下脱壳修复过程好了

大佬讲讲DLL 带启动窗口的怎么脱壳修改吧!

weiwj520 发表于 2018-1-3 20:02

本帖最后由 weiwj520 于 2018-1-3 20:16 编辑

求教下版主,刚入门学习破解,脱壳,。
关于脱壳有个疑问:自从VMP的注册版软件放出来后,一般的(或者说相当多的)软件作者都知道用这个加密,这个对于大多数破解者来说都有太高的难度。请问,我们现在再学习这些难度较低的压缩壳类还有价值吗?

luli1111 发表于 2018-1-4 07:50

A-new 发表于 2018-1-4 11:03

weiwj520 发表于 2018-1-3 20:02
求教下版主,刚入门学习破解,脱壳,。
关于脱壳有个疑问:自从VMP的注册版软件放出来后,一般的(或者说 ...

不从简单的学起,上来就整vmp这类强壳,就会失去学习动力,学什么都要一步一步来,不积跬步无以至千里

weiwj520 发表于 2018-1-4 11:26

A-new 发表于 2018-1-4 11:03
不从简单的学起,上来就整vmp这类强壳,就会失去学习动力,学什么都要一步一步来,不积跬步无以至千里

可是VMP这类强壳,越来越高的版本,似乎只有极少数绝世高手能破解,绝大多数人是无法突破的?

A-new 发表于 2018-1-4 11:52

weiwj520 发表于 2018-1-4 11:26
可是VMP这类强壳,越来越高的版本,似乎只有极少数绝世高手能破解,绝大多数人是无法突破的?

那就多看高手的分析文章,自己整个小程序,自己加壳多练手
页: [1] 2 3
查看完整版本: 简单DLL脱壳之PECompact壳脱