如何跟蹤ASProtect外殼加密過的程式? (7千字)
如何跟蹤ASProtect外殼加密過的程式?
【宣告】
我寫文章以交流為主,希望大家在轉載時能保持文章的完整性。
【前言】
由於ASProtect外殼加密過的程式中運用了很多反跟蹤的技術,所以說起來實在是件費事的事情。我實在擔心自己水平有限,無法把它們說得明白。不過想想我又不是權威,錯誤在所難免。既然我辦的是"技術交流站",不一定要保證每句話都是正確的,也不是寫出來就要做什麼教程之類的。既是"交流",那麼應該大家都在"交流"中提高,而不是我象個傳教士一樣永遠給大家念著一百年不變的經文。所以我希望不光我說,大家也說。怎麼說都行,每個人都可以有每個人的風格。:-)
希望我的想法不是夢想。
作者: ljtt
寫作日期: 2001-04-10
【開始】
你跟蹤過ASProtect外殼加密過的程式嗎?如果你說跟蹤過,是否有過這樣的經歷?
015F:012803D9 E3 33 C0 5A 59 59 64 89-10 68 F7 03 28 01 8D 45 .3.ZYYd..h..(..E
015F:012803E9 FC E8 A1 2D FF FF C3 E9-F3 29 FF FF EB F0 5F 5E ...-.....)...._^
015F:012803F9 5B 59 5D C3 00 00 00 FF-FF FF FF 02 00 00 00 0D [Y].............
015F:01280409 0A 00 00 55 8B EC 53 56-8B DA 8B F0 8B 45 08 8B ...U..SV.....E..
哪哪KERNEL32!FindClose+0386哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪PROT32
015F:BFF768C6 FF5518
CALL [EBP+18]
015F:BFF768C9 83C410
ADD ESP,10
015F:BFF768CC 648F0500000000 POP
DWORD PTR FS:[00000000]
015F:BFF768D3 C9
LEAVE
015F:BFF768D4 C3
RET
你時常會被帶到如上圖所示的 FindClose 的領空,然後在系統核心裡轉悠了大半個世紀,才好不容易回到程式的領空。
呵呵,我就曾有過這樣的經歷。正當我暗自竊喜時,卻發現跟蹤沒多長時間又一次來到了老地方,昏倒.....。
看來這其中有蹊蹺,我們不妨從當前的堆疊入手。看看有什麼發現?
我們下指令:
D ESP
顯示如下結果:
哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪byte哪哪哪哪哪哪哪PROT哪?0)哪
0167:0081FB10 D8 FB 81 00 D0 FC 81 00-F4 FB 81 00 B0 FB 81 00 ................
^^^^^^^^^^^ ^^^^^^^^^^^ ^^^^^^^^^^^
^^^^^^^^^^^
我們一一顯示 0081FBD8 、0081FCD0 、0081FBF4 、0081FBB0 的內容。終於你會發現一點線索。
我們下指令:
D 81FBF4
顯示如下結果:
哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪byte哪哪哪哪哪哪哪PROT哪?0)哪
0167:0081FBF4 1F 00 01 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0167:0081FC04 00 00 00 00 00 00 00 00-55 01 00 00 7F 02 FF FF ........U......
0167:0081FC14 00 00 FF FF FF FF FF FF-00 00 00 00 00 00 00 00 ................
0167:0081FC24 00 00 00 00 00 00 FF FF-00 00 00 00 00 00 00 00 ................
呵呵,正好我學習過一點SEH的知識,瞭解CONTEXT結構,看到這......不再猶豫..... 81FBF4 可能是 _CONTEXT 結構的指標。
我們先來了解一下 _CONTEXT 結構的定義:
_CONTEXT STRUC
cx_ContextFlags DD ?
;CONTEXT_DEBUG_REGISTERS
cx_Dr0 DD ?
;04
cx_Dr1 DD ?
;08
cx_Dr2 DD ?
;0C
cx_Dr3 DD ?
;10
cx_Dr6 DD ?
;14
cx_Dr7 DD ?
;18
;CONTEXT_FLOATING_POINT
cx_ControlWord DD ?
cx_StatusWord DD ?
cx_TagWord DD ?
cx_ErrorOffset DD ?
cx_ErrorSelector DD ?
cx_DataOffset DD ?
cx_DataSelector DD ?
SIZE_OF_80387_REGISTERS EQU 80
cx_RegisterArea DB SIZE_OF_80387_REGISTERS DUP
(?)
cx_Cr0NpxState DD ?
;CONTEXT_SEGMENTS
cx_SegGs DD ?
;8C
cx_SegFs DD ?
;90
cx_SegEs DD ?
;94
cx_SegDs DD ?
;98
;CONTEXT_INTEGER
cx_Edi DD ?
;9C
cx_Esi DD ?
;A0
cx_Ebx DD ?
;A4
cx_Edx DD ?
;A8
cx_Ecx DD ?
;AC
cx_Eax DD ?
;B0
;CONTEXT_CONTROL
cx_Ebp DD ?
;B4
cx_Eip DD ?
;B8
cx_SegCs DD ?
;BC
cx_EFlags DD ?
;C0
cx_Esp DD ?
;C4
cx_SegSs DD ?
;C8
_CONTEXT ENDS
;size of CONTEXT is 0CCH bytes
從上面的定義中我們可以知道 _CONTEXT 結構偏移 B8 處儲存的是 EIP 的值。我們來看一下 81FBF4 + B8 的值:
我們下指令:
D 81FBF4+B8
顯示如下結果:
哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪byte哪哪哪哪哪哪哪PROT哪?0)哪
0167:0081FCAC 4A FF 27 01 5F 01 00 00-46 02 00 00 D0 FC 81 00 J.'._...F.......
^^^^^^^^^^^
我們設下斷點:
BPX 127FF4A
然後,按F5鍵,果然程式在我們設下的斷點處停了下來。:-)
顯示如下結果:
015F:0127FF4A 648F0500000000 POP
DWORD PTR FS:[00000000] <---停在此處
015F:0127FF51 58
POP EAX
015F:0127FF52 E84127FFFF CALL
01272698
015F:0127FF57 A154352801 MOV
EAX,[01283554]
015F:0127FF5C 83E80D
SUB EAX,0D
015F:0127FF5F 8B1554352801 MOV
EDX,[01283554]
看來我們已經掌握了它的一點規律。但我們不能只滿足於此,我們來看一下程式是如何做的?
我取了程式即將設下這個小圈套的一段程式碼。由於其中使用了花指令,所以我稍微做了點改動,使SoftICE能正確顯示彙編程式碼。
015F:0127FEFB 90
NOP
015F:0127FEFC 64FF30
PUSH DWORD PTR FS:[EAX]
015F:0127FEFF EB01
JMP 0127FF02
015F:0127FF01 90
NOP
015F:0127FF02 648920
MOV FS:[EAX],ESP
<---建立SEH鏈
015F:0127FF05 3100
XOR [EAX],EAX
015F:0127FF07 EB01
JMP 0127FF0A
015F:0127FF09 90
NOP
015F:0127FF0A 648F0500000000 POP
DWORD PTR FS:[00000000]
015F:0127FF11 EB02
JMP 0127FF15
015F:0127FF13 90
NOP
015F:0127FF14 90
NOP
015F:0127FF15 58
POP EAX
015F:0127FF16 E825000000 CALL
0127FF40
015F:0127FF1B 8B44240C MOV
EAX,[ESP+0C]
<---EAX此時即為 CONTEXT 的指標
015F:0127FF1F 8380B800000002 ADD
DWORD PTR [EAX+000000B8],02 <---修改 CONTEXT.EIP
015F:0127FF26 51
PUSH ECX
015F:0127FF27 31C9
XOR ECX,ECX
<---ECX = 0
015F:0127FF29 894804
MOV [EAX+04],ECX
<---修改 CONTEXT.Dr0 = 0
015F:0127FF2C 894808
MOV [EAX+08],ECX
<---修改 CONTEXT.Dr1 = 0
015F:0127FF2F 89480C
MOV [EAX+0C],ECX
<---修改 CONTEXT.Dr2 = 0
015F:0127FF32 894810
MOV [EAX+10],ECX
<---修改 CONTEXT.Dr3 = 0
015F:0127FF35 C7401855010000 MOV
DWORD PTR [EAX+18],00000155 <---修改 CONTEXT.Dr7
= 155
015F:0127FF3C 59
POP ECX
015F:0127FF3D 31C0
XOR EAX,EAX
015F:0127FF3F C3
RET
<---在此處就將進入 FindClose 的領空了
原來程式在反跟蹤時,不但用 SEH 的方式使得不知其所以的人跟蹤時陷入了設下的圈套;而且,還使得我們以前設下的斷點失效。
(Dr0、Dr1、Dr2、Dr3與斷點有關,Dr7與斷點的控制有關,至於這方面的內容如果你不清楚,那麼你可以選擇看一些比較專業的書籍來理解,我無法把它說得清楚。)
從這裡我們更加可以肯定我們先前的判斷了。以後我們再跟蹤時,就不會再在這個小圈套裡出不來了。如果你再總結一下規律,也許會發現更多,這就留給大家了。:-)
。
比如,我發現其實程式每次使用這種方法時,真正要跳到的地方就在 RET 指令後面不遠處的指令。所以每當我遇到花指令開始的地方,就會明白程式又要給我開開玩笑了,我會在
RET 指令處停下來,然後在後面不遠處的指令設下新斷點,然後按 F5 鍵,呵呵,平穩落地。
【後記】
由於本站的主題為"技術研習",所以我想改變以前只寫"如何做"的方式,而儘量以我所知加上以"為何如此做"的方式寫。這樣我將選擇性地在某些難點上費些口水,而不再寫如何完整的脫某個程式的殼了。當然另外的原因就是現在的手動脫殼越來越繁鎖,雖然外殼加密程式本身可能只是新增了一些新的反跟蹤/反破解的手法而已,但只寫"如何做"的方式是無法使人明白這些變化的。
相關文章
- Hardlock加密狗破解過程-----外殼型加密狗的破解方法 (7千字)2001-10-15加密
- FTPrint的脫殼(asprotect) (2千字)2001-02-05FTP
- Asprotect保護的程式脫殼後的修正--DialogBoxIndirectParamA
(7千字)2001-09-09
- ASPROtect 1.22加殼的ahaview2.0脫殼 (5千字)2002-03-24View
- 用ollydbg跟蹤te!lock加殼的軟體
(2千字)2015-11-15
- 對Crunch v1.1加殼程式的手動脫殼及反跟蹤程式碼的一點分析
(15千字)2000-10-02
- MFC 程式的跟蹤 (一) (6千字)2001-05-01
- 用ollydbg跟蹤asproctect1.2加殼的軟體
(1千字)2015-11-15
- 對Asprotect脫殼的一點總結
(20千字)2000-08-12
- 股市風暴4.0的外殼分析與脫殼方法(一) (7千字)2001-06-10
- Asprotect 1.2x 加殼的 Advanced Direct
Remailer 2.17 脫殼 (3千字)2002-06-20REMAI
- 看世界盃,漫步ASProtect
----- ASProtect的加密演算法初步分析 (5千字)2002-06-07加密演算法
- 手動脫掉Asprotect的殼,(給初學者的) (9千字)2002-01-24
- 找Entry Point的又一方法 -----針對Asprotect
v1.0加殼的程式 (7千字)2000-08-03
- ASProtect 1.23
b18脫殼淺談 (5千字)2015-11-15
- 跟蹤aspr殼的pre-dip,解除使用限制2004-06-28
- 破解用ASProtect v1.2x加殼後程式使用限制的通用方法
(15千字)2002-04-27
- 關於用ASProtect v1.3加殼軟體的脫殼方法體會 (5千字)2001-11-21
- XDos v1.1~Dos的外殼程式 (9千字)2015-11-15
- 關於StyleXP反跟蹤程式碼的分析以及WinDbg簡單教學
(7千字)2015-11-15
- Thebat!139脫殼詳情及對Asprotect加殼保護的一點小結
(4千字)2000-03-27BAT
- Asprotect判斷被其加殼的程式的標誌是什麼?---裡面就是。
(1千字)2000-08-06
- 實現呼叫加殼的外殼中的子程式的一點見解。。 (1千字)2002-10-21
- Acrobat Reader 5.0的反跟蹤程式碼部分 (5千字)2001-08-14BAT
- 用OD對Aspr加殼程式的手動脫殼及修復 (7千字)2015-11-15
- 如何收集Oracle程式中的SQL跟蹤資訊KU2022-03-21OracleSQL
- 小甜餅 --- 有關新版Asprotect加殼程式的脫殼的又一種思路
(798字)2000-09-10
- HP下對程式的跟蹤2009-02-27
- 對PECompact加殼的DLL脫殼的一點分析 (7千字)2000-08-17
- sp_trace_setfilter sqlserver篩選跟蹤或跟蹤過濾2020-04-05FilterSQLServer
- play.exe linson的仙劍加殼器跟蹤分析2015-11-15
- Linux 外殼程式2018-08-05Linux
- 一點脫殼經驗。(7千字)2001-04-20
- 以殼解殼――ASProtect
1.23RC4殼的Stolen Code簡便解決方案2004-05-13
- 利用SEH改變程式流程以達到反跟蹤的目的 (1千字)2001-06-29
- 流放一文。 對Asprotect v1.1的手動脫殼的一點分析 (9千字)2000-10-27
- 【Longkin】ASP.NET應用程式跟蹤---(一)跟蹤頁面2008-06-02ASP.NET
- 關於用asprotect ver1.1 壓縮過的程式的人口的尋找
(4千字)2000-10-24