⑴ OD找到了程序入口點,怎麼脫殼啊
常見脫殼知識:1.PUSHAD (壓棧) 代表程序的入口點
2.POPAD (出棧) 代表程序的出口點,與PUSHAD想對應,一般找到這個OEP就在附近拉!
3.OEP:程序的入口點,軟體加殼就是隱藏了OEP(或者用了假的OEP),
只要我們找到程序真正的OEP,就可以立刻脫殼。
開始正式介紹方法啦!!
方法一:
1.用OD載入,不分析代碼!
2.單步向下跟蹤F8,是向下跳的讓它實現
3.遇到程序往回跳的(包括循環),我們在下一句代碼處按F4(或者右健單擊代碼,選擇斷點——運行到所選)
4.綠色線條表示跳轉沒實現,不用理會,紅色線條表示跳轉已經實現!
5.如果剛載入程序,在附近就有一個CALL的,我們就F7跟進去,這樣很快就能到程序的OEP
6.在跟蹤的時候,如果運行到某個CALL程序就運行的,就在這個CALL中F7進入
7.一般有很大的跳轉,比如 jmp XXXXXX 或者 JE XXXXXX 或者有RETE的一般很快就會到程序的OEP。
方法二:
ESP定理脫殼(ESP在OD的寄存器中,我們只要在命令行下ESP的硬體訪問斷點,就會一下來到程序的OEP了!)
1.開始就點F8,注意觀察OD右上角的寄存器中ESP有沒出現。
2.在命令行下:dd 0012FFA4(指在當前代碼中的ESP地址),按回車!
3.選種下斷的地址,下硬體訪問word斷點。
4.按一下F9運行程序,直接來到了跳轉處,按下F8,到達程序OEP,脫殼
方法三:
內存跟蹤:
1:用OD打開軟體!
2:點擊選項——調試選項——異常,把裡面的忽略全部√上!CTRL+F2重載下程序!
3:按ALT+M,DA 打開內存鏡象,找到第一個.rsrc.按F2下斷點,
然後按SHIFT+F9運行到斷點,接著再按ALT+M,DA 打開內存鏡象,找到.RSRC上面的CODE,按
F2下斷點!然後按SHIFT+F9,直接到達程序OEP,脫殼!
方法四:
一步到達OEP(前輩們總結的經驗)
1.開始按Ctrl+F,輸入:popad(只適合少數殼,包括ASPACK殼),然後按下F2,F9運行到此處
2.來到大跳轉處,點下F8,脫殼之!
方法五:
1:用OD打開軟體!
2:點擊選項——調試選項——異常,把裡面的√全部去掉!CTRL+F2重載下程序!
3:一開是程序就是一個跳轉,在這里我們按SHIFT+F9,直到程序運行,記下從開始按F9到程序
運行的次數!
4:CTRL+F2重載程序,按SHIFT+F9(次數為程序運行的次數-1次
5:在OD的右下角我們看見有一個SE 句柄,這時我們按CTRL+G,輸入SE 句柄前的地址!
6:按F2下斷點!然後按SHIFT+F9來到斷點處!
7:去掉斷點,按F8慢慢向下走!
8:到達程序的OEP,脫殼
linux很少有需要crack的軟體,所以最近總是自娛自樂。自己寫的軟體自己破著玩但是由於都是知道自己的手段,沒有什麼意思。真的希望有高手們寫些crackme for linux 。
最近看了看windows的脫殼大致的理解了脫殼的原理,之前沒有怎麼接觸脫殼,通常只是選擇沒有殼的軟體看看。在linux下的殼沒有找到幾個。只找到了一個upx的殼,在windows下是個弱殼。實際上在linux下面也是弱殼,完全可以使用"upx -d"的命令解決問題。但我總是喜歡自己手動的。呵呵....純屬於自娛自樂。
ok,開始我們的linux的upx的脫殼之旅.........
我在選擇工具的時候花了很多時間,忽然發現GDB在upx面前是那麼的蒼白無力...也終於知道為什麼有人說GDB不適合做逆向了...雖然軟體在調試器里可以正常於運行,正常下斷。但是根本無法查看反匯編的代碼.......。
無奈無奈....使用傳說中最好的工具 IDA 為此我特地簡單的學習了一下IDC腳本的使用方法...
沒有什麼資料可以參考,是一件很不愉快的事情,因為不知道能不能成功。不管了,一步一步來吧...
我用「upx -d「 脫出了原來的文件,發現文件是全的,沒有任何部分丟失,所以我相信這些文件會出現在進程空間的某個時間的某個角落,這個很大的堅定了我手動脫殼的信心(但是實際上到這篇文章的結尾我也沒有能夠在找到完整的程序文件,但我相信理論上內存空間中應該會出現完整的文件的...)。
我的加殼軟體是我上次文章中用到做外掛的mines(掃雷游戲)。先找到了upx-3.03-i386_linux 軟體 附件中我會給出的免的度這篇文章的人去尋找了。
對我們目標軟體加殼,命令如下,的確是個好用的壓縮殼軟體,直接有54%的壓縮律。
代碼:
[jun@beijihuCom mpupx]$Content$nbsp;./upx mines
Ultimate Packer for eXecutables
Copyright (C) 1996 - 2008
UPX 3.03 Markus Oberhumer, Laszlo Molnar & John Reiser Apr 27th 2008
File size Ratio Format Name
-------------------- ------ ----------- -----------
13960 -> 7556 54.13% linux/elf386 mines
Packed 1 file.
[jun@beijihuCom mpupx]$Content$nbsp;
好了,我們開始調試他了,加了殼以後,一般的調試軟體已經對他無能為力了...
實驗一下GDB 和 DDD 的效果...以及objmp
readelf還可以正常使用,(僅限於一部分功能.呵呵,不詳談了...)
代碼:
[jun@beijihuCom mpupx]$Content$nbsp;readelf -e ./mines
ELF Header:
Magic: 7f 45 4c 46 01 01 01 03 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2』s complement, little endian
Version: ; 1 (current)
OS/ABI: UNIX - Linux
ABI Version: 0
Type: EXEC (Executable file)
Machine: Intel 80386
Version: 0x1
Entry point address: 0xc02598
Start of program headers: 52 (bytes into file)
Start of section headers: 0 (bytes into file)
Flags: 0x0
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 2
Size of section headers: 40 (bytes)
Number of section headers: 0
Section header string table index: 0
There are no sections in this file.
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
LOAD 0x000000 0x00c01000 0x00c01000 0x01d60 0x01d60 R E 0x1000
LOAD 0x0002fc 0x0804b2fc 0x0804b2fc 0x00000 0x00000 RW 0x1000
上面的輸出,我們可以發現他的入口點是0xc02598 這個入口點已經和GCC編譯出來的程序大不一樣了。實際上重「upx -d「脫出來的效果來看,原來的入口點基本上是不會改變的,也就是說我們的手動脫殼的時候軟體的入口點,載入方式都是和未加殼的軟體是一樣的...這一點又為我們的脫殼成功,增加了砝碼..
繼續....gdb 調試一下
代碼:
(gdb) b *0xc02598
Breakpoint 1 at 0xc02598
(gdb) r
Starting program: /home/jun/Crack/mpupx/mines
warning: shared library handler failed to enable breakpoint
(no debugging symbols found)
Breakpoint 1, 0x00c02598 in ?? ()
(gdb) disassemble
No function contains program counter for selected frame.
(gdb)
gdb看不反匯編代碼,暈了都不知道下一步的操作是什麼....看來是沒有什麼用了
祭起傳說中的逆向利器IDA.學西習了一下,簡單操作,我開始了調試之旅.
代碼:
[jun@beijihuCom mpupx]$Content$nbsp;idal ./mines
等到載入完成,會停在入口處,呵呵在游標在call上直接按F4,程序運行,停到了入口出
單步運行...實際上我沒有什麼辦法,不知道有什麼下好的方法下斷點,可以使這個簡單方法調試...
這邊我是這么想的,upx是壓縮殼,當他把執行權交給原目標程序的時候,必定會有一個大的跳轉,好多新手在windows脫殼,都是以這個為oep的標準的。linux應該也不會例外的...
F8單步到0xc025c8 跳到 oxc025d1 在 0xc025d3 又會跳回來。顯然是個循環。不在循環里浪費時間了。我們向下找找,下面有個retn返回。游標移到上面F4。實際上沒有什麼把握。只是蒙的,結果很好,沒有飛走.F8單步到了這里
繼續單步,retn到一個地方
不詳細分析了往下看。翻阿翻,不會這么巧吧.看見了 jmp dword ptr [edi]跳轉,這不會是傳說中的大跳吧。
不管直接F4到這里...哈哈很成功。
單步一下,跳到了這里。
不懂代碼的具體含義,但是明顯不是程序的入口...為什麼?單步....繼續
看到這里我忽然頓悟,這里是在做ld連接,不能讓他運行了,很可能是為了我們目標程序的運行進行共享庫的連接..會修改我們內存中的映像文件。這樣我們mp出來的就不是原來的干凈程序,因為我們沒有修復工具,比起windows裡面的PE修復要麻煩多了.....所以趕緊mp出來...
用來mp映像的idc腳本
代碼:
#include <idc.idc>
#define PT_LOAD 1
#define PT_DYNAMIC 2
static main(void)
{
auto ImageBase,StartImg,EndImg;//基址 08048000
auto e_phoff;
auto e_phnum,p_offset;//paddr 0xc 地址,pmemsz ox14大小,p_offset 0x4
auto i,mpfile;
ImageBase=0x08048000;
StartImg=0x08048000;
EndImg=0x0;
Message("%8x\n",Dword(ImageBase));
if (Dword(ImageBase)==0x7f454c46 || Dword(ImageBase)==0x464c457f )
{
if(mpfile=fopen("./mpfile","w+"))
{
e_phoff=ImageBase+Word(ImageBase+0x1c);
e_phnum=Word(ImageBase+0x2c);
for(i=0;i<e_phnum;i++)
{
if (Dword(e_phoff)==PT_LOAD || Dword(e_phoff)==PT_DYNAMIC)
{ p_offset=Dword(e_phoff+0x4);
StartImg=Dword(e_phoff+0xc);
EndImg=Dword(e_phoff+0xc)+Dword(e_phoff+0x14);
mp(mpfile,StartImg,EndImg,p_offset);
Message("mp LOAD%d ok.\n",i);
}
e_phoff=e_phoff+0x20;
}
fseek(mpfile,0x30,0);
fputc(0x00,mpfile);
fputc(0x00,mpfile);
fputc(0x00,mpfile);
fputc(0x00,mpfile);
fclose(mpfile);
}else Message("mp err.");
}
}
static mp(mpfile,startimg,endimg,offset)
{auto i;
auto size;
size=endimg-startimg;
fseek(mpfile,offset,0);
for ( i=0; i < size; i=i+1 )
{
fputc(Byte(startimg+i),mpfile);
}
}
改變文件的屬性,讓他可以運行。
代碼:
[jun@beijihuCom mpupx]$Content$nbsp;su
口令:
[root@beijihuCom mpupx]# chmod 755 ./mpfile
[root@beijihuCom mpupx]# ./mpfile
程序運行的很好..
總結:第一次在linux下手動脫殼,看上去文章中寫的很輕松,實際上在之前做了很多工作。包括ELF的載入等等。還有我發現如果程序的節表頭程序也能很好的運行,什麼的..
另外,我之調試的時候,實際經過很多挫折...沒有足夠的經驗嘛...不過些文章,截圖的時候都很順利..呵呵.共勉........
⑶ 如何給程序脫殼
你這個問題太過於籠統,其實破解中的脫殼是一個非常復雜的過程,有些殼很容易脫掉,在網上也可以找到相應的脫殼機,有些復雜的殼就需要手動脫殼,我覺得脫殼也可以成為一門復雜的學科,畢竟要破解就要學會脫殼,以前我也曾經看過很多關於脫殼的文章和視頻但是由於編程技術不是很好所以總是似是而非,有一日看到一個視頻,終於有了一個脫殼的思路,留下你的郵箱我可以給發過去,或者你加我的號碼240410420 ,這個視頻的文字教程如下:
脫殼多種方法總結篇
一.脫殼基礎知識要點
1.PUSHAD :(壓棧) 代表程序的入口點
2.POPAD :(出棧) 代表程序的出口點,與PUSHAD想對應.看到這個,就說明快到OEP了.
3.OEP:程序的入口點,軟體加殼就是隱藏OEP.而我們脫殼就是為了找OEP.
二.脫殼調試過程中辨認快到OEP的簡單方法
下面二個條件是快到OEP的共同現象:
若出現下面情況時,說明OEP就要到了:
1. OD跟蹤過程中如果發現:
popad
popfd
或
popad
2.同時,緊接著,有retn ,jmp等其它跳轉指令,發生跨段跳躍時.
說明OEP馬上到了.
三.脫殼必需牢記的要領
1.單步往前走,不要讓程序向上走,遇到向上跳時,在下一句按F4,運行到所選.
2.剛載入程序,在附近就call時,我們按F7跟進去.
3.若跟蹤時,運行某個call程序就運行時,這個call也用F7進入.
4.在跟蹤時,出現比如 jmp XXXXXX 或者 JE XXXXXX 或者有RETN同時發生大跨段跳轉時,說明很快就到OEP了.
四.常用脫殼方法總結
------------------
方法一:單步跟蹤法
------------------
介紹:這是最通用的方法,對於未知殼,基本都用這種方法,這種方法過程比較麻煩,要一步一步的跟蹤分析,要有一定的耐心.
1.用OD載入,選"不分析代碼"
2.單步向下跟蹤按F8,實現向下的跳.不讓程序往回跳.
3.遇到程序往回跳的(包括循環),我們在下一句代碼處按F4(或者右健單擊代碼,選擇斷點——>運行到所選)
4.如果剛載入程序,在附近就有一個CALL的,我們就F7跟進去,不然程序很容易運行.
5.在跟蹤的時候,如果運行到某個CALL程序就運行的,就在這個CALL中F7進入.
6.一般遇到很大的跳轉(跨段跳),比如 jmp XXXXXX 或 JE XXXXXX 或有RETN的一般很快就會到程序的OEP。
-----------------
方法二:ESP定律法(ESP與EIP都為紅色)
-----------------
介紹: 這種方法可以脫大部的壓縮殼和少數加密殼,操作起來比較簡單,脫殼速度也相對比較快.
1.開始就點F8向下走,注意觀察OD右上角的寄存器中ESP有沒突現(變成紅色)
2.在命令行下:dd XXXXXXXX(指在當前代碼中的ESP地址,或者hr
XXXXXXXX),按回車!
3.選中下斷的地址,斷點--->硬體訪--->WORD斷點。
4.按一下F9運行程序,直接來到了跳轉處,按下F8向下走,就到達程序OEP。
-----------------
方法三:內存鏡像法
-----------------
介紹:也是一種比較好用的脫殼方法,大部分的壓縮殼和加密殼用內存鏡像法能快速脫掉.非常實用.
1.用OD打開,設置選項——調試選項——異常,忽略所有異常(也就是把裡面的忽略全部√上),然後CTRL+F2重載下程序!
2.按ALT+M,打開內存鏡象,找到程序的第一個.rsrc.按F2下斷點,然後按SHIFT+F9運行到斷點.
3.接著再按ALT+M,打開內存鏡象,找到程序的第一個.rsrc.上面的.CODE,按F2下斷點!然後按SHIFT+F9,直接到達程序OEP!
另外:加入內存模塊中看到多個PE代碼就從第一個PE下面的代碼下斷點,shift+F9,單步進行,看到INC 的地址,查找到這個地址一般就為程序入口,可能會因為有多個PE所以沒有解密,單步進行知道程序返回到這個入口,然後脫殼
----------------
方法四:一步到OEP
----------------
介紹:這是一種巧方法,脫殼速度最快,前提是要知道這個殼的特徵,利用這種殼的共性快速找到程序的OEP.這種方法只用於少數殼.
1.開始按Ctrl+F,輸入:popad,然後按下F2下斷,按F9運行到此處.
2.很快來到大跳轉,按F8向下走,來到OEP.
----------------
方法五:利用內存異常(選項--異常,中下面勾都去掉)
----------------
shift+F9 幾次 運行後記住運行了幾次後打開的軟體
重新導入,shift+F9 運行比剛才少一次,觀察od右下角SE異常,記下前面地址,ctrl+G,輸入這個地址
F2下斷點,shift+F9運行到此處,取消斷點然後單步F7跟蹤到oep入口處,LE修改大小然後轉存,然後用ImportRE修改OEP,然後將剛才轉存的文件輸入即可。