2011年9月25日 星期日

How to spoof your debug(softICE&OllyDBG) ?

reverse engineering時曾碰過此情形,當exe執行時沒什麼特別問題,直到載入debug後跳出這樣的框架。

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_
DATA_DIRECTORY[16]
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,不過以上總結針對固定的結構下,當然也有例外的可能發生。

沒有留言:

張貼留言