首页
社区
课程
招聘
[求助]请朋友们帮我修复DLL的重定位
发表于: 2012-12-6 13:21 5811

[求助]请朋友们帮我修复DLL的重定位

2012-12-6 13:21
5811
这个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期)

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 107
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
付上这个DLL的链接。里面有脚本。
等待,回执..
http://pan.baidu.com/share/link?shareid=162047&uk=855757154
2012-12-6 14:10
0
雪    币: 107
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
怎么没有一个人回答。。。
失忘了、
2012-12-6 21:20
0
雪    币: 107
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
顶起一下。顶到上面去。求解。
2013-1-20 16:35
0
雪    币: 199
活跃值: (65)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
5
....帮顶一下!
2013-1-22 16:37
0
雪    币: 114
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
....帮顶一下!
2013-2-14 09:11
0
游客
登录 | 注册 方可回帖
返回
//