简单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来练练手,这两个要处理的基本差不多
ReloX,就那几个按钮,没啥可讲的,不行抽空录一下脱壳修复过程好了 A-new 发表于 2018-5-2 21:16
是不是有校验,方便的话,发出来让大家都看看
感谢A-new师傅,因为是个外挂所以也没好意思上传。大家分析的话又需要游戏之类的。挺麻烦的,昨天自己找到了解决方法,说一下。。。第一个DLL加载进去,把第二个DLL的入口点改为死循环,注入第二个之后在入口点下断。然后恢复原来的入口点,走到OEP。就不继续运行了再dump下来修复重定位就可以了。。。
我猜是不是因为DLL在完全运行的状态下有些代码会不一样,被错误的识别成了重定位表然后导致了这样的问题。。。{:301_999:} DLL脱壳和exe的最大差别就是处理重定位,A哥可以给大家拓展讲解下ReloX的操作,之前用不好还是找ap哥教我的。 到OEP我比较喜欢用virtualfree,或者virtualalloc,用virtualfree断一次,直接返回到程序领空搜push 8000,ctrl+N 搜下一个,然后F2断下,走出retn,下面就是jmp eax,只是昨天看到那个iat被变形了,所以不会修了 A-new 发表于 2018-1-3 17:54
ReloX,就那几个按钮,没啥可讲的,不行抽空录一下脱壳修复过程好了
大佬讲讲DLL 带启动窗口的怎么脱壳修改吧! 本帖最后由 weiwj520 于 2018-1-3 20:16 编辑
求教下版主,刚入门学习破解,脱壳,。
关于脱壳有个疑问:自从VMP的注册版软件放出来后,一般的(或者说相当多的)软件作者都知道用这个加密,这个对于大多数破解者来说都有太高的难度。请问,我们现在再学习这些难度较低的压缩壳类还有价值吗? weiwj520 发表于 2018-1-3 20:02
求教下版主,刚入门学习破解,脱壳,。
关于脱壳有个疑问:自从VMP的注册版软件放出来后,一般的(或者说 ...
不从简单的学起,上来就整vmp这类强壳,就会失去学习动力,学什么都要一步一步来,不积跬步无以至千里 A-new 发表于 2018-1-4 11:03
不从简单的学起,上来就整vmp这类强壳,就会失去学习动力,学什么都要一步一步来,不积跬步无以至千里
可是VMP这类强壳,越来越高的版本,似乎只有极少数绝世高手能破解,绝大多数人是无法突破的? weiwj520 发表于 2018-1-4 11:26
可是VMP这类强壳,越来越高的版本,似乎只有极少数绝世高手能破解,绝大多数人是无法突破的?
那就多看高手的分析文章,自己整个小程序,自己加壳多练手