日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

逆向脱壳附加数据处理

發(fā)布時(shí)間:2023/12/10 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 逆向脱壳附加数据处理 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一、介紹:
什么是附加數(shù)據(jù)(overlay)摘自Lenus大神 實(shí)際當(dāng)中的overlay 其實(shí),overlay雖然大家在脫殼當(dāng)中覺得很陌生,但是他離我們并不遙遠(yuǎn)。在我們平時(shí)使用的軟件當(dāng)中,有一些軟件要處理一些數(shù)據(jù)流文件,比如 winamp。當(dāng)我們下載了mp3文件(數(shù)據(jù)文件),沒有播放器是不可能播放的,與此相關(guān)的還有很多,比如txt文件和notepad的關(guān)系也差不多。而這些數(shù)據(jù)文件被單獨(dú)的保存在硬盤上,當(dāng)我們使用notepad的打開功能的時(shí)候,就可以去讀取數(shù)據(jù)文件里面的東西了。 ? overlay又是什么意思呢? 他其實(shí)真正的意思就是取消打開功能,將這些需要讀取的數(shù)據(jù)放到pe文件的后面,讓程序自動(dòng)的運(yùn)行打開的功能。這樣的功能就變成了一個(gè)notepad的程序?qū)?yīng)只能打開一個(gè)文件。 ? 最典型的就是一些軟件可以把一些數(shù)據(jù)流文件生成exe文件,比如一些mp3生成器,flash生成器,以及我們用來做動(dòng)畫的S-demo。他們的作用就是將數(shù)據(jù)對(duì)pe進(jìn)行捆綁。(這樣做的結(jié)果也就是為什么我們對(duì)這些文件用UPX等pe壓縮工具卻不能壓縮他的原因 在我們對(duì)pe文件的overlay進(jìn)行分析,普及一下文件映射的知識(shí)。在pe里面,有所謂的文件偏移RA,文件偏移大小RS和與其對(duì)應(yīng)的虛擬地址偏移VA,虛擬地址偏移大小VS。
我們要深刻的理解以上的概念不是我這篇文章能說清楚的,但又是搞overlay必須得弄清楚的,于是我簡單的說明一下。
在我們的磁盤上的pe文件里面,排列著的數(shù)據(jù)在運(yùn)行的時(shí)候?qū)⒈挥吧涞絻?nèi)存空間。他們將被怎么映射呢?舉個(gè)例子:

例1:

一個(gè)pe文件中只有兩個(gè)區(qū)段(pe head不算)
第一個(gè)區(qū)段是.text VA=401000 VS=1000RA=200 RS=100
第二個(gè)區(qū)段是.data VA=402000 VS=1000RA=300 RS=100
假設(shè)我們打開winhex看到在文件偏移300處的情況是這樣的:
RA=2FF 處的數(shù)據(jù)是12RA=300處的數(shù)據(jù)是34

現(xiàn)在當(dāng)pe文件裝到內(nèi)存中,那么會(huì)出現(xiàn)什么結(jié)果呢。
1.文件偏移中的200開始的100個(gè)字節(jié)將被影射到內(nèi)存的401000開始的100個(gè)字節(jié),后面的F000個(gè)字節(jié)將用0填充。
2.文件偏移中的300開始的100個(gè)字節(jié)將被影射到內(nèi)存的402000開始的100個(gè)字節(jié),后面的F000個(gè)字節(jié)將用0填充。

也就是說,在磁盤是上相鄰的兩個(gè)數(shù)據(jù)12和34,在內(nèi)存空間中將分開得老遠(yuǎn),12在40102FF處,而34卻在402000處。

當(dāng)然這只是我自己隨便舉的一個(gè)極端的例子,實(shí)際上由于文件的對(duì)齊機(jī)制在磁盤上每個(gè)段的結(jié)束都是填充了大量的0

