指令碼實現三次記憶體斷點法快速搞定Telock0.96+Aspack兩層殼

看雪資料發表於2015-11-15

標 題:指令碼實現三次記憶體斷點法快速搞定Telock0.96+Aspack兩層殼

發信人:David 

時 間:2004-12-28,13:43 

詳細資訊: 



【脫文標題】 三次記憶體斷點法快速搞定Telock0.96+Aspack兩層殼

【脫文作者】 weiyi75[Dfcg]
 
【作者郵箱】 weiyi75@sohu.com
 
【作者主頁】 Dfcg官方大本營
 
【使用工具】 Peid,Ollydbg,LoadPe,Imprec1.42,Freeres
 
【破解平臺】 Win2000/XP
 
【軟體名稱】 系統管家 V2.71
 
【下載地址】 http://www.skycn.com/soft/11570.html
 
【軟體簡介】 系統管家是一款強大的作業系統設定軟體。個性化的設定滿足初學者及設定高手們的需求。系統管家不但為您提供從桌面、個性、安全、網路、最佳化等方面的設定,它還包攬了系統登錄檔的清理、維護、備份及還原,系統垃圾檔案、軟體、ActiveX無效元件的清理及維護等工作。您是否還在為系統需要同時安裝多種設定、維護軟體互補而煩惱?系統管家可以為您的Windows98/2000/ME/XP/2003作業系統提供全方位的服務!系統管家內建的系統資訊檢測可顯示作業系統及硬體裝置的的大量資訊,並且集合了程式管理、記憶體整理工具軟體。目前系統管家提供了桌面設定、開始選單、工作列、輸入法、視窗介面、系統資訊、OEM資訊、個性資料夾、安全設定、多使用者、密碼策略、控制皮膚、安全視窗、登錄檔備份/還原、磁碟隱藏、偽裝檔案、隱藏特殊專案、自動執行、系統啟動、檔案系統、儲存系統、程式加速、多媒體、網路加速、IE瀏覽器、後臺服務、登錄檔清理、磁碟清理、軟體清理、元件清理等功能設定。 
 
【軟體大小】 1852 KB
 
【加殼方式】 Telock0.96+Aspack
 
【脫殼宣告】 我是一隻小菜鳥,偶得一點心得,願與大家分享:)
 
--------------------------------------------------------------------------------
 
【脫殼內容】

首先Peid查殼,tElock 0.96 -> tE!,然後用OD載入程式,Alt+M檢視區段,發現裡層還有一層Aspack。

Telock0.98我們在進階篇看過,比較麻煩,斷點不能亂下,如普通Int3斷點,硬體斷點都不能下。但還是可以透過記憶體斷點中斷的,Telock0.96較Telock0.98較弱。

OD載入程式,不忽略無效指令異常和記憶體異常。 

首先火力探測Telock有一次記憶體異常和2次無效指令異常然後程式執行。

重新載入程式。

0053CBA2 >^\E9 59E4FFFF     JMP NSSetWin.0053B000  //外殼入口
0053CBA7    0000            ADD BYTE PTR DS:[EAX],AL
0053CBA9    0000            ADD BYTE PTR DS:[EAX],AL
0053CBAB    0000            ADD BYTE PTR DS:[EAX],AL
0053CBAD    00D3            ADD BL,DL
0053CBAF    2BA3 0FEECB13   SUB ESP,DWORD PTR DS:[EBX+13CBEE0F]
0053CBB5    0000            ADD BYTE PTR DS:[EAX],AL
0053CBB7    0000            ADD BYTE PTR DS:[EAX],AL
0053CBB9    0000            ADD BYTE PTR DS:[EAX],AL
0053CBBB    0000            ADD BYTE PTR DS:[EAX],AL
0053CBBD    000E            ADD BYTE PTR DS:[ESI],CL
0053CBBF    CC              INT3
....................................................................

無效指令異常,必須Shift+F9過

