首页
论坛
课程
招聘
重定位表中的偶数规则,经历pklite之dll
2004-11-20 14:56 9314

重定位表中的偶数规则,经历pklite之dll

2004-11-20 14:56
9314
在程序入口处看到如下代码:
01052000 > 68 80200310      PUSH 10032080
01052005   68 40CA0310      PUSH 1003CA40
0105200A   B8 00000010      MOV EAX,10000000
0105200F   2B4424 0C        SUB EAX,DWORD PTR SS:[ESP+C]
01052013   50               PUSH EAX
01052014   E8 27AA0000      CALL dll.0105CA40
01052019  ^E9 92F2FCFF      JMP dll.010212B0    ;注意这个跳

光条放在最后一行上回车,看到那里还全是00,推测可能是原代码入口,于是在10212B0处设写入断点,f9断在这里:

0105C6EC   8808             MOV BYTE PTR DS:[EAX],CL
0105C6EE   8B46 20          MOV EAX,DWORD PTR DS:[ESI+20] 
0105C6F1   8B4E 1C          MOV ECX,DWORD PTR DS:[ESI+1C] 

取消内存写断点,在这个函数的退出点设断再f9,停下后ctrl+g转到10212B0看到

010212B0   55               PUSH EBP    
010212B1   8BEC             MOV EBP,ESP
010212B3   51               PUSH ECX
010212B4   C745 FC 01000000 MOV DWORD PTR SS:[EBP-4],1
010212BB   837D 0C 00       CMP DWORD PTR SS:[EBP+C],0
010212BF   75 10            JNZ SHORT dll.010212D1
010212C1   833D E0D30210 00 CMP DWORD PTR DS:[1002D3E0],0    ;看这里
010212C8   75 07            JNZ SHORT dll.010212D1
010212CA   33C0             XOR EAX,EAX
010212CC   E9 CC000000      JMP dll.0102139D
010212D1   837D 0C 01       CMP DWORD PTR SS:[EBP+C],1
010212D5   74 06            JE SHORT dll.010212DD
010212D7   837D 0C 02       CMP DWORD PTR SS:[EBP+C],2
010212DB   75 42            JNZ SHORT dll.0102131F
010212DD   833D 5CEF0210 00 CMP DWORD PTR DS:[1002EF5C],0
010212E4   74 15            JE SHORT dll.010212FB
010212E6   8B45 10          MOV EAX,DWORD PTR SS:[EBP+10]
010212E9   50               PUSH EAX
010212EA   8B4D 0C          MOV ECX,DWORD PTR SS:[EBP+C]
010212ED   51               PUSH ECX
010212EE   8B55 08          MOV EDX,DWORD PTR SS:[EBP+8]
010212F1   52               PUSH EDX
010212F2   FF15 5CEF0210    CALL DWORD PTR DS:[1002EF5C]    ;这里

从010212C1等处可以看出这是“重定位”之前的代码,赶快dump吧!(我用LordPe)
下面查找重定位函数:
在 10212C3设硬件写入断点,两次f9后来到:

0105CBBB   291408           SUB DWORD PTR DS:[EAX+ECX],EDX    ;重定位
0105CBBE   8B46 04          MOV EAX,DWORD PTR DS:[ESI+4]
0105CBC1   83C7 02          ADD EDI,2
0105CBC4   83E8 08          SUB EAX,8
0105CBC7   43               INC EBX

