TLS回调函数(2)
手動(dòng)添加TLS回調(diào)函數(shù)
設(shè)計(jì)規(guī)劃
首先要確定IMAGE_TLS_DIRECTORY結(jié)構(gòu)體與TLS回調(diào)函數(shù)放到文件的哪個(gè)位置。向某個(gè)PE文件添加代碼或數(shù)據(jù)時(shí),有如下3種方法查找合適位置:
這里呢,我們采用第二種方法,即增加最后一個(gè)節(jié)區(qū)(.rsrc)的節(jié)區(qū)頭。
可以看到,最后一個(gè)節(jié)區(qū)(.rsrc)的Pointer to Raw Data=9200,Size of Raw Data=600。所以PE頭中定義的文件整體大小為9800??紤]到要添加的代碼與數(shù)據(jù)的大小,我們將最后一個(gè)節(jié)區(qū)的大小增加200(文件的大小增加到9A00)。使用HxD工具打開需要操作的程序,移動(dòng)光標(biāo)至最后位置,在菜單欄中選擇Edit-Insert bytes 菜單,打開插入字節(jié)對話框,然后向Bytecount中輸入200,單擊OK按鈕后,即從光標(biāo)當(dāng)前位置添加了200個(gè)字節(jié)(即512個(gè)字節(jié))
另一種方法,直接復(fù)制最后很多的零字節(jié)內(nèi)存單元格,然后從文件尾部直接粘貼就行,多粘貼幾次,512字節(jié)就出來了
注意:
圖中virtual size為43C,PE裝載器會(huì)按照Section Alignment值對齊該值,即加載到內(nèi)存中的大小為1000(一定要理解好這個(gè)關(guān)系)。所以將節(jié)區(qū)的文件大小增加200后,實(shí)際virtual size 變?yōu)?3C,它比加載到內(nèi)存中尺寸1000要小,所以不需要再單獨(dú)增大virtual size 的值
這里加的時(shí)候,如果改了之后沒法保存的話,記得用 管理員權(quán)限來打開編譯exe的程序(即打開visual stido),我就是這種情況。。。
編輯PE文件頭
.rsrc節(jié)區(qū)頭
分別修改.rsrc節(jié)區(qū)頭中的Size of raw data與Characteristics的值,即size of Raw data =800,characteristics=E0000060,如下所示
修改后:
Characteristics=E0000060的含義如下所示:
| 00000020 | IMAGE_SCN_CNT_DODE |
| 00000040 | IMAGE_SCN_CNT_INITIALIZED_DATA |
| 20000020 | IMAGE_SCN_MEM_EXECUTE |
| 40000020 | IMAGE_SCN_CNT_READ |
| 80000020 | IMAGE_SCN_CNT_WRITE |
即在原有屬性的基礎(chǔ)上增加了IMAGE_SCN_CNT_DODE | IMAGE_SCN_MEM_EXECUTE| IMAGE_SCN_CNT_WRITE屬性
注意:
由于要在擴(kuò)展區(qū)域內(nèi)創(chuàng)建IMAGE_TLS_DIRECTORY結(jié)構(gòu)體與TLS回調(diào)函數(shù),所以需要向節(jié)區(qū)添加IMAGE_SCN_CNT_DODE | IMAGE_SCN_MEM_EXECUTE屬性,此外,還必須包括IMAGE_TLS_DIRECTORY 結(jié)構(gòu)體的節(jié)區(qū)添加 IMAGE_SCN_CNT_WRITE屬性,才能保證正常運(yùn)行
IMAGE_DATA_DIRECTORY[9]
接下來要設(shè)置TLS表(IMAGE_NT_HEADERS-IMAGE_OPTIONAL_HEADER-IMAGE_DATA_DIRECTORY[9])。在PRVIEW中查看該地址為9800(RVA地址),我們將從改地址創(chuàng)建IMAGE_TLS_DIRECTORY結(jié)構(gòu)體。因此要修改PE文件投中的IMAGE_DATA_DIRECTORY[9],即(RVA=9800,Size=18)
改完之后用PEview查看一下是否改好即可。
設(shè)置IMAGE_TLS_DIRECTORY結(jié)構(gòu)體
接下來設(shè)置 IMAGE_TLS_DIRECTORY 結(jié)構(gòu)體,只要把TLS回調(diào)函數(shù)注冊到其中即可,編輯設(shè)置IMAGE_TLS_DIRECTORY結(jié)構(gòu)體
我們在文件偏移9800地址處創(chuàng)建了IMAGE_TLS_DIRECTORY結(jié)構(gòu)體。AddressOfCallbacks成員的值為 假設(shè)為0x40C224 ,它是array of TLS CallBack Function (TLS回調(diào)函數(shù)數(shù)組)的起始地址。只要把TLS回調(diào)函數(shù)的地址(40C230)放入該數(shù)組,即可成功注冊TLS回調(diào)函數(shù)
TLS系列
TLS回調(diào)函數(shù)(1)
TLS回調(diào)函數(shù)(2)
總結(jié)
以上是生活随笔為你收集整理的TLS回调函数(2)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PE结构基址重定位表
- 下一篇: PE结构绑定导入实现