JDPack Version 1.01 外殼完全分析筆記

看雪資料發表於2004-05-15

JDPack Version 1.01 外殼完全分析筆記


【目標程式】   JDPack V1.01加殼的Win98記事本
【作    者】   cyclotron[BCG][DFCG][FCG][OCN]

    用OllyDBG載入後如下:

0040D000 >PUSHAD
0040D001  CALL NOTEPAD.0040D006
0040D006  POP EBP
0040D007  MOV EDX,EBP
0040D009  SUB EBP,NOTEPAD.00402BC6                       ; 取得delta
0040D00F  SUB EDX,DWORD PTR SS:[EBP+403461]
0040D015  SUB EDX,6
0040D01B  MOV DWORD PTR SS:[EBP+403465],EDX              ; 取得基地址
0040D021  CMP DWORD PTR SS:[EBP+403469],0                ; 某重入標誌
0040D028  JNZ NOTEPAD.0040D3EA
0040D02E  MOV DWORD PTR SS:[EBP+403469],1                ; 置重入標誌
0040D038  MOV ECX,788                                    ; 解碼長度
0040D03D  LEA ESI,DWORD PTR SS:[EBP+402C18]              ; 加密程式碼的起始地址,我這裡是0040D058
0040D043  MOV AL,BYTE PTR SS:[EBP+403460]
0040D049  MOV BL,BYTE PTR DS:[ESI]
0040D04B  XOR AL,BL                                      ; 簡單的異或解密運算
0040D04D  MOV BYTE PTR DS:[ESI],AL
0040D04F  MOV BYTE PTR SS:[EBP+403460],BL                ; 儲存解密前的程式碼
0040D055  INC ESI
0040D056  LOOPD SHORT NOTEPAD.0040D043                   ; 隨著迴圈的進行對下面的程式碼進行解密
0040D058  PUSHFD                                         ; 標誌位入棧,這裡不能單步透過
0040D059  POP EAX
0040D05A  TEST AH,1                                      ; 檢測單步標誌
0040D05D  JE SHORT NOTEPAD.0040D066
0040D05F  XOR BYTE PTR SS:[EBP+402FD7],0FF               ; 發現跟蹤企圖後將下面的一句關鍵程式碼破壞
0040D066  MOV ESI,DWORD PTR SS:[EBP+403201]              ; 原檔案的區塊數目
0040D06C  MOV EAX,EBP                                    ; delta
0040D06E  PUSH ESI
0040D06F  PUSH EAX                                       ; 儲存偏移量
0040D070  MOV ECX,DWORD PTR DS:[EAX+403209]              ; 申請空間的大小
0040D076  PUSH 4
0040D078  PUSH 1000
0040D07D  PUSH ECX
0040D07E  PUSH 0                                         ; 作業系統指定分配空間的地址
0040D080  CALL DWORD PTR SS:[EBP+4033EC]                 ; kernel32.VirtualAlloc
0040D086  MOV DWORD PTR SS:[EBP+4031E1],EAX              ; 儲存空間的首地址
0040D08C  POP EAX
0040D08D  POP ESI
0040D08E  PUSH ESI
0040D08F  PUSH EAX
0040D090  MOV ESI,DWORD PTR DS:[EAX+403205]              ; 程式碼塊偏移量
0040D096  MOV EDX,DWORD PTR SS:[EBP+403465]              ; 映象基地址
0040D09C  MOV ECX,DWORD PTR DS:[EAX+403209]              ; 解密塊的大小
0040D0A2  ADD ESI,EDX
0040D0A4  PUSHAD
0040D0A5  MOV EDI,ESI
0040D0A7  XOR EAX,EAX
0040D0A9  LODS BYTE PTR DS:[ESI]                         ; 載入程式碼塊資料至al
0040D0AA  XOR AL,BYTE PTR SS:[EBP+402FD7]                ; 加密程式碼塊的資料
0040D0B0  STOS BYTE PTR ES:[EDI]                         ; 存回程式碼塊
0040D0B1  LOOPD SHORT NOTEPAD.0040D0A9
0040D0B3  POPAD
0040D0B4  MOV EDI,DWORD PTR SS:[EBP+4031E1]              ; 這是前面用VirtualAlloc分配的記憶體空間
0040D0BA  REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]   ; 儲存加密後的資料
0040D0BC  MOV ESI,DWORD PTR SS:[EBP+4031E1]              ; 加密資料的儲存位置
0040D0C2  MOV EDI,DWORD PTR DS:[EAX+403205]              ; 程式碼塊偏移量
0040D0C8  ADD EDI,EDX
0040D0CA  PUSH EDI
0040D0CB  PUSH ESI
0040D0CC  CALL NOTEPAD.0040D4BD                          ; 將程式碼塊的資料還原
0040D0D1  POP ESI
0040D0D2  POP EDI
0040D0D3  POP EAX
0040D0D4  POP ESI
0040D0D5  PUSH ESI
0040D0D6  PUSH EAX
0040D0D7  MOV ECX,DWORD PTR DS:[EAX+403209]              ; 申請空間的大小
0040D0DD  MOV ESI,DWORD PTR SS:[EBP+4031E1]              ; 動態申請的記憶體空間
0040D0E3  PUSH 4000
0040D0E8  PUSH ECX
0040D0E9  PUSH ESI
0040D0EA  CALL DWORD PTR SS:[EBP+4033F0]                 ; kernel32.VirtualFree釋放空間
0040D0F0  POP EAX
0040D0F1  POP ESI
0040D0F2  ADD EAX,8                                      ; delta+8
0040D0F5  DEC ESI                                        ; 區塊數遞減SI
0040D0F6  JNZ NOTEPAD.0040D06E                           ; 上述迴圈依次對每個section進行解碼
0040D0FC  CMP DWORD PTR SS:[EBP+4031E9],0                ; 是否有重定位資料?
0040D103  JE NOTEPAD.0040D193
0040D109  MOV EDX,DWORD PTR SS:[EBP+403465]              ; 當前映象基地址
0040D10F  MOV EAX,DWORD PTR SS:[EBP+4031E5]              ; 理想映象基地址
0040D115  SUB EDX,EAX
0040D117  JE SHORT NOTEPAD.0040D193                      ; 是否需要重定位?

        ..........
        ..........
        ..........

