運行程序前執行自己的代碼

 作 者: 救世豬

來看雪兩年多了,到現在還是個相當菜的菜鳥,只索取,從來沒有過回報,因爲水平太次,實在是寫不出來什麼~   
這個小程序實際是做畢業設計的時候寫的,當時寫完之後,沒有太大的問題了,就沒有再改(能矇混過關就是目的),裏面現在仍然是bug多多。它主要是利用Tls CallBack來實現在運行程序之前先運行我們的代碼,我們要把代碼寫入到exe中才行。

TLS是Thread Local Storage,即線程局部存儲。線程局部存儲有2種,動態的和靜態的。動態線程局部存儲使用 TlsAlloc, TlsFree, TlsSetValue和TlsGetValue這些API,利用TLS機制可以爲進程中的每個線程關聯若干個數 據,各個線程通過由TLS分配的全局索引來訪問與自己關聯的數據。
而靜態線程局部存儲是在Windows的PE/COFF可執行文件格式中所支持的靜態線程局部存儲。即在PE頭中數據目錄表中的第10項,這一項指向的是Tls目錄,Tls目錄的結構如下:
代碼:
IMAGE_TLS_DIRECTORY32  STRUCT
StartAddressOfRawData  dd  ?
EndAddressOfRawData  dd  ?
AddressOfIndex    dd  ?
AddressOfCallBacks    dd  ?
SizeOfZeroFill    dd  ?
Characteristics    dd  ?
IMAGE_TLS_DIRECTORY32  ENDS
它的第三項是在線程初始化的時候要用的,使其指向一個可寫的無用的數據區即可。第四項即是指向的Tls CallBacks的數組,這個數組 以0結尾,在線程剛被創建的時候,系統會遍歷這個Tls Callbacks的數組,它會依次調用各個線程回調函數。所以,只須在代碼段中找到一些空閒的 空間,然後將代碼寫到裏面去,然後將再設置Tls目錄的值,這樣就實現了將Tls回調函數加入到其他可執行文件中。
具體的解釋可以見team509的文章:
http://www.team509.com/modules.php?name=News&file=article&sid=73

我現在大概講一下思路吧
在Edit中按一定格式寫好代碼之後,然後點編譯,程序會先將Edit中的代碼寫到一個臨時文件temp.asm中,然後加上頭之類的,形成一個能編譯的基本文件。
然後會調用nmake來編譯,makefile3會被調用,然後生成temp.exe
然後從有效位置把有效的數據提取出來,也就是有效代碼,在temp.exe中,一般有效代碼開始位置爲0x1000,然後將其讀出來,直到出現MarkLab標記,這個標記是在程序中自己設定的,爲了能很好的找到結尾。(主要是在_GetBinaryCode中完成的)

提取出來之後就將這段有效代碼,保存到Binary.dat中
然後在判斷PE是否有效等,再查找代碼段,然後判斷代碼段是否有足夠的空間,如果有足夠的空間,則會將Binary.dat中的數據寫到exe中,作爲Tls Callback
實現起來並不難,主要是算Tls Callback的位置比較繁瑣

因爲當時寫的時候,直接寫死的,運行的時候最好放到C:/Temp/Tls,當時好像用當前目錄設置有問題,而且Binary.dat每次都會往這個目錄下寫,所以沒辦法,就直接把tls.exe放這裏面執行就行了。
而且如果要自己編譯的話,要改一下makefile和makefile3
將裏面的頭文件以及庫文件的路徑設置爲正確的

因爲有Binary.dat了,所以也可以不編譯,直接選擇文件往裏寫,這時候會從當前文件夾下的Binary.dat中取數據,然後到目標exe中
測試了幾個簡單的exe,正常,但有的exe寫的時候會有錯……

上傳的附件
文件類型: rar Tls.rar (2008-12-31 19:49, 10.3 KB, 50 次下載)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章