0053B6A8    8DC0            LEA EAX,EAX                              ; 非法使用暫存器
0053B6AA    74 03           JE SHORT NSSetWin.0053B6AF
0053B6AC    CD 20           INT 20
0053B6AE    64:67:8F06 0000 POP DWORD PTR FS:[0]
0053B6B4    EB 02           JMP SHORT NSSetWin.0053B6B8
0053B6B6    CD 20           INT 20
0053B6B8    59              POP ECX
0053B6B9    61              POPAD
0053B6BA    F5              CMC
0053B6BB    8D7415 00       LEA ESI,DWORD PTR SS:[EBP+EDX]
0053B6BF    83C2 22         ADD EDX,22
0053B6C2    8BFE            MOV EDI,ESI
0053B6C4    B9 80120000     MOV ECX,1280
0053B6C9    2ADB            SUB BL,BL
0053B6CB    AC              LODS BYTE PTR DS:[ESI]
0053B6CC    32C3            XOR AL,BL
0053B6CE    FEC0            INC AL
....................................................................

記憶體異常,Shift+F9

0053BBA6    CD 68           INT 68
0053BBA8    66:05 7B0C      ADD AX,0C7B
0053BBAC    66:48           DEC AX
0053BBAE    74 55           JE SHORT NSSetWin.0053BC05
0053BBB0    8D85 450B0000   LEA EAX,DWORD PTR SS:[EBP+B45]
0053BBB6    894424 04       MOV DWORD PTR SS:[ESP+4],EAX
0053BBBA    64:67:8926 0000 MOV DWORD PTR FS:[0],ESP
0053BBC0    EB 1F           JMP SHORT NSSetWin.0053BBE1
0053BBC2    CD 20           INT 20
0053BBC4    8B6424 08       MOV ESP,DWORD PTR SS:[ESP+8]
0053BBC8    8B6C24 08       MOV EBP,DWORD PTR SS:[ESP+8]
0053BBCC    8D85 7A0B0000   LEA EAX,DWORD PTR SS:[EBP+B7A]
0053BBD2    50              PUSH EAX
0053BBD3    EB 01           JMP SHORT NSSetWin.0053BBD6
0053BBD5    E8 81AD291C     CALL 1C7D695B
0053BBDA    0000            ADD BYTE PTR DS:[EAX],AL
0053BBDC    E7 25           OUT 25,EAX                               ; I/O 命令
0053BBDE    A9 FEC3EB01     TEST EAX,1EBC3FE
0053BBE3    EB 33           JMP SHORT NSSetWin.0053BC18
....................................................................

無效指令異常

0053C6BD    8DC0            LEA EAX,EAX                              ; 非法使用暫存器
0053C6BF    EB 01           JMP SHORT NSSetWin.0053C6C2
0053C6C1    EB 68           JMP SHORT NSSetWin.0053C72B
0053C6C3    33C0            XOR EAX,EAX
0053C6C5  - EB FE           JMP SHORT NSSetWin.0053C6C5
0053C6C7    FFE4            JMP ESP
0053C6C9    CD 20           INT 20
0053C6CB    8B6424 08       MOV ESP,DWORD PTR SS:[ESP+8]
0053C6CF    33C0            XOR EAX,EAX
0053C6D1    FF6424 08       JMP DWORD PTR SS:[ESP+8]
0053C6D5  - E9 58508304     JMP 04D71732
0053C6DA    24 37           AND AL,37
0053C6DC    FFE0            JMP EAX
0053C6DE    CD 20           INT 20
0053C6E0    64:8F00         POP DWORD PTR FS:[EAX]
0053C6E3    58              POP EAX
0053C6E4    EB 02           JMP SHORT NSSetWin.0053C6E8
....................................................................

繼續Shift+F9就略過第二層殼Aspack執行了。

Alt+M開啟記憶體映象。

記憶體映象

地址       大小       Owner      區段       包含          型別   訪問      初始訪問  對映為

00400000   00001000   NSSetWin              PE header     Imag   RW        RWE
00401000   00001000   NSSetWin   .text      code          Imag   RW        RWE
00402000   00001000   NSSetWin   .rdata     data          Imag   RW        RWE
00403000   00133000   NSSetWin   .ecode                   Imag   RW        RWE
00536000   00002000   NSSetWin   .rsrc      resources     Imag   RW        RWE
00538000   00002000   NSSetWin   .aspack                  Imag   RW        RWE  //直接去Aspack必經之路下記憶體訪問斷點,Shift+F9執行立即中斷。
0053A000   00001000   NSSetWin   .adata                   Imag   RW        RWE
0053B000   00004000   NSSetWin              SFX,imports,  Imag   RW        RWE 

