005 NsPack 1.4 之附加数据初探
文章目錄
- 查殼
- OD脫殼
- 修復導入表
- 處理附加數據
- 關于附加數據
- NO.1
- NO.2
- NO.3
查殼
拿到樣本之后先查殼 發現是NsPack 后面還有個Overlay 看到這個就要警惕了 說明PE程序尾部有附加數據
OD脫殼
載入OD之后在入口點發現了pushfd和pushad 于是采用最快的脫殼方法
使用Ctrl+S鍵 查找所有命令
查找對應的兩條命令
在jmp的地方下斷點 F7就能到達OEP 之后dump文件
修復導入表
這一次我們使用LoadPE脫殼 選中目標進程 依次執行下面兩個步驟
接著使用ImportREC修復導入表
查找到的IAT只有兩條 明顯有問題 直接dump文件
運行之后 顯示文件中的數據無效 應該是剛剛的附加數據的問題
處理附加數據
將原程序用LoadPE查看 計算出PE文件的結束位置 即ROffset+RSize=0xCA00
將目標程序拖進010Edit 找到0xCA00的位置 右鍵選擇 標記選擇開始
然后拖到最下面 右鍵選擇 標記選擇結束 復制數據
接著打開已經脫殼修復好的文件 拖到文件末尾 粘貼數據 保存
程序正常運行 脫殼完成
關于附加數據
關于附加數據 不同的殼情況也不一樣 總的來說 會有三種情況
NO.1
有些殼雖然有overlay但是卻不用特別處理 因為他根本就沒有用到過這些數據
NO.2
為什么有些殼要定位指針? 所謂的dump就是把內存中的數據轉儲到磁盤 dump下來之后 文件對齊和內存對齊粒度不一樣 overlay數據的起始地址就相應的發生了改變 所以在這個時候直接粘貼附加數據是行不通的 當需要重設指針的時候需要在脫殼后的程序的SetFilePointer下斷點 然后對原先的文件指針進行棧回溯跟蹤 一直往上找到賦值的位置 然后修改會正確的指針 就可以了
NO.3
但是為什么有些殼可以直接粘貼overlay數據呢 這是因為目標程序在使用附加數據的時候需要用到兩個函數 一個是CreateFile SetFilePointer 一個用于打開文件 一個用于設置文件指針
DWORD SetFilePointer(HANDLE hFile, //在用CreateFileA打開后得到的文件句柄LONG lDistanceToMove, //要移動的距離,這個是低32位PLONG lpDistanceToMoveHigh, //要移動的距離,這是高32位,要注意這是一個指向數據的指針DWORD dwMoveMethod //表示指針開始的位置);使用這個函數的時候會出現一種情況 就是講第四個參數直接設置為FILE_END 然后將第二個參數設置為一個負值 負數表示向前移動 FILE_END表示設置到文件末尾 而附加數據無論在原來未脫殼的文件中和還是在脫殼的文件中,因為我們復制的是整個overlay區域,他的overlay部分的數據對于最后的一個字節的距離是不變的。他每次都用FILE_END當然我們這樣復制就不需要重定位指針了,也就是說即使我們把原來的文件(從0地址開始)全部復制到脫殼后的文件中也是能夠運行的,因為他是靠與最后的地址的距離來定位讀取數據。換個說法,如果這個時候你把最后一個數據刪掉,或者少復制哪怕是一個字節,就不能運行了。這也是我們為什么要先修復導入表的原因
總結:也就是說如果你把附加數據復制到脫殼后的程序發現能夠運行,呵呵~恭喜你,你碰巧遇到用FILE_END為指針的程序。
關于附加數據可以去看Lenux大神的淺談脫殼中的附加數據問題(overlay) 附上看雪鏈接 以上三個問題也是我從這篇文章中得到答案的
https://bbs.pediy.com/thread-9182.htm
需要相關文件可以到我的Github下載:https://github.com/TonyChen56/Unpack-Practice
總結
以上是生活随笔為你收集整理的005 NsPack 1.4 之附加数据初探的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 160个Crackme009
- 下一篇: 160个Crackme010