為什么要講這些
因?yàn)閰^(qū)段是一般將會(huì)被映射到內(nèi)存的,如果上面的例子中。將.data區(qū)段去掉。那么在磁盤上就將會(huì)留下從RA=300到RA=400其大小為100的數(shù)據(jù),不會(huì)被影射到內(nèi)存中。而這部分?jǐn)?shù)據(jù)就將被認(rèn)為是附加數(shù)據(jù)-overlay。 ? 二、實(shí)戰(zhàn) 【加殼方式】: UPX Inliner v1.0 by GPcH 【使用工具】: OllyDbg ? ?? ?? ?? ???PEID ? ?? ?? ?? ???Lord PE ? ?? ?? ?? ???WinHex ? ?? ?? ?? ???Imp Rec ? ?? ?? ?? ???Hex Wrokshop v6.5.1 【聲明】: 主要展現(xiàn)脫殼后附加數(shù)據(jù)的快速解決,沒有其他目的。?? ①、PEID看一下殼 ②、DetectItEasy V1.0看一下什么編譯器 然鵝,PE區(qū)段被改了,并看不出來 既然是UPX的殼,按照之前的文章步驟,脫殼吧 1、載入OD 2、 很明顯是UPX的殼,ESP定律走起~~(單步跟蹤、模擬跟蹤都可以的) ? 3、F8單步往下走,F9運(yùn)行程序,F8單步走,走, 4、 來到這,熟悉吧,右鍵分析-從模塊中刪除分析 ? 5、 來到了熟悉的OEP,對(duì)照oep看一下是什么語言 ? 6、 ? ?Vc++ 6.0的編譯器 ? 7、到達(dá)oep之后,下一步來脫殼 8、 復(fù)制oep,3831,再用Lordpe脫殼 ? 9、 修正鏡像大小,在轉(zhuǎn)存一下。 ? 10、 再用??修復(fù),不管能不能運(yùn)行都得修復(fù)一下 ? 11、修復(fù)完成后看一下殼子,打開程序運(yùn)行一下 ? 12、顯示是vc++6.0,說明程序已經(jīng)脫殼完成了 13、運(yùn)行一下 14、OH!Shit!! 15、不出所料,因?yàn)閯傞_始就出現(xiàn)了這個(gè)東西 敲黑板!!!! 1、overlay只是數(shù)據(jù)它是不映射到內(nèi)存的,它將被程序以打開自己的方式來讀取數(shù)據(jù) 2、只要不是區(qū)段里面包括的文件的大小,將被視為overlay. ? 那怎么辦呢,重點(diǎn)來了。。。。。。。。。。。。。 1、神器winhex 2、? 這個(gè)東西 3、將未脫殼的程序放進(jìn)去 4、 ? 5、首先,把滑輪拖到最底部,依次往上找,找到第一處很多00的地方 6、 ? 7、選擇00結(jié)束第一個(gè)字符(alt+1)到末尾最后一個(gè)字符(alt+2) 8、 ? 9、復(fù)制下來,關(guān)閉,拖入脫殼完成的文件 10、一直拉到最后,也是00很多的地方 11、 ? 12、在末尾粘貼未脫殼程序的那段 13、 ? 14、保存文件到脫殼后修復(fù)的文件 15、 ? 16、有的在win7/xp情況下保存完成后可能會(huì)出錯(cuò),版本不同 17、這是推薦使用Hex workshop ,使用方法與winhex一樣,在吾愛破解工具包里都有 18、? 運(yùn)行試一下,無錯(cuò)誤提示即可 使用lordpe,用PE編輯器打開加殼程序 依次打開區(qū)段,看到區(qū)段表 ? ☆【重要屬性介紹】 (1)Name :?這是一個(gè)8位的ASCII(不是Unicode內(nèi)碼),用來定義塊名,多數(shù)塊名以.開始(如.Text),這個(gè).實(shí)際上不是必需的,注意如果塊名超過了8個(gè)字節(jié),則沒有最后面的終止標(biāo)志NULL字節(jié),帶有$的區(qū)塊的名字會(huì)從編譯器里將帶有$的相同名字的區(qū)塊被按字母順序合并。 (2) VirtualSize:?指出實(shí)際的,被使用的區(qū)塊大小,是區(qū)塊在沒有對(duì)齊處理前的實(shí)際大小.如果VirtualSize > SizeOfRawData,那么SizeOfRawData是可執(zhí)行文件初始化數(shù)據(jù)的大小 (SizeOfRawData?– VirtualSize)的字節(jié)用0來填充.這個(gè)字段在OBJ文件中被設(shè)為0. (3)VirtualAddress:?該塊時(shí)裝載到內(nèi)存中的RVA,注意這個(gè)地址是按內(nèi)存頁對(duì)齊的,她總是SectionAlignment的整數(shù)倍,在工具中第一個(gè)塊默認(rèn)RVA為1000,在OBJ中為0。 (4)SizeofRawData:?該塊在磁盤中所占的大小,在可執(zhí)行文件中,該字段包括經(jīng)過FileAlignment調(diào)整后塊的長度。例如FileAlignment的大小為200h, 如果VirtualSize中的塊長度為19Ah個(gè)字節(jié),這一塊保存的長度為200h個(gè)字節(jié). (5) PointerToRawData:?該塊是在磁盤文件中的偏移,程序編譯或匯編后生成原始數(shù)據(jù),這個(gè)字段用于給出原始數(shù)據(jù)塊在文件的偏移,如果程序自裝載PE或COFF文件(而不是由OS裝載),這種情況,必須完全使用線性映像方法裝入文件,需要在該塊處找到塊的數(shù)據(jù)。 雖然編譯器自動(dòng)產(chǎn)生一系列標(biāo)準(zhǔn)的區(qū)塊,我們可以創(chuàng)建和命名自己的區(qū)塊,在VC++中可以使用: #pragma data_seg(“My_DATA”) 編譯器有個(gè)很搞笑的特征,看見兩個(gè)區(qū)塊相似的屬性的區(qū)塊,那么連接時(shí)就合并成一個(gè)區(qū)塊,這個(gè)取決于是否用/merge開關(guān) /merge .rdata = .text 我們只需要ROffset和Rsize,計(jì)算一下這兩個(gè)塊的大小 400+C600=CA00? ?? ?(16進(jìn)制下) 我們把未脫殼的程序放入HexWorkshop,CTRL+G轉(zhuǎn)到CA00處 l? ?C9 F6加上 10個(gè)字節(jié) l? ?CA 04減去 4個(gè)字節(jié) 所到達(dá)的地方都是CA 00 就來到我們之前往上找到00末尾的位置 從A5開始,一直到最后復(fù)制下來 打開脫殼之后修復(fù)的文件,拖入HEXWORKSHOP 在最后末尾處,粘貼剛剛復(fù)制的代碼 最后,保存一下,備份點(diǎn)一下,打開程序看一下能否正常運(yùn)行。OK,數(shù)據(jù)處理完畢 最后看一下殼子 殼子已經(jīng)脫掉,顯示附加數(shù)據(jù)不用管,之后載入od,看一下oep 具體原理研究可以去尋找Lenus大神的《淺談脫殼中的附加數(shù)據(jù)問題(overlay)》和《PE文件中區(qū)段的詳細(xì)分析?》這兩篇文章 ? 總結(jié): 1.簡單介紹什么是附加數(shù)據(jù) 2.overlay又是什么意思 3.文件映射知識(shí) 4.回顧ESP定律 5.Winhex、HEXWORKSHOP使用方法 6.兩種方法附加數(shù)據(jù)的處理 7.區(qū)段表小姿勢 附件我打包了:點(diǎn)擊查看

轉(zhuǎn)載于:https://www.cnblogs.com/ichunqiu/p/7262952.html

總結(jié)

以上是生活随笔為你收集整理的逆向脱壳附加数据处理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。