當前位置0053C6E4還在0053B000Telock外殼段內,我們知道組合殼或單層殼的解壓順序是由下往上執行的。

00538001    60              PUSHAD    //進入第二層殼Aspack入口
00538002    E8 03000000     CALL NSSetWin.0053800A  可以到這裡後用esp定律到Aspack出口。
00538007  - E9 EB045D45     JMP 45B084F7
0053800C    55              PUSH EBP
0053800D    C3              RETN
0053800E    E8 01000000     CALL NSSetWin.00538014
00538013    EB 5D           JMP SHORT NSSetWin.00538072
00538015    BB EDFFFFFF     MOV EBX,-13
0053801A    03DD            ADD EBX,EBP
0053801C    81EB 00801300   SUB EBX,138000
00538022    83BD 22040000 0>CMP DWORD PTR SS:[EBP+422],0
00538029    899D 22040000   MOV DWORD PTR SS:[EBP+422],EBX
0053802F    0F85 65030000   JNZ NSSetWin.0053839A
00538035    8D85 2E040000   LEA EAX,DWORD PTR SS:[EBP+42E]
0053803B    50              PUSH EAX
0053803C    FF95 4D0F0000   CALL DWORD PTR SS:[EBP+F4D]
..................................................................

再次

Alt+M開啟記憶體映象。

記憶體映象

地址       大小       Owner      區段       包含          型別   訪問      初始訪問  對映為

00400000   00001000   NSSetWin              PE header     Imag   RW        RWE
00401000   00001000   NSSetWin   .text      code          Imag   RW        RWE
00402000   00001000   NSSetWin   .rdata     data          Imag   RW        RWE  //先在data過渡段下記憶體訪問斷點,F9執行。
00403000   00133000   NSSetWin   .ecode                   Imag   RW        RWE
00536000   00002000   NSSetWin   .rsrc      resources     Imag   RW        RWE
00538000   00002000   NSSetWin   .aspack                  Imag   RW        RWE  
0053A000   00001000   NSSetWin   .adata                   Imag   RW        RWE
0053B000   00004000   NSSetWin              SFX,imports,  Imag   RW        RWE 
..................................................................

0053875F    8A18            MOV BL,BYTE PTR DS:[EAX]  //記憶體訪問中斷。
00538761    40              INC EAX
00538762    885C24 0C       MOV BYTE PTR SS:[ESP+C],BL
00538766    8902            MOV DWORD PTR DS:[EDX],EAX
00538768    8B42 08         MOV EAX,DWORD PTR DS:[EDX+8]
0053876B    8B7C24 0C       MOV EDI,DWORD PTR SS:[ESP+C]
0053876F    C1E0 08         SHL EAX,8
00538772    81E7 FF000000   AND EDI,0FF
00538778    0BC7            OR EAX,EDI
0053877A    8B7A 04         MOV EDI,DWORD PTR DS:[EDX+4]
0053877D    03FE            ADD EDI,ESI
0053877F    8942 08         MOV DWORD PTR DS:[EDX+8],EAX
00538782    8BC7            MOV EAX,EDI
00538784    897A 04         MOV DWORD PTR DS:[EDX+4],EDI
00538787    3BC1            CMP EAX,ECX
00538789  ^ 73 D2           JNB SHORT NSSetWin.0053875D
..................................................................

再次

Alt+M開啟記憶體映象。

記憶體映象

地址       大小       Owner      區段       包含          型別   訪問      初始訪問  對映為

00400000   00001000   NSSetWin              PE header     Imag   RW        RWE
00401000   00001000   NSSetWin   .text      code          Imag   RW        RWE  //對401000 Code段下記憶體訪問斷點,F9執行。
00402000   00001000   NSSetWin   .rdata     data          Imag   RW        RWE  
00403000   00133000   NSSetWin   .ecode                   Imag   RW        RWE
00536000   00002000   NSSetWin   .rsrc      resources     Imag   RW        RWE
00538000   00002000   NSSetWin   .aspack                  Imag   RW        RWE  
0053A000   00001000   NSSetWin   .adata                   Imag   RW        RWE
0053B000   00004000   NSSetWin              SFX,imports,  Imag   RW        RWE 
..................................................................

