最近在看ob的脫殼教程,(天草殼世界),還有ximo的ob教程,今天利用空餘時間,終於把程式修復成功,記錄如下:
找到virtualalloc,virutalprotect,利用這幾個函式來找到重定位的地方,然後把重定位處理的**用xor來代替.
到偽oep,然後把重定位的整個記憶體段dump下來,整個pe也dump下來,此時不用關閉od.後面要修復一些tls段的資料.
用winhex把pedump.exe開啟,然後把1000h的位元組內容複製下來(因為pe檔案在32位機是以1000h對齊的),然後開啟dump下的記憶體段,把剛才複製的內容貼到0000起始的位置.儲存成unpack.exe
這裡的**段和資料段是完整的,但資源段尚未修復,於是可以從dump.exe裡提取資源,我這裡用resfixer,因為那個dt_fixres對我dump下來的pe程式那些rva不能填充到我需要的數字,於是選了resfixer.這裡關鍵是rva的填寫,因為最先dump下來的記憶體映像大小是55000h,於是這裡new section rva填56000,file alignment填1000h,因為從記憶體中dump下來就以這種對齊方式
dump出資源後,就用pe編輯器把資源段加上,然後修復相應的rva欄位(如果有需要).還有資源目錄表中的rva也作相應更改.
此時執行程式,出錯了.最初想到的是tls表沒修復,於是開啟修復的檔案,檢視tls目錄,發現是亂碼,於是從加殼檔案中得到資訊,tls大小為18h,於是把tls段從409000h這個dump下來,修補填上.tls欄位重新計算填上,重新執行,ok.
最後,tls段修復也可以不dump這個段,直接找個大量0000的空位應該也是可以的.
共享可寫節包含重定位 理解重定位
一 段的概念 段是程式的組成元素。將整個程式分成乙個乙個段,並且給每個段起乙個名字,然後在鏈結時就可以用這個名字來指示這些段,使得這些段排布在合適的位置。乙個程式通常包含以下五個段 段 text 存放 指令 唯讀資料段 rodata 存放有初始值並且const修飾的全域性類變數 全域性變數或stat...
13 整數去重
總時間限制 1000ms 記憶體限制 65536kb 描述給定含有n個整數的序列,要求對這個序列進行去重操作。所謂去重,是指對這個序列中每個重複出現的數,只保留該數第一次出現的位置,刪除其餘位置。輸入輸入包含兩行 第一行包含乙個正整數n 1 n 20000 表示第二行序列中數字的個數 第二行包含n個...
什麼是重定位
6 1 儲存器的基本概念 主儲存器管理仍然是今天作業系統十分重要的內容 能否合理而有效的使用主存,在很大成度上反映了作業系統的效能,並直接影響到整個計算機系統作用的發揮。6.1.1 儲存器的層次 目前在許多計算機系統中,採用 儲存器結構,即高速緩衝儲存器 主儲存器和外部儲存器。儲存器的比較 從快取記...