iT邦幫忙

2022 iThome 鐵人賽

DAY 14
0
Security

我逆向你逆向我的逆向工程膩系列 第 14

Dx14 - 刪除重載表區塊

  • 分享至 

  • xImage
  •  

既然在上一張讀到 EXE 執行檔通常會單獨執行而不會進行 DLL 重載,那是不是代表就算沒有重載表也是沒問題的呢? 是不是也可以透過修改 Header 幫程式來瘦身? 做個實驗來驗證看看吧

檔案位置 :

https://github.com/Dinlon5566/IT_Reverse_Engineering/tree/main/Dx14

想法

透過毀損或清空 DLL重載表的區塊 ( .reloc ) 來驗證 EXE 檔案對 DLL重載表 的依賴性。

  1. 找尋 DLL重載表位置 : 5000 ~ 515C RVA2200 ~ 235C RAW

https://ithelp.ithome.com.tw/upload/images/20220928/2013567549fGPM578D.png

  1. 用 Hex Editor ( 這邊用 Notepad++ ) 把對應表的位置全改成 0x00 後儲存。

https://ithelp.ithome.com.tw/upload/images/20220928/201356758nImijsxR0.png

  1. 執行

https://ithelp.ithome.com.tw/upload/images/20220928/20135675BdJL5R3wX3.png

看起來成功了,這個假設應該是對的。那進一步來修改標頭檔,改變檔案的結構使這個區塊消失也不會影響到執行

為甚麼不能直接刪除然後執行就好 ? 因為建置的時候系統會發現大小跟區塊對不上就不讓你執行QQ

範例 : helloworld_break.exe

https://ithelp.ithome.com.tw/upload/images/20220928/20135675CQe2YNtYpo.png

那要甚麼才能讓 windows 覺得這是正常的區塊與大小呢 ?

  1. 刪除 .reloc 區塊

https://ithelp.ithome.com.tw/upload/images/20220928/20135675OORKZ8Fsz5.png

首先先確認區塊位置,發現是在 2200~2400,那剛好就是文件 2200 後全部資料,使用 Hex Editor 刪掉這個區塊。

  1. 修改 NumberOfSelctions

https://ithelp.ithome.com.tw/upload/images/20220928/20135675km0TuAxZ0s.png

這個區塊儲存有多少個區塊,既然把 .reloc 刪了就要減少一個區塊。將 05 改成 04

( 這個區塊的位置是 IMAGE_NT_HEADERS->FileHeader.NumberOfSections )

  1. 檔案大小

現在看到原本的 ImageSize 大小是 6000 ,不過經過修改後要甚麼計算呢 ?

https://ithelp.ithome.com.tw/upload/images/20220928/201356751uoLjcSykz.png

看到上面的區塊資料表,查到原本 .relocVirtual Size15C

根據動態區段對齊大小 ( Section Alignment Size ) 取到 ( 1000 / 15C ) * 1000 = 1000

https://ithelp.ithome.com.tw/upload/images/20220928/20135675X6rX8SsiGr.png

先解釋一下,資料的儲存是以區塊為單位避免外部碎片化。所以當要存一份資料時就給他分配足夠的區塊

https://ithelp.ithome.com.tw/upload/images/20220928/20135675MFskU9Q5Ur.png

所以區塊刪除後的大小就是 6000 - 1000 = 5000

完成後執行看看 :

https://ithelp.ithome.com.tw/upload/images/20220928/20135675QnkLots7iE.png

成功了 ! 而且大小由 9216 變成 8704,瘦了一點點。
https://ithelp.ithome.com.tw/upload/images/20220928/20135675lwTASaJf58.png


上一篇
Dx13 - PE 基址重定位
下一篇
Dx15 - 內嵌代碼補丁製作 - 分析篇
系列文
我逆向你逆向我的逆向工程膩31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
Silense
iT邦新手 5 級 ‧ 2023-09-20 14:59:25

大大我有事想詢問,我目前作業需要參考您的文章,在Dx14文章底下的這段""根據動態區段對齊大小(Section Alignment Size)取到(1000/15C)1000=1000"",好奇問要如何算為什麼結果是1000呢,是不是我算錯了:(

抱歉這個寫法有些不直觀。
這個式子這樣寫是在試圖找出多少個 .reloc 區段可以填滿一個對齊單位,然後再乘以對齊單位。在這個情況下,由於 15C(即 348 Bytes)遠小於對齊單位 1000(即 4 KB),所以一個對齊單位就足夠存儲這個 .reloc 區段,故結果為 1000。

不過要直接計算Virtual Size 占用區塊的數量可以使用這個式子:
https://ithelp.ithome.com.tw/upload/images/20230921/20135675xSUlK1UZKs.png

我要留言

立即登入留言