0040D191  JMP SHORT NOTEPAD.0040D12C
0040D193  LEA EBX,DWORD PTR SS:[EBP+403389]              ; "user32.dll"
0040D199  PUSH EBX
0040D19A  CALL DWORD PTR SS:[EBP+4033E8]                 ; 呼叫kernel32.LoadLibraryA 載入動態連結庫
0040D1A0  PUSH EAX                                       ; 儲存庫的控制程式碼
0040D1A1  LEA EBX,DWORD PTR SS:[EBP+403331]              ; "MessageBoxA"
0040D1A7  PUSH EBX
0040D1A8  PUSH EAX
0040D1A9  CALL DWORD PTR SS:[EBP+4033E0]                 ; 呼叫kernel32.GetProcAddress 取得函式地址
0040D1AF  MOV DWORD PTR SS:[EBP+4031D5],EAX              ; 儲存到全域性變數
0040D1B5  POP EAX
0040D1B6  LEA EBX,DWORD PTR SS:[EBP+40333D]              ; "wsprintfA"
0040D1BC  PUSH EBX
0040D1BD  PUSH EAX
0040D1BE  CALL DWORD PTR SS:[EBP+4033E0]                 ; kernel32.GetProcAddress
0040D1C4  MOV DWORD PTR SS:[EBP+4031D9],EAX
0040D1CA  LEA EBX,DWORD PTR SS:[EBP+4033F8]              ; "kernel32.dll"
0040D1D0  PUSH EBX
0040D1D1  CALL DWORD PTR SS:[EBP+4033E4]                 ; kernel32.GetModuleHandleA
0040D1D7  PUSH EAX
0040D1D8  LEA EBX,DWORD PTR SS:[EBP+403347]              ; "ExitProcess"
0040D1DE  PUSH EBX
0040D1DF  PUSH EAX
0040D1E0  CALL DWORD PTR SS:[EBP+4033E0]                 ; kernel32.GetProcAddress
0040D1E6  MOV DWORD PTR SS:[EBP+4031C5],EAX
0040D1EC  POP EAX
0040D1ED  PUSH EAX
0040D1EE  LEA EBX,DWORD PTR SS:[EBP+403361]              ; "CreateFileA"
0040D1F4  PUSH EBX
0040D1F5  PUSH EAX
0040D1F6  CALL DWORD PTR SS:[EBP+4033E0]                 ; kernel32.GetProcAddress
0040D1FC  MOV DWORD PTR SS:[EBP+4031C1],EAX
0040D202  POP EAX
0040D203  PUSH EAX
0040D204  LEA EBX,DWORD PTR SS:[EBP+403353]              ; "GetVersionExA"
0040D20A  PUSH EBX
0040D20B  PUSH EAX
0040D20C  CALL DWORD PTR SS:[EBP+4033E0]                 ; kernel32.GetProcAddress
0040D212  MOV DWORD PTR SS:[EBP+4031C9],EAX
0040D218  POP EAX
0040D219  PUSH EAX
0040D21A  LEA EBX,DWORD PTR SS:[EBP+40336D]              ; "VirtualProtect"
0040D220  PUSH EBX
0040D221  PUSH EAX
0040D222  CALL DWORD PTR SS:[EBP+4033E0]                 ; kernel32.GetProcAddress
0040D228  MOV DWORD PTR SS:[EBP+4031CD],EAX
0040D22E  POP EAX
0040D22F  LEA EBX,DWORD PTR SS:[EBP+40337C]              ; "GetTickCount"
0040D235  PUSH EBX
0040D236  PUSH EAX
0040D237  CALL DWORD PTR SS:[EBP+4033E0]                 ; kernel32.GetProcAddress
0040D23D  MOV DWORD PTR SS:[EBP+4031D1],EAX
0040D243  LEA EBX,DWORD PTR SS:[EBP+40346D]              ; OSVERSIONINFO結構體的指標
0040D249  MOV DWORD PTR DS:[EBX],94                      ; OSVERSIONINFO結構體的大小
0040D24F  PUSH EBX
0040D250  CALL DWORD PTR SS:[EBP+4031C9]                 ; kernel32.GetVersionExA
0040D256  LEA EBX,DWORD PTR SS:[EBP+40346D]
0040D25C  CMP DWORD PTR DS:[EBX+10],1                    ; Win98?
0040D260  JE SHORT NOTEPAD.0040D276
0040D262  CMP DWORD PTR DS:[EBX+10],2                    ; WinNT?
0040D266  JE SHORT NOTEPAD.0040D26A
0040D268  JMP SHORT NOTEPAD.0040D284
0040D26A  CALL NOTEPAD.0040D44E                          ; 簡單地呼叫CreateFile檢測SoftICE
{
    0040D44E  PUSH 0
    0040D450  PUSH 80
    0040D455  PUSH 3
    0040D457  PUSH 0
    0040D459  PUSH 0
    0040D45B  PUSH 80000000
    0040D460  LEA EBX,DWORD PTR SS:[EBP+403394]
    0040D466  PUSH EBX                            ; "\\.\ntice"
    0040D467  CALL DWORD PTR SS:[EBP+4031C1]      ; 呼叫CreateFileA檢測SoftICE
    0040D46D  CMP EAX,-1
    0040D470  JE SHORT NOTEPAD.0040D478
    0040D472  CALL NOTEPAD.0040D47B
    0040D477  RETN
    0040D478  XOR EAX,EAX                         ; 未發現偵錯程式
    0040D47A  RETN
}
0040D26F  CMP EAX,-1
0040D272  JNZ SHORT NOTEPAD.0040D284
0040D274  JMP SHORT NOTEPAD.0040D280
0040D276  CALL NOTEPAD.0040D418
0040D27B  CMP EAX,-1
0040D27E  JNZ SHORT NOTEPAD.0040D284
0040D280  POPAD
0040D281  XOR EAX,EAX
0040D283  RETN
0040D284  MOV EDX,DWORD PTR SS:[EBP+403465]              ; 映象基地址
0040D28A  MOV ESI,DWORD PTR SS:[EBP+4031F1]              ; 輸入表的偏移量,開始處理輸入表
0040D290  ADD ESI,EDX
0040D292  MOV EAX,DWORD PTR DS:[ESI+C]                   ; DllName指標
0040D295  OR EAX,EAX
0040D297  JE NOTEPAD.0040D3EA
0040D29D  ADD EAX,EDX
0040D29F  MOV DWORD PTR SS:[EBP+4031BD],EAX              ; 儲存DllName地指標
0040D2A5  MOV EBX,EAX
0040D2A7  PUSH EAX
0040D2A8  CALL DWORD PTR SS:[EBP+4033E4]                 ; kernel32.GetModuleHandleA
0040D2AE  OR EAX,EAX                                     ; 是否已經載入?
0040D2B0  JNZ SHORT NOTEPAD.0040D307
0040D2B2  PUSH EBX
0040D2B3  CALL DWORD PTR SS:[EBP+4033E8]                 ; 沒有載入就呼叫kernel32.LoadLibraryA載入
0040D2B9  OR EAX,EAX                                     ; 載入成功?
0040D2BB  JNZ SHORT NOTEPAD.0040D307

        ..........
        ..........
        ..........

