这个DLL搞了相当长的时间,找了很多资料
同时也又学习到了很多东西..
软件加的壳应该是 ZP1.6
软件的语言 是 Dehphi 7
壳可以脱 IAT可以修复 我把步骤写下来 大家看哪里有错没有。
但是最后 修复DLL的重定位 我没有一点头绪,
请各位朋友帮助我修复一下,先谢过了。
OD载入..
00B052FA > 68 0653B000 push Dehphi7.00B05306
00B052FF 68 1553B000 push Dehphi7.00B05315
00B05304 C3 retn
00B05305 DF68 15 fild qword ptr ds:[eax+0x15]
00B05308 53 push ebx
00B05309 B0 00 mov al,0x0
00B0530B C3 retn
00B0530C C1DA 50 rcr edx,0x50
00B0530F 22BD A20321B2 and bh,byte ptr ss:[ebp-0x4DDEFC5E]
00B05315 60 pushad
00B05316 68 1D53B000 push Dehphi7.00B0531D
00B0531B C3 retn
00B0531C 5D pop ebp
00B0531D 54 push esp
00B0531E 68 2653B000 push Dehphi7.00B05326
00B05323 C3 retn
下断 BP CreateFileA
F9 断在 7C801A63处
7C801A63 > 8BFF mov edi,edi
7C801A65 55 push ebp
7C801A66 8BEC mov ebp,esp
7C801A68 FF75 08 push dword ptr ss:[ebp+0x8]
7C801A6B E8 B7310200 call kernel32.7C824C27
7C801A70 85C0 test eax,eax
7C801A72 74 1E je short kernel32.7C801A92
7C801A74 FF75 20 push dword ptr ss:[ebp+0x20]
7C801A77 FF75 1C push dword ptr ss:[ebp+0x1C]
7C801A7A FF75 18 push dword ptr ss:[ebp+0x18]
7C801A7D FF75 14 push dword ptr ss:[ebp+0x14]
7C801A80 FF75 10 push dword ptr ss:[ebp+0x10]
7C801A83 FF75 0C push dword ptr ss:[ebp+0xC]
7C801A86 FF70 04 push dword ptr ds:[eax+0x4]
7C801A89 E8 BB2D0200 call kernel32.CreateFileW
7C801A8E 5D pop ebp
7C801A8F C2 1C00 retn 0x1C
7C801A92 83C8 FF or eax,-0x1
7C801A95 ^ EB F7 jmp short kernel32.7C801A8E
再次下断 BP GetModuleHandleA
F9 断在 7C824750
7C824750 > 8BFF mov edi,edi ; Dehphi7.00B0A8A0
7C824752 55 push ebp
7C824753 8BEC mov ebp,esp
7C824755 837D 08 00 cmp dword ptr ss:[ebp+0x8],0x0
7C824759 74 18 je short kernel32.7C824773
7C82475B FF75 08 push dword ptr ss:[ebp+0x8]
7C82475E E8 C4040000 call kernel32.7C824C27
7C824763 85C0 test eax,eax
7C824765 74 08 je short kernel32.7C82476F
7C824767 FF70 04 push dword ptr ds:[eax+0x4]
7C82476A E8 CF090000 call kernel32.GetModuleHandleW
7C82476F 5D pop ebp
7C824770 C2 0400 retn 0x4
7C824773 64:A1 18000000 mov eax,dword ptr fs:[0x18]
7C824779 8B40 30 mov eax,dword ptr ds:[eax+0x30]
7C82477C 8B40 08 mov eax,dword ptr ds:[eax+0x8]
7C82477F ^ EB EE jmp short kernel32.7C82476F
7C824781 90 nop
7C824782 90 nop
此时 Alt+F9 返回
向上看代码 在00EAA8E8处下硬件执行断点
00EAA8E1 53 push ebx
00EAA8E2 33DB xor ebx,ebx
00EAA8E4 3BCB cmp ecx,ebx
00EAA8E6 74 53 je short 00EAA93B
00EAA8E8 3998 AB000000 cmp dword ptr ds:[eax+0xAB],ebx ; 在此处下硬件执行断点
00EAA8EE 8B15 0CA9EB00 mov edx,dword ptr ds:[0xEBA90C] ; Dehphi7.00B07000
00EAA8F4 57 push edi
00EAA8F5 8D3C11 lea edi,dword ptr ds:[ecx+edx]
00EAA8F8 7E 3A jle short 00EAA934
00EAA8FA 56 push esi
00EAA8FB BE E8A7EB00 mov esi,0xEBA7E8 ; ASCII "kernel32.dll"
00EAA900 56 push esi
00EAA901 57 push edi
00EAA902 FF35 D8A7EB00 push dword ptr ds:[0xEBA7D8]
00EAA908 E8 FFE5FFFF call 00EA8F0C
00EAA90D 83C4 0C add esp,0xC
00EAA910 56 push esi
00EAA911 A3 E4A7EB00 mov dword ptr ds:[0xEBA7E4],eax
00EAA916 03F8 add edi,eax
00EAA918 FF15 E810EA00 call dword ptr ds:[0xEA10E8] ; kernel32.GetModuleHandleA
00EAA91E 50 push eax ; kernel32.7C800000
00EAA91F E8 90FDFFFF call 00EAA6B4
00EAA924 A1 F4A8EB00 mov eax,dword ptr ds:[0xEBA8F4]
00EAA929 43 inc ebx
00EAA92A 3B98 AB000000 cmp ebx,dword ptr ds:[eax+0xAB]
取消
BP CreateFileA
BP GetModuleHandleA
断点 (保留刚下的硬件断点)
OD重新载入
00B052FA > 68 0653B000 push Dehphi7.00B05306
00B052FF 68 1553B000 push Dehphi7.00B05315 ; 单步到此处下ESP断点
00B05304 C3 retn
00B05305 DF68 15 fild qword ptr ds:[eax+0x15]
00B05308 53 push ebx
00B05309 B0 00 mov al,0x0
00B0530B C3 retn
00B0530C C1DA 50 rcr edx,0x50
00B0530F 22BD A20321B2 and bh,byte ptr ss:[ebp-0x4DDEFC5E]
00B05315 60 pushad
00B05316 68 1D53B000 push Dehphi7.00B0531D
00B0531B C3 retn
00B0531C 5D pop ebp
F8 一次然后用ESP定律
F9 断在 00EAA8E8处
00EAA8E4 3BCB cmp ecx,ebx
00EAA8E6 74 53 je short 00EAA93B
00EAA8E8 3998 AB000000 cmp dword ptr ds:[eax+0xAB],ebx ; 被断下
00EAA8EE 8B15 0CA9EB00 mov edx,dword ptr ds:[0xEBA90C] ; Dehphi7.00B07000
00EAA8F4 57 push edi
00EAA8F5 8D3C11 lea edi,dword ptr ds:[ecx+edx]
00EAA8F8 7E 3A jle short 00EAA934
00EAA8FA 56 push esi
00EAA8FB BE E8A7EB00 mov esi,0xEBA7E8
00EAA900 56 push esi
00EAA901 57 push edi
此时信息窗口
ebx=00000000
ds:[00E43EFB]=00000006
将 6 改成0 便可去掉ZP的 DLL模拟 关系到后面使用脚本来寻找IAT
如果不去掉这里的DLL模拟 我有试过 用脚本找不到IAT。。。
改成0 之后 继续F9运行
00EBFA8C /E9 913F0000 jmp 00EC3A22
00EBFA91 |94 xchg eax,esp
00EBFA92 |4A dec edx
00EBFA93 |4B dec ebx
00EBFA94 |8BEC mov ebp,esp
再次F9 来到Oep!
00ABC178 55 push ebp
00ABC179 8BEC mov ebp,esp
00ABC17B 83C4 C4 add esp,-0x3C
00ABC17E B8 A8BDAB00 mov eax,Dehphi7.00ABBDA8
00ABC183 E8 14A8EEFF call Dehphi7.009A699C
00ABC188 E8 6381EEFF call Dehphi7.009A42F0
00ABC18D 8D40 00 lea eax,dword ptr ds:[eax]
00ABC190 0000 add byte ptr ds:[eax],al
00ABC192 0000 add byte ptr ds:[eax],al
00ABC194 0000 add byte ptr ds:[eax],al
00ABC196 0000 add byte ptr ds:[eax],al
00ABC198 0000 add byte ptr ds:[eax],al
反汇编窗口 CTRL+B 输入 FF25
找到这里
009A1309 ? 25 2432AC00 and eax,0xAC3224
009A130E 8BC0 mov eax,eax
009A1310 . FF25 2032AC00 jmp dword ptr ds:[0xAC3220] ; Dehphi7.00B038F4
009A1316 8BC0 mov eax,eax
009A1318 . FF25 1C32AC00 jmp dword ptr ds:[0xAC321C] ; Dehphi7.00B04338
009A131E 8BC0 mov eax,eax
009A1320 $ FF25 1832AC00 jmp dword ptr ds:[0xAC3218] ; Dehphi7.00B03D80
009A1326 8BC0 mov eax,eax
009A1328 $ FF25 1432AC00 jmp dword ptr ds:[0xAC3214] ; Dehphi7.00B04044
009A132E 8BC0 mov eax,eax
009A1330 $ FF25 3832AC00 jmp dword ptr ds:[0xAC3238] ; Dehphi7.00B03FA8
009A1336 8BC0 mov eax,eax
009A1338 $ FF25 1032AC00 jmp dword ptr ds:[0xAC3210] ; Dehphi7.00B03858
009A133E 8BC0 mov eax,eax
009A1340 $ FF25 3432AC00 jmp dword ptr ds:[0xAC3234] ; Dehphi7.00B0342C
009A1346 8BC0 mov eax,eax
009A1348 $ FF25 0C32AC00 jmp dword ptr ds:[0xAC320C] ; Dehphi7.00B03780
009A134E 8BC0 mov eax,eax
009A1350 $ FF25 0832AC00 jmp dword ptr ds:[0xAC3208] ; Dehphi7.00B03EDC
009A1356 8BC0 mov eax,eax
009A1358 $ FF25 0432AC00 jmp dword ptr ds:[0xAC3204] ; Dehphi7.00B036CC
任意一个JMP处点右键 数据窗口跟随
00AC318C 00000000
00AC3190 00B033C0 Dehphi7.00B033C0
00AC3194 00B03438 Dehphi7.00B03438
00AC3198 00B033F0 Dehphi7.00B033F0
00AC319C 00B03864 Dehphi7.00B03864
00AC31A0 00B032D0 Dehphi7.00B032D0
00AC31A4 00B04260 Dehphi7.00B04260
................................
................................
................................
................................
................................
................................
00AC38E8 00B042F0 Dehphi7.00B042F0
00AC38EC 00B03B10 Dehphi7.00B03B10
00AC38F0 00B04098 Dehphi7.00B04098
00AC38F4 00B03BAC Dehphi7.00B03BAC
00AC38F8 00B03534 Dehphi7.00B03534
00AC38FC 00B03C3C Dehphi7.00B03C3C
00AC3900 00B0393C Dehphi7.00B0393C
00AC3904 00B044E8 Dehphi7.00B044E8
00AC3908 00000000
00AC390C 00B04584 Dehphi7.00B04584
00AC3910 00000000
00AC3914 00B0315C Dehphi7.00B0315C
00AC3918 00B03B1C Dehphi7.00B03B1C
00AC391C 00000000
00AC3920 00000000
00AC3924 00000000
分别找到了 IAT的起始和结果位置
分别为:
IATSTART: 00AC3190
IAT E N D: 00AC391B
回到反汇编窗口
009A1307 01 db 01
009A1308 $ FF25 2432AC00 jmp dword ptr ds:[0xAC3224] ; Dehphi7.00B03108
009A130E 8BC0 mov eax,eax
009A1310 . FF25 2032AC00 jmp dword ptr ds:[0xAC3220] ; Dehphi7.00B038F4
009A1316 8BC0 mov eax,eax
009A1318 . FF25 1C32AC00 jmp dword ptr ds:[0xAC321C] ; Dehphi7.00B04338
009A131E 8BC0 mov eax,eax
009A1320 $ FF25 1832AC00 jmp dword ptr ds:[0xAC3218] ; 跟随 7.00B03D80
009A1326 8BC0 mov eax,eax
009A1328 $ FF25 1432AC00 jmp dword ptr ds:[0xAC3214] ; Dehphi7.00B04044
009A132E 8BC0 mov eax,eax
00B038F4 68 52289D1F push 0x1F9D2852
00B038F9 E9 FE030000 jmp Dehphi7.00B03CFC ; 跟随
00B038FE C9 leave
00B038FF 73 68 jnb short Dehphi7.00B03969
00B03901 0929 or dword ptr ds:[ecx],ebp
再跟随
00B03CFC - E9 B7733A00 jmp 00EAB0B8 ; 跟随
00B03D01 0900 or dword ptr ds:[eax],eax
00B03D03 00B409 0000682A add byte ptr ds:[ecx+ecx+0x2A680000],dh
00B03D0A 289D 1FE9EAFF sub byte ptr ss:[ebp-0x1516E1],bl
00B03D10 FFFF ??? ; 未知命令
来到这里
00EAB0B8 9C pushfd
00EAB0B9 60 pushad
00EAB0BA FF7424 24 push dword ptr ss:[esp+0x24]
00EAB0BE E8 05ECFFFF call 00EA9CC8 ;这里跟随进去找Path VA
00EAB0C3 61 popad
00EAB0C4 9D popfd
00EAB0C5 C3 retn ; ZERO VA
找到了 ZERO VA
然后在00EAB0BE 处ENTER跟随进去来到
00EA9CC8 A1 F4A8EB00 mov eax,dword ptr ds:[0xEBA8F4]
00EA9CCD 80B8 BB000000 00 cmp byte ptr ds:[eax+0xBB],0x0
00EA9CD4 74 57 je short 00EA9D2D
00EA9CD6 FF15 F010EA00 call dword ptr ds:[0xEA10F0] ; kernel32.GetTickCount
00EA9CDC 8BC8 mov ecx,eax
00EA9CDE 2B0D A0A7EB00 sub ecx,dword ptr ds:[0xEBA7A0]
00EA9CE4 81F9 88130000 cmp ecx,0x1388
00EA9CEA 76 41 jbe short 00EA9D2D
00EA9CEC FF35 A4A7EB00 push dword ptr ds:[0xEBA7A4]
00EA9CF2 A3 A0A7EB00 mov dword ptr ds:[0xEBA7A0],eax
00EA9CF7 FF15 4010EA00 call dword ptr ds:[0xEA1040] ; kernel32.ResumeThread
00EA9CFD 833D 60AFEB00 03 cmp dword ptr ds:[0xEBAF60],0x3 ;EBAF60为pathVA
00EA9D04 7C 08 jl short 00EA9D0E
00EA9D06 6A 00 push 0x0
00EA9D08 FF15 0011EA00 call dword ptr ds:[0xEA1100] ; kernel32.ExitProcess
00EA9D0E 803D ACA7EB00 00 cmp byte ptr ds:[0xEBA7AC],0x0
00EA9D15 74 08 je short 00EA9D1F
00EA9D17 FF05 60AFEB00 inc dword ptr ds:[0xEBAF60]
00EA9D1D EB 07 jmp short 00EA9D26
00EA9D1F 8325 60AFEB00 00 and dword ptr ds:[0xEBAF60],0x0
00EA9CFD处找到了Path VA = EBAF60
现在得到了
IAT START = 00AC3190
IAT END = 00AC391C
ZERO VA = 00EAB0C5
PATH VA = 00EBAF60
回到OEP 开始跑脚本
(这个脚本是其它论坛的一位朋友提供的)
跟椐电老的不同,请改为自已的相应地址
var fi
var fix
var oep
var tmpesp
var IatStrat
var IatEnd
var ZeroVa
var IatRet
//BPHWCALL //清除所有硬件断点
BPHWC //清除所有软断点
mov oep,eip
mov tmpesp,esp
mov IatStrat,00AC3190 //IAT START(改成你的)
mov IatEnd,00AC391C //IAT END(改成你的)
mov ZeroVa,00EBAF60 //zerova(改成你的)
mov IatRet,00EAB0C5 //IAT RET(改成你的)
mov fi,IatStrat
bphws IatRet, "x"
loop:
mov esp,tmpesp
add fi,4
cmp fi, IatEnd
jae exit
mov fix,[fi]
cmp fix,00B00000 //(改成你的)
jae fuck
cmp fix,00000000
je loop
mov eip,fix
esto
sti //F7
mov [fi],eip
jmp loop
fuck:
mov eip,fix
esto
sti //F7
mov [fi],eip
BPHWC fix
mov [ZeroVa],0
jmp loop
fuck2:
mov eip,fix
sti
sti
sti
sti
mov [fi],eip
jmp loop
exit:
BPHWCALL
mov eip,oep
mov esp,tmpesp
MSG "脚本执行完毕"
等待脚本运行完毕,IAT除第一条其它修复成功.
第一个IAT可以在 ImportREC中用等级1修复.
我只做到这一步....
重定位表我不会修复(因为这是个DLL文件)
有可能还需要补区段吧
目前我只能做到这一步
另外前面也不知道哪里有问题没有
有心的朋友帮助我完成它,
因为我在等着用,脱了壳,可以修改BUG。现在没法用。
谢谢各位。
付上下载地址:
http://pan.baidu.com/share/link?shareid=161995&uk=855757154
.........
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)