Bad or unknown format of 32-bit executable file'D:t.exe'
第一件事情...search bypass&anti antiOD plugin....etc,有找到些plugin可過,基於原理還是不大明白,後來爬文看一下都差不多,有的說PE header offect被偏移、size被改變,導致SizeOfOptionalHandler !=0xE0(224),有的說優化PE失敗…直到看PE Structure時才發現 NumberOfRvaAndSizes !=0x10(16),無論任何PE structure,NumberOfRvaAndSizes一直都為0x10,自己也不明白為什麼,趁還有興趣.就來瞭解下:
MSDN解釋:
- NumberOfRvaAndSizes
- The number of directory entries in the remainder of the optional header. Each entry describes a location and size.
NumberOfRvaAndSizes包含我們的DATA_DIRECTORY目錄編號,在結構下默認為0x10(16)。PEDIY上有更好的解釋:
NumberOfRvaAndSize的值是影响到应用程序是否能访问到相应的数据表。程序要访问到对应的表,不谨相应的数据表要设置值, 而且NumberOfRvaAndSize的值必须大于对应表的序号。例如,程序要访问到重定位表(序号为5),NumberOfRvaAndSize的 值必须大于5,程序要访问到输出表(序号为1),NumberOfRvaAndSize的值必须大于1。
对于NumberOfRvaAndSize的值,
0表示DATA_DIRECTORY一项也没有
1表示DATA_DIRECTORY有1项(即:ExportTable)
2表示DATA_DIRECTORY有2项(即:ExportTable和ImportTable)
以此类推
看完解釋來實驗下他的影響,以下為MFC開發為例:
首先建立好工程,使用hex編輯器看NumberOfRvaAndSizes
正常情況為00000010(0x10),改為0x00 、0x01執行沒反應,改為0x02呈現下圖
如果一個程式的ExportTable、ImportTable、Resource為執行要點,根據前面描述必需大於前面三者,那麼透過以下的IMAGE_DATA_DIRECTORY[16]結構來做一個總結
IMAGE_ | Export Table |
Import Table | |
Resource Table | |
Exception Table | |
Certificate File | |
Relocation Table | |
Debug Data | |
Architecture Data | |
Global Ptr | |
TLS Table | |
Load Config Table | |
Bound Import Table | |
Import Address Table | |
Delay Import Descriptor | |
COM+ Runtime Header | |
Reserved |
前面提到須大於索引值,Resource Table為2,那我們填3(也代表DATA_DIRECTORY有3項) NumberOfRvaAndSize=0x03
根據以上0x03後的值就可以run,直到0x10,那麼超過會如何呢?
我們知道IMAGE_DATA_DIRECTORY也就16個,改為0x10執行沒問題,但超出去0x10則debug開始異常,以0x11實驗
實驗把size改超過0x10(16)後,載入debug時開始Error,0x10以後到0xffffffff都是這樣,且breakpoint斷在系統斷點上。
這類anti debug方式用在virus、pack有不錯的效果,但還是有tool可以bypass,不過以上總結針對固定的結構下,當然也有例外的可能發生。
沒有留言:
張貼留言