00401000      E8            DB E8  //到達這裡,右鍵-分析-分析程式碼還原彙編指令。
00401001      06            DB 06
00401002      00            DB 00
00401003      00            DB 00
00401004      00            DB 00
00401005      50            DB 50                                    ;  CHAR 'P'
00401006      E8            DB E8
00401007      A1            DB A1
00401008      01            DB 01
00401009      00            DB 00
0040100A      00            DB 00
0040100B      55            DB 55                                    ;  CHAR 'U'
0040100C      8B            DB 8B
0040100D      EC            DB EC
0040100E      81            DB 81
0040100F      C4            DB C4
00401010      F0            DB F0
00401011      FE            DB FE
..................................................................

00401000   .  E8 06000000   CALL NSSetWin.0040100B  //又是易語言,和系統風雲一樣的。
00401005   .  50            PUSH EAX                                 ; /ExitCode
00401006   .  E8 A1010000   CALL NSSetWin.004011AC                   ; \ExitProcess
0040100B  /$  55            PUSH EBP  //可以在401000脫殼,但我喜歡F7到這裡然後用Loadpe脫殼,標準一些。
0040100C  |.  8BEC          MOV EBP,ESP
0040100E  |.  81C4 F0FEFFFF ADD ESP,-110
00401014  |.  EB 6D         JMP SHORT NSSetWin.00401083
00401016  |.  6B 72 6E 6C 6>ASCII "krnln.fnr",0
00401020  |.  6B 72 6E 6C 6>ASCII "krnln.fne",0
0040102A  |.  47 65 74 4E 6>ASCII "GetNewSock",0
00401035  |.  53 6F 66 74 7>ASCII "Software\FlySky\"
00401045  |.  45 5C 49 6E 7>ASCII "E\Install",0
0040104F  |.  50 61 74 68 0>ASCII "Path",0
..................................................................

執行ImprotREC,選中程式程式,OEP處填入00100B,點自動搜尋,然後點“獲取輸入表”,看見尾部被Telock填充了一個垃圾指標,Telock喜歡填垃圾指標,這個是無法修復的,直接用剪刀剪掉。

然後Loadpe編輯脫殼檔案,刪除aspack,adata 兩個Aspack的垃圾區段,殼都脫了,還要它們幹什麼?重建Pe正常執行。

然後用Freeres載入脫殼程式提示資源被壓縮,真煩人,和Upx一樣,資源脫殼後沒有釋放,於是Freeres釋放資源,仍然正常執行。

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

【版權宣告】 本文純屬技術交流, 轉載請註明作者並保持文章的完整, 謝謝!


我以二哥的三次記憶體斷點法快速搞定Telock0.96+Aspack兩層殼作範文

目的是用指令碼使任意區段設記憶體訪問斷點

首先還是要寫指令碼你必須會手動脫這個殼。

要知道你想哪些區段的記憶體斷點,如區段1,區段4,區段2等

這個程式依次是

記憶體映象,專案 16  區段5
 地址=00538000
 大小=00002000 (8192.)
 Owner=NSSetWin 00400000
 區段=.aspack
 型別=Imag 01001002
 訪問=R
 初始訪問=RWE

記憶體映象,專案 13  區段2
 地址=00402000
 大小=00001000 (4096.)
 Owner=NSSetWin 00400000
 區段=.rdata
 包含=data
 型別=Imag 01001002
 訪問=R
 初始訪問=RWE


記憶體映象,專案 12   區段1
 地址=00401000
 大小=00001000 (4096.)
 Owner=NSSetWin 00400000
 區段=.text
 包含=code
 型別=Imag 01001002
 訪問=R
 初始訪問=RWE

記憶體斷點引數,主要是兩個

區段虛擬地址

區段大小

在指令碼中實現主要用這個模組形式

gmi eip,MODULEBASE      //模組基地址400000
mov imgbase,$RESULT
mov k,imgbase
add k,3C              
mov k,[k]
add k,imgbase         
add k,f8                 //第一區段名
add k,28                //第二區段名
add k,28               //第三區段名
add k,28              //第四區段名
add k,28             //第五區段名