0040D307  MOV DWORD PTR SS:[EBP+4031F9],EAX              ; 儲存Dll的控制程式碼
0040D30D  MOV DWORD PTR SS:[EBP+4031FD],0                ; IAT地址表的偏移指標
0040D317  MOV EDX,DWORD PTR SS:[EBP+403465]              ; 映象基地址
0040D31D  MOV EAX,DWORD PTR DS:[ESI]                     ; OriginalFirstThunk
0040D31F  OR EAX,EAX
0040D321  JNZ SHORT NOTEPAD.0040D326
0040D323  MOV EAX,DWORD PTR DS:[ESI+10]                  ; FirstThunk
0040D326  ADD EAX,EDX                                    ; 加上映象基地址
0040D328  ADD EAX,DWORD PTR SS:[EBP+4031FD]
0040D32E  MOV EBX,DWORD PTR DS:[EAX]                     ; 引入函式名指標的偏移量形式
0040D330  MOV EDI,DWORD PTR DS:[ESI+10]                  ; FirstThunk
0040D333  ADD EDI,EDX                                    ; 加上映象基地址
0040D335  ADD EDI,DWORD PTR SS:[EBP+4031FD]
0040D33B  TEST EBX,EBX
0040D33D  JE NOTEPAD.0040D3DC                            ; 從這裡跳出填充IAT的迴圈
0040D343  TEST EBX,80000000                              ; 以序數引入?
0040D349  JNZ SHORT NOTEPAD.0040D352
0040D34B  ADD EBX,EDX                                    ; 加上映象基地址
0040D34D  ADD EBX,2                                      ; 跳過序號(hint)域
0040D350  JMP SHORT NOTEPAD.0040D367
0040D352  AND EBX,7FFFFFFF
0040D358  PUSH EBX
0040D359  PUSH DWORD PTR SS:[EBP+4031F9]
0040D35F  CALL DWORD PTR SS:[EBP+4033E0]
0040D365  JMP SHORT NOTEPAD.0040D37F
0040D367  PUSH EBX                                       ; 引入函式名的指標
0040D368  PUSH DWORD PTR SS:[EBP+4031F9]                 ; Dll控制程式碼
0040D36E  CALL DWORD PTR SS:[EBP+4033E0]                 ; kernel32.GetProcAddress
0040D374  JMP SHORT NOTEPAD.0040D37A
0040D376  MOV BYTE PTR DS:[EBX],0                        ; 清空函式名字串
0040D379  INC EBX
0040D37A  CMP BYTE PTR DS:[EBX],0                        ; 函式名是否結束?
0040D37D  JNZ SHORT NOTEPAD.0040D376
0040D37F  OR EAX,EAX                                     ; 引入函式地址
0040D381  JNZ SHORT NOTEPAD.0040D3CE

        ..........
        ..........
        ..........