0105CBBB行所在的函数就是pklite的重定位函数了,如下:
0105CB60   8B4424 08        MOV EAX,DWORD PTR SS:[ESP+8]             
0105CB64   56               PUSH ESI                                 
0105CB65   8B7424 08        MOV ESI,DWORD PTR SS:[ESP+8]             
0105CB69   85C0             TEST EAX,EAX
0105CB6B   897424 08        MOV DWORD PTR SS:[ESP+8],ESI             
0105CB6F   76 7C            JBE SHORT dll.0105CBED
0105CB71   57               PUSH EDI              
0105CB72   55               PUSH EBP
0105CB73   8B6C24 20        MOV EBP,DWORD PTR SS:[ESP+20]
0105CB77   53               PUSH EBX
0105CB78   8B46 04          MOV EAX,DWORD PTR DS:[ESI+4]    ;这里取block size
0105CB7B   33DB             XOR EBX,EBX
0105CB7D   83E8 08          SUB EAX,8
0105CB80   8D7E 08          LEA EDI,DWORD PTR DS:[ESI+8]    
0105CB83   99               CDQ
0105CB84   2BC2             SUB EAX,EDX
0105CB86   D1F8             SAR EAX,1
0105CB88   85C0             TEST EAX,EAX
0105CB8A   7E 45            JLE SHORT dll.0105CBD1
0105CB8C   66:8B0F          MOV CX,WORD PTR DS:[EDI]
0105CB8F   8B16             MOV EDX,DWORD PTR DS:[ESI]        ;这里取section value
0105CB91   8BC1             MOV EAX,ECX                      
0105CB93   81E1 00F00000    AND ECX,0F000
0105CB99   25 FF0F0000      AND EAX,0FFF
0105CB9E   03C2             ADD EAX,EDX
0105CBA0   2BC5             SUB EAX,EBP
0105CBA2   66:81F9 0030     CMP CX,3000
0105CBA7   75 15            JNZ SHORT dll.0105CBBE
0105CBA9   3B4424 20        CMP EAX,DWORD PTR SS:[ESP+20]
0105CBAD   7D 0F            JGE SHORT dll.0105CBBE
0105CBAF   85C0             TEST EAX,EAX
0105CBB1   7C 0B            JL SHORT dll.0105CBBE
0105CBB3   8B4C24 1C        MOV ECX,DWORD PTR SS:[ESP+1C]   
0105CBB7   8B5424 28        MOV EDX,DWORD PTR SS:[ESP+28]
0105CBBB   291408           SUB DWORD PTR DS:[EAX+ECX],EDX    ;这里重定位
0105CBBE   8B46 04          MOV EAX,DWORD PTR DS:[ESI+4]
0105CBC1   83C7 02          ADD EDI,2
0105CBC4   83E8 08          SUB EAX,8
0105CBC7   43               INC EBX
0105CBC8   99               CDQ
0105CBC9   2BC2             SUB EAX,EDX
0105CBCB   D1F8             SAR EAX,1
0105CBCD   3BD8             CMP EBX,EAX
0105CBCF  ^7C BB            JL SHORT dll.0105CB8C
0105CBD1   8B46 04          MOV EAX,DWORD PTR DS:[ESI+4]
0105CBD4   8B7424 14        MOV ESI,DWORD PTR SS:[ESP+14] 
0105CBD8   8B4C24 18        MOV ECX,DWORD PTR SS:[ESP+18]
0105CBDC   03F0             ADD ESI,EAX
0105CBDE   2BC8             SUB ECX,EAX
0105CBE0   897424 14        MOV DWORD PTR SS:[ESP+14],ESI
0105CBE4   894C24 18        MOV DWORD PTR SS:[ESP+18],ECX
0105CBE8  ^75 8E            JNZ SHORT dll.0105CB78
0105CBEA   5B               POP EBX
0105CBEB   5D               POP EBP 
0105CBEC   5F               POP EDI
0105CBED   B8 01000000      MOV EAX,1
0105CBF2   5E               POP ESI
0105CBF3   C3               RETN

容易看出 esi指向重定位表,在Registers窗口里选中 ESI后再选击Follow in dump,数据窗口中看到:

01052094  00 10 00 00 52 01 00 00 51 30 56 30 5E 30 70 30  ...R..Q0V0^0p0
010520A4  75 30 7D 30 DD 30 E2 30 EA 30 20 31 3F 31 44 31  u0}0??? 1?1D1
010520B4  4B 31 7F 31 84 31 9E 31 AB 31 B1 31 BD 31 C3 31  K11??????
010520C4  CC 31 D2 31 D7 31 E4 31 FF 31 04 32 0E 32 28 32  ?????22(2
010520D4  31 32 3F 32 48 32 51 32 57 32 C3 32 DF 32 F4 32  12?2H2Q2W2???
010520E4  7E 33 93 33 B5 33 BE 33 C7 33 E6 33 F5 33 21 34  ~3??????!4

显然是重定位表了!有点简单哦?
但是当我们把这个表粘贴到刚才dump的文件中再对它作简单修改(oep,reloc),dll_loader仍然是
“加载失败”!
    重新再来一次,这次不用写入断点,直接在重定位函数入口(0105CB60)处设断,go!go!go!
中断后ctrl+g转到010212B0,我们惊恐地发现,那里仍然是“一遍空白”,没有代码,程序在这里重定
位!在0105CBBB处设断,f9断下后看出,这里是对原程序中数据段中的指针重定位!看来pklite对于
各段(segment)的处理是分步进行的,就是说我们这时要么dump数据段的内容保存起来以后恢复,
要么禁止pklite这时重定位,我选择后者,光标点中0105CBEA,ctrl+*,f9,再次中断在 0105CB60 后
dump程序,这次应该差不多了?结果还是遭遇“加载失败”!有点背运,这只是一个压缩壳呀!
    经过对dumpe下的程序仔细检查,终于看到原来是重定位表的“偶数”规则在作怪!具体说,就是
重定位表中每一节(section)中要重定位的数据个数都应该是偶数,而经pklite“搬了家”的重定位表已
不满足这个要求。原因找到就这样办: 重复上次操作,dump之前,找个“空处”键入如下代码:

0105CC00   60               PUSHAD
0105CC01   BE 94200501      MOV ESI,dll.01052094
0105CC06   BF C0820301      MOV EDI,dll.01050000
0105CC0B   8B4E 04          MOV ECX,DWORD PTR DS:[ESI+4]
0105CC0E   8BD1             MOV EDX,ECX
0105CC10   C1E9 02          SHR ECX,2
0105CC13   C1E1 02          SHL ECX,2
0105CC16   2BD1             SUB EDX,ECX
0105CC18   8BC7             MOV EAX,EDI                              
0105CC1A   F3:A4            REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
0105CC1C   2950 04          SUB DWORD PTR DS:[EAX+4],EDX
0105CC1F   03F2             ADD ESI,EDX
0105CC21   81FE 90320501    CMP ESI,dll.01053290
0105CC27  ^72 E2            JB SHORT dll.0105CC0B
0105CC29   61               POPAD
0105CC2A  ^E9 31FFFFFF      JMP dll.0105CB60

alt+M,把dll所在段设为read/write,再把 eip变到0105CC0,在0105CC29行上f4,
ok,再次dump,然后把重定位表的 rav改成 30000,size改为 11F4。all done!

小结一下:
         1.pklite对各 segment 分步处理
         2.重定位表注意偶数规则
仅此而已,是不是比较简单!

to great123 again:
   请你多注意自身修为。只要细心,其实并不难,大家对pklite不太上心,因为每个人都有自己的活,
何况它的却比较“旧”了。

[2023春季班]《安卓高级研修班(网课)》月薪两万班招生中~

收藏
点赞0
打赏
分享
最新回复 (14)
雪    币: 60
活跃值: 活跃值 (129)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
fly 活跃值 85 2004-11-20 14:59
2
0
GOOD  ;)
学习
雪    币: 216
活跃值: 活跃值 (44)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
jingulong 活跃值 5 2004-11-20 15:01
3
0
forgot,it's oep should be patch
雪    币: 245
活跃值: 活跃值 (10)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
Winter-Night 活跃值 5 2004-11-20 15:11
4
0
版主都好热心,收藏了慢慢学
雪    币: 10184
活跃值: 活跃值 (12808)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
kanxue 活跃值 8 2004-11-20 15:30
5
0
这个偶数规则应就是 数据对齐,PE文件的数据都是按这个要求对齐的。
WORD值总是从被2除尽的地方开始,DWORD值总是从被4除尽的地址开始。
雪    币: 226
活跃值: 活跃值 (11)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
heXer 活跃值 3 2004-11-20 15:41
6
0
Microsoft Portable Executable and Common Object File Format Specification
Microsoft Corporation
Revision 6.0  - February 1999
有这样 的叙述:

