2013年3月5日 星期二

基礎學手動脫殼


基礎學手動脫殼 (來源:網路文章轉載)

大家都知道現在殼的破解方法有很多種,隨著殼的增多,出現很多的破殼的工具,然而,對現在的新手來說手動脫殼的很少,我教大家手動脫殼—教大家手動脫UPX的殼。
今天我做實驗的是一個加了;UPX殼的記事本。好我們開始吧,廢話說了這麼多,大家著急了吧?
首先我給大家解釋一下殼的概念,其實殼就相當於一個保護的東西,它可以防止我們進行防編譯和修其中的內容,因為給軟件加了殼就好像給一些現實的動植物的殼差不多所以呢,在我們的軟件裡把在軟件裡面加的許多防止自己的軟件被非法修改和破壞的一些程式就叫做殼了,
首先給大家介紹一個工具PeID v0.92 它的作用就是檢測殼的類型,和檢測軟件是用什麼語言編寫的,
第一步:用PeID v0.92檢測一下殼的類型是upx的。UPX 0.89.6 - 1.02 / 1.05 - 1.24 -> Markus & Laszlo
第二步:手動脫殼,拿出工具Ollydbg v1.10 來進行脫殼。Ollydbg v1.10是一個功能非常強大的工具,在脫殼和除錯軟件時經常用到它,首先我們用Ollydbg v1.10載入加了upx殼的記事本,OK
040EF20 >PUSHAD ; 這裡是UPX殼的入口 一般UPX的入口都是PUSHAD 之所以把這個告訴大家 為了在大家遇到 多重殼的時候 做準備
0040EF21 MOV ESI,NOTEPAD.0040C015
0040EF26 LEA EDI,DWORD PTR DS:[ESI+FFFF4>
0040EF2C PUSH EDI
0040EF2D OR EBP,FFFFFFFF
0040EF30 JMP SHORT NOTEPAD.0040EF42 ; 跳40EF42
0040EF32 NOP
0040EF33 NOP
0040EF34 NOP
0040EF35 NOP
0040EF36 NOP
0040EF37 NOP
0040EF38 MOV AL,BYTE PTR DS:[ESI]
0040EF3A INC ESI
0040EF3B MOV BYTE PTR DS:[EDI],AL
0040EF3D INC EDI
0040EF3E ADD EBX,EBX
0040EF40 JNZ SHORT NOTEPAD.0040EF49
0040EF42 MOV EBX,DWORD PTR DS:[ESI] ; 跳到這裡
0040EF44 SUB ESI,-4
0040EF47 ADC EBX,EBX
0040EF49 JB SHORT NOTEPAD.0040EF38 ; 往回跳 不能跳
0040EF4B MOV EAX,1 ; 點這F4
0040EF50 ADD EBX,EBX
0040EF52 JNZ SHORT NOTEPAD.0040EF5B ; 跳到40EF5B
0040EF54 MOV EBX,DWORD PTR DS:[ESI]
0040EF56 SUB ESI,-4
0040EF59 ADC EBX,EBX
0040EF5B ADC EAX,EAX ; 來到這裡,繼續走
0040EF5D ADD EBX,EBX
0040EF5F JNB SHORT NOTEPAD.0040EF50
0040EF61 JNZ SHORT NOTEPAD.0040EF6C ; 繼續跳到40EF6C
0040EF63 MOV EBX,DWORD PTR DS:[ESI]
0040EF65 SUB ESI,-4
0040EF68 ADC EBX,EBX
0040EF6A JNB SHORT NOTEPAD.0040EF50
0040EF6C XOR ECX,ECX ; 跳到這了,繼續
0040EF6E SUB EAX,3
0040EF71 JB SHORT NOTEPAD.0040EF80 ; 繼續跳40EF80
0040EF73 SHL EAX,8
0040EF76 MOV AL,BYTE PTR DS:[ESI]
0040EF78 INC ESI
0040EF79 XOR EAX,FFFFFFFF
0040EF7C JE SHORT NOTEPAD.0040EFF2
0040EF7E MOV EBP,EAX
0040EF80 ADD EBX,EBX ; 到這了,繼續
0040EF82 JNZ SHORT NOTEPAD.0040EF8B ; 繼續跳40EF8B
0040EF84 MOV EBX,DWORD PTR DS:[ESI]
0040EF86 SUB ESI,-4
0040EF89 ADC EBX,EBX
0040EF8B ADC ECX,ECX ; 到這,繼續
0040EF8D ADD EBX,EBX
0040EF8F JNZ SHORT NOTEPAD.0040EF98 ; 跳40EF98
0040EF91 MOV EBX,DWORD PTR DS:[ESI]
0040EF93 SUB ESI,-4
0040EF96 ADC EBX,EBX
0040EF98 ADC ECX,ECX ; 到這裡
0040EF9A JNZ SHORT NOTEPAD.0040EFBC ; 跳40EFBC
0040EF9C INC ECX
0040EF9D ADD EBX,EBX
0040EF9F JNZ SHORT NOTEPAD.0040EFA8
0040EFA1 MOV EBX,DWORD PTR DS:[ESI]
0040EFA3 SUB ESI,-4
0040EFA6 ADC EBX,EBX
0040EFA8 ADC ECX,ECX
0040EFAA ADD EBX,EBX
0040EFAC JNB SHORT NOTEPAD.0040EF9D
0040EFAE JNZ SHORT NOTEPAD.0040EFB9
0040EFB0 MOV EBX,DWORD PTR DS:[ESI]
0040EFB2 SUB ESI,-4
0040EFB5 ADC EBX,EBX
0040EFB7 JNB SHORT NOTEPAD.0040EF9D
0040EFB9 ADD ECX,2
0040EFBC CMP EBP,-0D00 ; 到這裡
0040EFC2 ADC ECX,1
0040EFC5 LEA EDX,DWORD PTR DS:[EDI+EBP]
0040EFC8 CMP EBP,-4
0040EFCB JBE SHORT NOTEPAD.0040EFDC
0040EFCD MOV AL,BYTE PTR DS:[EDX]
0040EFCF INC EDX
0040EFD0 MOV BYTE PTR DS:[EDI],AL
0040EFD2 INC EDI
0040EFD3 DEC ECX
0040EFD4 JNZ SHORT NOTEPAD.0040EFCD ; 這個是往回跳 不能跳
0040EFD6 JMP NOTEPAD.0040EF3E ; 這個也往會跳,也不能跳
0040EFDB NOP
0040EFDC MOV EAX,DWORD PTR DS:[EDX] ; 點這裡F4
0040EFDE ADD EDX,4
0040EFE1 MOV DWORD PTR DS:[EDI],EAX
0040EFE3 ADD EDI,4
0040EFE6 SUB ECX,4
0040EFE9 JA SHORT NOTEPAD.0040EFDC
0040EFEB ADD EDI,ECX
0040EFED JMP NOTEPAD.0040EF3E ; 往會跳 不跳
0040EFF2 POP ESI ; 點這裡F4
0040EFF3 MOV EDI,ESI
0040EFF5 MOV ECX,0DD
0040EFFA MOV AL,BYTE PTR DS:[EDI]
0040EFFC INC EDI
0040EFFD SUB AL,0E8
0040EFFF CMP AL,1
0040F001 JA SHORT NOTEPAD.0040EFFA ; 往會跳 不跳
0040F003 CMP BYTE PTR DS:[EDI],0
0040F006 JNZ SHORT NOTEPAD.0040EFFA ; 這裡也往回跳
0040F008 MOV EAX,DWORD PTR DS:[EDI] ; 直接點這裡F4
0040F00A MOV BL,BYTE PTR DS:[EDI+4]
0040F00D SHR AX,8
0040F011 ROL EAX,10
0040F014 XCHG AH,AL
0040F016 SUB EAX,EDI
0040F018 SUB BL,0E8
0040F01B ADD EAX,ESI
0040F01D MOV DWORD PTR DS:[EDI],EAX
0040F01F ADD EDI,5
0040F022 MOV EAX,EBX
0040F024 LOOPD SHORT NOTEPAD.0040EFFF ; 這是一個循環,跳出它
0040F026 LEA EDI,DWORD PTR DS:[ESI+C000] ; 點這裡F4
0040F02C MOV EAX,DWORD PTR DS:[EDI]
0040F02E OR EAX,EAX
0040F030 JE SHORT NOTEPAD.0040F06E
0040F032 MOV EBX,DWORD PTR DS:[EDI+4]
0040F035 LEA EAX,DWORD PTR DS:[EAX+ESI+1>
0040F03C ADD EBX,ESI
0040F03E PUSH EAX
0040F03F ADD EDI,8
0040F042 CALL DWORD PTR DS:[ESI+12448]
0040F048 XCHG EAX,EBP
0040F049 MOV AL,BYTE PTR DS:[EDI]
0040F04B INC EDI
0040F04C OR AL,AL
0040F04E JE SHORT NOTEPAD.0040F02C
0040F050 MOV ECX,EDI
0040F052 PUSH EDI
0040F053 DEC EAX
0040F054 REPNE SCAS BYTE PTR ES:[EDI]
0040F056 PUSH EBP
0040F057 CALL DWORD PTR DS:[ESI+1244C]
0040F05D OR EAX,EAX
0040F05F JE SHORT NOTEPAD.0040F068
0040F061 MOV DWORD PTR DS:[EBX],EAX
0040F063 ADD EBX,4
0040F066 JMP SHORT NOTEPAD.0040F049 ; 不能跳
0040F068 CALL DWORD PTR DS:[ESI+12450]
0040F06E POPAD ; 關鍵點 對應 PUSHAD 入口就在附近 F4點這裡
0040F06F JMP NOTEPAD.004010CC ; 跳到入口點 地址大跨度跳躍 40FXXX跳到了401XXX
=>
004010CC PUSH EBP ; 入口點OEP

程式加殼段地址一直在0040FXXX突然跳轉到00401XXX段
跨段跳躍時,一般都是在記憶體中脫殼完畢,
準備執行程式,手動脫殼就是要在入口將程式Dump出來。
轉到入口時一般都有Popad語句和開始的PUSHAD對應。

入口點OEP:4010CC好我們在這裡呢 前往4010草草然後點擊滑鼠右鍵點脫殼在當前的工作行程就脫殼成功了。
第三步:我們用ImportREC這個工具對脫殼的記事本修復一下。保證程式能正常執行。
第四步:我們用LordPE v1.4對原文件進行減肥。
第五步:再次檢查是否有殼。


軟件破解常用彙編指令

cmp a,b // 比較a與b
mov a,b // 把b值送給a值,使a=b
ret // 返回主程式
nop // 無作用,英文(no operation)簡寫,意思「do nothing」(機器碼90)
(用ultraedit打開編輯exe文件看到90相當彙編語句的nop)
call // 調用子程式,子程式以ret結尾
je或jz // 相等則跳(機器碼是74或84)
jne或jnz // 不相等則跳(機器碼是75或85)
jmp // 無條件跳(機器碼是EB)
jb // 若小於則跳
ja // 若大於則跳
jg // 若大於則跳
jge // 若大於等於則跳
jl // 若小於則跳
pop xxx // xxx出棧
push xxx // xxx壓棧

爆破無敵口訣

一條(跳)就死,九筒(90)就胡——(對應上面的2--修改為nop)
一條(跳)就胡,一餅(EB)伺候——(對應上面的1--修改為jmp)
(74) 變(75)
(84) 變 (85)
不懂不要緊,一定要先牢記,以後慢慢的理解。

沒有留言:

張貼留言

用APNIC找出台灣所有的IP位址