重定位表中的偶數規則,經歷pklite之dll
原文連結:http://bbs.pediy.com/showthread.php?s=&threadid=7230
在程式入口處看到如下程式碼:
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 ????122(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不太上心,因為每個人都有自己的活,
何況它的卻比較“舊”了。
相關文章
- 分庫分表之歷史表如何選擇最佳分片路由規則2022-03-17路由
- 正整數表單校驗規則2024-08-01
- 重建重定位表指令碼2004-10-18指令碼
- 調整陣列順序使奇數位於偶數前面,偶數和偶數之間的相對位置不變2016-04-25陣列
- delphi rtti GetMethods 遍歷規則2024-08-01
- Nginx 重寫規則指南2015-04-09Nginx
- MySQL 當中定位鎖爭用比較嚴重的表(中級篇)2020-04-03MySql
- linux中BASH變數的設定規則2012-08-06Linux變數
- 【java規則引擎】之規則引擎解釋2017-01-08Java
- 怎麼判斷Python數字中的偶數2021-09-11Python
- MySQL中的排序規則2016-12-18MySql排序
- Vue中form表單常用rules校驗規則2024-04-27VueORM
- Linux的“原罪” 瓶頸中改變的經濟規則(轉)2007-08-11Linux
- 機器學習中的範數規則化之(一)L0、L1與L2範數2018-04-12機器學習
- ACCESS 關於表設計中,驗證規則的使用技巧2024-07-30
- 寶鯤財經外匯投資中的周規則理論分析2018-08-08
- JS中this的繫結規則2019-04-28JS
- JavaScript中this的繫結規則2022-02-13JavaScript
- web前端中的命名規則2017-10-27Web前端
- JS中的"=="轉換規則2015-07-10JS
- react中的 Hook 使用規則2024-09-10ReactHook
- 變數名命名規則2018-03-23變數
- Apache重寫規則的常見應用(轉)2007-08-11Apache
- 重定位2024-10-31
- 有感中國自身經濟步入正規,而在國際中經濟定位仍有待清晰思路2007-10-11
- 小明歷險記:規則引擎drools教程一2017-08-07
- Nginx URL重寫規則配置詳解2019-03-18Nginx
- Xdoclet之學習經歷2020-04-06
- javascript變數的宣告以及命名規則2020-11-09JavaScript變數
- .htaccess中的apacherewrite規則詳解2017-11-12Apache
- Linux 中sed命令輸出奇數行和偶數行的方法2024-10-29Linux
- 匹配指定位數的正規表示式程式碼2017-02-10
- 採購至庫存所經歷的表2020-04-04
- C語言的本質(37)——makefile之隱含規則和模式規則2014-07-24C語言模式
- 【java規則引擎】規則引擎RuleBase中利用觀察者模式2017-02-09Java模式
- 利用apache的mod_rewrite做URL規則重寫2017-01-19Apache
- Apache 重寫規則的常見應用 (rewrite)(轉)2007-08-09Apache
- python變數命名規則2024-06-05Python變數