對語法而言,舉個例子,隨便在某語句後面插入

log k

pause  類似int3

ret    類似int3

檢視記錄,然後命令列 d xxxxx

簡單分析一下,所有需要的東西都可以計算出來,這個沒有紮實的理論基礎光看不實際操作根本無法明白的。

004001A8  2E 74 65 78 74 00 00 00  .text...
004001B0  00 10 00 00 00 10 00 00  ......
004001B8  00 02 00 00 00 04 00 00  ......
004001C0  00 00 00 00 00 00 00 00  ........
004001C8  00 00 00 00 40 00 00 C0  ....@..

004001D0  2E 72 64 61 74 61 00 00  .rdata..  其中區段名,區段大小,虛擬地址盡在其中。
004001D8  00 10 00 00 00 20 00 00  .... ..
004001E0  00 02 00 00 00 06 00 00  ......
004001E8  00 00 00 00 00 00 00 00  ........
004001F0  00 00 00 00 40 00 00 C0  ....@..

004001F8  2E 65 63 6F 64 65 00 00  .ecode..
00400200  00 30 13 00 00 30 00 00  .0..0..
00400208  00 0E 04 00 00 08 00 00  .....
00400210  00 00 00 00 00 00 00 00  ........
00400218  00 00 00 00 40 00 00 C0  ....@..

00400220  2E 72 73 72 63 00 00 00  .rsrc...
00400228  00 20 00 00 00 60 13 00  . ...`.
00400230  00 02 00 00 00 16 04 00  .....
00400238  00 00 00 00 00 00 00 00  ........
00400240  00 00 00 00 40 00 00 C0  ....@..

00400248  2E 61 73 70 61 63 6B 00  .aspack.
00400250  00 20 00 00 00 80 13 00  . ....
00400258  00 0C 00 00 00 18 04 00  ......
00400260  00 00 00 00 00 00 00 00  ........
00400268  00 00 00 00 40 00 00 C0  ....@..

00400270  2E 61 64 61 74 61 00 00  .adata..
00400278  00 10 00 00 00 A0 13 00  ....?.
00400280  00 00 00 00 00 00 00 00  ........
00400288  00 00 00 00 00 00 00 00  ........
00400290  00 00 00 00 40 00 00 C0  ....@..

以下就是指令碼



// 三次記憶體斷點法指令碼製作演示
// 作者: Mr.David
// 主頁: www.chinadfcg.com

msg "請設定OD異常設定不忽略錯誤的或有特權的指令,其它全部忽略,然後從選單處繼續執行指令碼"

//pause

var cbase

gmi eip, CODEBASE
mov cbase, $RESULT    
log cbase            //記錄程式碼段基地址,一般是401000

var k1
var k1s
var k2
var k2s
var k5
var k5s
var imgbase

gmi eip,MODULEBASE      //模組基地址400000
mov imgbase,$RESULT
mov k1,imgbase
add k1,3C              
mov k1,[k1]
add k1,imgbase         
add k1,f8                 //第一區段名
mov k2,k1

add k1,8              //地址加8位元組的偏移就是區段大小      
mov k1,[k1]           //第一區段大小
log k1        

add k2,28            //第二區段名
mov k5,k2
log k2

mov k2s,k2
add k2s,4
mov k2s,[k2s]           
add k2s,imgbase       //第二區段虛擬地址

add k2,8              //地址加8位元組的偏移就是區段大小      
mov k2,[k2]           //第二區段大小
log k2       

add k5,28           
add k5,28  
add k5,28             //第五區段名
log k5

add k5,8              //地址加8位元組的偏移就是區段大小  
 
mov k5s,k5
add k5s,4
mov k5s,[k5s]           
add k5s,imgbase        //第五區段虛擬地址
log k5  

mov k5,[k5]           //第五區段大小
log k5       

eoe seh
esto

retn:

bprm k5s, k5            //一次記憶體斷點
esto

bprm k2s, k2          //二次記憶體斷點
run
 
bprm cbase, k1      //三次記憶體斷點
run

bpmc
an eip
ret

seh:             //異常處理

coe
esto

jmp retn  //處理完畢

相關文章