雪    币: 203
活跃值: 活跃值 (23)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
yeyu0808 活跃值 1 2004-11-20 15:46
7
0
版主厉害,学习一下怎么寻找重定位表~!
雪    币: 48779
活跃值: 活跃值 (171444)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
linhanshi 活跃值 2004-11-20 15:48
8
0
支持!!!
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
q3q3 活跃值 2004-11-20 15:59
9
0
珍藏。
雪    币: 107
活跃值: 活跃值 (27)
能力值: ( LV12,RANK:770 )
在线值:
发帖
回帖
粉丝
qiweixue 活跃值 19 2004-11-21 11:43
10
0
要是有个附件就好了~
俺也符合这大家说,好文,不错,学习............

还是有机会仔细看看^^^^^^
支持!!!
雪    币: 411
活跃值: 活跃值 (561)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
daxia200N 活跃值 6 2004-11-21 13:42
11
0
好文章
雪    币: 0
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
great1234 活跃值 2004-11-25 09:59
12
0
to great123 again:
   请你多注意自身修为。只要细心,其实并不难,大家对pklite不太上心,因为每个人都有自己的活,
何况它的却比较“旧”了。

============================================

1.你自己的水平很厉害,当然可以分析出其中的关键所在.
2.即使这样,你也走了不少弯路,更何况我这样的初学者?
3.我叫great1234,不叫great123,当然了,那是我另外一个马甲.
4.你有没有发觉这个dll(其实是我自己用VC6写的测试dll,用OD载入的时候不能停止在入口,只有在dll进行DLL_PROCESS_DETACH的时候(也就是dll销毁的时候)才能被OD暂停在入口处,你也没有解说这个原理
5.而这个时候OEP已经被回复,重定位已经完成,.这样一来你的那些内存写断点如何执行??
6.其实你讲解了这么多,只是"然",而我不知道"所以然",等于还是没说.下次碰到类似的东西还是不会.

7.谢谢你的分析.
8.我自己正在补课PE的知识,希望早日跟你一样的水平.
雪    币: 0
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
great1234 活跃值 2004-11-25 10:09
13
0
9,你的那些patch的代码对于我这样的初学者来说,是一头雾水,譬如,哪里的"空白"区域才是安全的,那段代码的含义是什么?
10."我选择后者,光标点中0105CBEA,ctrl+*,f9"------你这里的ctrl+*是不是跟F4一个道理?就是运行到当前行?
11."在 10212C3设硬件写入断点,两次f9后来到:"-------??????

12.你的偶数规则还是没有看明白,我想我应该真正的系统学习pe的知识了.
雪    币: 205
活跃值: 活跃值 (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yplq 活跃值 2004-12-10 13:38
14
0
强,果然强!
雪    币: 43
活跃值: 活跃值 (30)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
采臣·宁 活跃值 1 2004-12-10 20:40
15
0
楼主功力真强劲。
游客
登录 | 注册 方可回帖
返回