0040D3CE  MOV DWORD PTR DS:[EDI],EAX                     ; 將函式地址裝入FirstThunk指向的IAT
0040D3D0  ADD DWORD PTR SS:[EBP+4031FD],4                ; IAT地址表的指標遞增
0040D3D7  JMP NOTEPAD.0040D317
0040D3DC  ADD ESI,14                                     ; 下一組IID
0040D3DF  MOV EDX,DWORD PTR SS:[EBP+403465]              ; 映象基地址
0040D3E5  JMP NOTEPAD.0040D292
0040D3EA  PUSH 30
0040D3EC  LEA EBX,DWORD PTR SS:[EBP+40324D]              ; 字串"Unregistered JDPack"
0040D3F2  PUSH EBX
0040D3F3  LEA EBX,DWORD PTR SS:[EBP+403261]              ; 字串"This file PACKED by Unregistered..."
0040D3F9  PUSH EBX
0040D3FA  PUSH 0
0040D3FC  CALL DWORD PTR SS:[EBP+4031D5]                 ; user32.MessageBoxA
0040D402  MOV EDX,DWORD PTR SS:[EBP+403465]              ; 映象基地址
0040D408  MOV EAX,DWORD PTR SS:[EBP+4031ED]              ; OEP偏移量
0040D40E  ADD EAX,EDX
0040D410  MOV DWORD PTR SS:[ESP+1C],EAX
0040D414  POPAD
0040D415  PUSH EAX                                       ; OEP入棧
0040D416  RETN                                           ; 進入原始程式程式碼

相關文章