Crunch v1.1中的一段有趣的反跟蹤程式碼 (5千字)

看雪資料發表於2001-04-08

歡迎有空光臨小站:http://go1.163.com/~st0ne/
『技術研習』  『以前更新』 

--------------------------------------------------------------------------------

Crunch v1.1中的一段有趣的反跟蹤程式碼

【宣告】
我寫文章以交流為主,希望大家在轉載時能保持文章的完整性。

【前言】
這是在對Crunch.EXE脫殼時發現的一點有趣的東西,就寫了出來。其中利用一種特殊的方法---修改LDT表來進入Ring0級,然後在Ring0級檢測Test_Debug_Installed標誌來判斷當前是否有偵錯程式跟蹤,這種反跟蹤方法不用區別偵錯程式的型別。SoftICE、TRW2000、天意都可以檢測到,怎麼樣?有點意思吧。不過如果你要對付這種外殼加密軟體的話,就要小心一點了,別被當得死死的哦。:-)

作者:        ljttt
寫作日期:    2000-10-02

1、前面的大部分分析過程同《對Crunch v1.1加殼程式的手動脫殼及反跟蹤程式碼的一點分析》一文中所述,這裡就不多說了。

2、跟蹤到如下程式碼處,我們的目標開始了!
015F:0066C266  53                  PUSH      EBX
015F:0066C267  E8C9100000          CALL      0066D335
015F:0066C26C  5B                  POP      EBX
015F:0066C26D  899D683C0000        MOV      [EBP+00003C68],EBX
015F:0066C273  BB76060000          MOV      EBX,00000676
015F:0066C278  03DD                ADD      EBX,EBP
015F:0066C27A  899D643C0000        MOV      [EBP+00003C64],EBX
015F:0066C280  BB050A0000          MOV      EBX,00000A05
015F:0066C285  03DD                ADD      EBX,EBP
015F:0066C287  FFD3                CALL      EBX                                <--內有反跟蹤程式碼
015F:0066C289  90                  NOP
015F:0066C28A  60                  PUSHAD
015F:0066C28B  BB85230000          MOV      EBX,00002385
015F:0066C290  03DD                ADD      EBX,EBP
015F:0066C292  53                  PUSH      EBX
015F:0066C293  FF950A210000        CALL      [EBP+0000210A]
015F:0066C299  8985F6160000        MOV      [EBP+000016F6],EAX

3、在 CALL EBX 處按F8鍵進入看看
015F:0066C9FF  FFA56C3C0000        JMP      [EBP+00003C6C]
015F:0066CA05  8CD8                MOV      AX,DS
015F:0066CA07  A804                TEST      AL,04
015F:0066CA09  740F                JZ        0066CA1A
015F:0066CA0B  8DB51B0A0000        LEA      ESI,[EBP+00000A1B]                    <--ESI=0066CA1B(這是檢測程式入口的地址
015F:0066CA11  BB460A0000          MOV      EBX,00000A46
015F:0066CA16  03DD                ADD      EBX,EBP                            <--EBX
015F:0066CA18  FFD3                CALL      EBX                                <--還要繼續深入
015F:0066CA1A  C3                  RET

4、在 CALL EBX 處我們繼續按F8鍵進入看看,這樣我們就到了關鍵處
015F:0066CA46  60                  PUSHAD
015F:0066CA47  53                  PUSH      EBX                    <--這裡實際上是為了留出空間儲存GDTR的內容
015F:0066CA48  0F014424FE          SGDT      FWORD PTR [ESP-02]        <--獲取GDTR的內容(6個位元組)
015F:0066CA4D  5B                  POP      EBX                    <--EBX=GDTR的4個位元組的內容,實際上就是GDT的基地址
015F:0066CA4E  33C0                XOR      EAX,EAX                <--EAX=0
015F:0066CA50  0F00C0              SLDT      AX                        <--獲取LDT表的選擇器到 AX 中
015F:0066CA53  24F8                AND      AL,F8                    <--限定AL大小
015F:0066CA55  03D8                ADD      EBX,EAX                <--獲取LDT表在GDT表中的偏移地址
015F:0066CA57  8A6B07              MOV      CH,[EBX+07]            <--獲取第8個位元組
015F:0066CA5A  8A4B04              MOV      CL,[EBX+04]            <--獲取第5個位元組
015F:0066CA5D  C1E110              SHL      ECX,10                    <--移動到高位
015F:0066CA60  668B4B02            MOV      CX,[EBX+02]            <--獲取第3-4兩個位元組,此時ECX組合成為LDT表的基地址
015F:0066CA64  8D7908              LEA      EDI,[ECX+08]            <--獲取LDT表第9個位元組偏移地址指標
015F:0066CA67  FC                  CLD
015F:0066CA68  8BC6                MOV      EAX,ESI                <--EAX=ESI=0066CA1B
015F:0066CA6A  66AB                STOSW                            <--儲存兩個位元組,即CA1B到EDI指向的地址
015F:0066CA6C  B8280000EC          MOV      EAX,EC000028            <--EAX=EC000028
015F:0066CA71  AB                  STOSD                            <--儲存四個位元組,即EC000028到EDI+2指向的地址
015F:0066CA72  0FA4F010            SHLD      EAX,ESI,10                <--把ESI=0066CA1B進行移位,得到0066
015F:0066CA76  66AB                STOSW                            <--儲存兩個位元組,即0066到EDI+6指向的地址
015F:0066CA78  61                  POPAD                    <--以上這些指令為了形成LDTR,使之指向0066CA1B,為以下的呼叫作準備
015F:0066CA79  9A000000000F00      CALL      000F:00000000    <--該呼叫實際上指向的015F:0066CA1B處
015F:0066CA80  C3                  RET

5、我們在 CALL 000F:00000000 處按F8鍵繼續跟蹤分析
015F:0066CA1B  60                  PUSHAD
015F:0066CA1C  33C0                XOR      EAX,EAX
015F:0066CA1E  BF3B0A0000          MOV      EDI,00000A3B
015F:0066CA23  03FD                ADD      EDI,EBP
015F:0066CA25  CD20                INT      20 VXDCall Get_DDB                    <--判斷DDB
015F:0066CA2B  7502                JNZ      0066CA2F                            <--關鍵了!
015F:0066CA2D  CD19                INT      19                                    <--超度
015F:0066CA2F  CD20                INT      20 VXDCall Test_Debug_Installed    <--判斷是否安裝了除錯環境
015F:0066CA35  7402                JZ        0066CA39                            <--關鍵了!
015F:0066CA37  CD19                INT      19
015F:0066CA39  61                  POPAD
015F:0066CA3A  CB                  RETF

【後記】
這種檢測跟蹤的方法比較新鮮(對我來說^_^)。我想這種方法可以檢測除錯環境,比單純的檢測SoftICE跟蹤來得更有意思。


--------------------------------------------------------------------------------

《加密及解密技術交流站》由 ljtt 製作 版權所有
&copy;2000 -2001 All Rights Reserved
 
轉載本站所有文章請註明出處,尊重作者的勞動也是尊重你自己。讓我們一同撐起綠色的天空!

相關文章