基于 ida 的反汇编转换 Obj 的可行性 笔记(1)
生活随笔
收集整理的這篇文章主要介紹了
基于 ida 的反汇编转换 Obj 的可行性 笔记(1)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
標 題: 【原創】基于 ida 的反匯編轉換 Obj 的可行性 筆記(1)
作 者: dummy
時 間: 2007-08-18,16:33
鏈 接: http://bbs.pediy.com/showthread.php?t=49910
以前有種工具可以叫?exe2c,?聽過可以把一個可執行文件轉換成?c?代碼,沒有用過。
但是其中顯示出的令人振奮的功能,其中很多問題一直想去了解,但是沒有機會。
我最想了解的就是?exe2c?中的是他的"智能"的"反匯編引擎",?這個反匯編引擎要解決的主要問題:
1、如果有效的區分數據和指令
?在現在的編譯器中,常常會把全局性常量(比如跳轉表)放在代碼節中,我在做?obj2asm?時已經遇到,
?但是我的解決辦法全靠編譯器在符號類型中留下的信息得以解決,對于已經剝離符號信息的可執行文件,
?這可第一個要解決的問題。
2、在代碼中解析編譯器構造的函數例程
????其中包括兩個部分:?
????1、庫函數識別
????2、未知函數預測,?和所在范圍的確定
????其中?1?比較好解決,而?2?對與現代的高級語言編譯器大多數的函數,使用簡單的方法都可以被找出。
????其中的主要干擾因素是,編譯器對待結構化異常處理和內聯優化有的時候會相當的“惡心”。
附:
????簡單說說常見的數據和指令區分技術,還有就是未知函數預測
????
????我們首先要把起始點(一般都是?oep)放到?“嫌疑函數"?表中,
????然后進入一個大循環中。下面用隨手寫偽碼簡單描述一下:
?//?suspect_fun_lst;?嫌疑函數?表
?//?suspect_dat_lst;?嫌疑數據?表
?//?suspect_lab_lst;?嫌疑標號?表
????for?(?int?i?=?0;?i?<?suspect_fun_lst.size();?i++?)
????{
??instr_t?instr;?//?指令信息
??jmp_list?jmplst;
??long?p,?bad;
??funinfo_t&?fun?=?suspect_fun_lst.front();
??fun.size?=?0;
??p?=?fun.base;
??bad?=?0;
??while?(?bad?<?10?)?//?進行函數長度估測,和有效性判斷
??{
???if?(?!disam(p,?&instr)?)?//?進行反匯編
????break;
???
???//?檢查這條指令是否罕見,如果是?bad?加?1,?超過一定范圍這個函數的反匯編將結束
???is_rarity_instr(instr)?&&?bad++;?
???if?(?instr.is_call_imm32?)?//?call?_fun
???{
????if?(?!in_image(instr.call_target)?)?//?檢查目標地址是否在映像中
????{
?????bad?=?0x1000;
?????break;
????}
????
????funinfo_t*?xfun?=?find_fun(instr.call_target);?//?查找表中是否已經存在
????if?(?xfun?==?NULL?)
????{
?????xfun?=?new?funinfot_t;
?????xfun.base?=?instr.call_target;?//?函數地址
?????xfun.size?=?-1;?//?大小
?????xfun.nref?=?0;?//?被引用次數
?????suspect_fun_lst.push_back(xfun);
????}
????xfun.nref++;
???}
???else?if?(?instr.opnum_is_mem32?)
???{
????if?(?!in_image(instr.op_mem32)?)
????{
?????bad?=?0x1001;
?????break;
????}
????
????datinfo_t*?xdat?=?find_dat(instr.op_mem32);
????if?(?xdat?=?NULL?)
????{
?????xdat?=?new?datinfo_t;
?????xdat.addr?=?instr.op_mem32;?//?數據地址
?????xdat.size?=?instr.op_size;?//?操作數大小
?????xdat.nref?=?0;
?????suspect_dat_lst.push_back(instr.op_addr);
????}
????
????xdat.nref++;
???}
???else?if?(?instr.opnum_is_imm32?&&?in_image(instr.op_imm32)?)?//?mov?eax,?offset?_i?or?mov?eax,?offset?_callback
???{
????labinfo_t*?xlab?=?find_lab(instr.op_imm32);
????if?(?xlab?==?NULL?)
????{
?????xlab?=?new?labinfo_t;
?????xlab.addr?=?instr.op_imm32;
?????xlab.nref?=?0;
?????suspect_lab_lst.push_back(instr.op_imm32);
????}
????xlab.nref++;
???}
???
???if?(?instr.is_jmp_imm?)
???{
????if?(?jmplist.is_exist(instr.jmp_target)?)
????{
?????jmplist.push_back(instr.jmp_target);
????}
???}
???
???for?(?long?a?=?jmplist.begin();?a?!=?jmplist.end();?a++?)?//?把?
???{
????if?(?a?<?p?)
????{
?????instr_t*?t?=?get_instr(fun,?a);?//?判斷過去的?jmp?目標地址是否合法
?????if?(?t?==?NULL?)
?????{
??????bad?=?0x10002;
??????break;
?????}
?????
?????jmplist.remove(a);
????}
???}
???
???if?(?bad?>=??10?)
????break;
???if?(?jmplist.empty()?&&?instr.is_ret?)?//?函數結束
????break;
???p?+=?instr.len;
???fun.instr_lst.push_back(instr);?//?保存指令信息
??}
?}
?//?把三張表放在一起進行,按照權值高低(即主要包括引用次數,函數特征)除重過濾
?//?首先把?suspect_lab_lst?中的項和其他2張表進行對撞,如果其基址值在
?//?別的表中存在,則消去此表元素,將引用次數加到目標表中.
?//?過濾的主要規則包括:發生重疊時,保留"極"高權項,否則沒有全拋棄。
?//?...?還有很多可以去除和提高可疑數據和函數的方法,就不細數了。
?//?思路有了,代碼也就好寫了,偽碼我也不列了。
// 超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生
作 者: dummy
時 間: 2007-08-18,16:33
鏈 接: http://bbs.pediy.com/showthread.php?t=49910
以前有種工具可以叫?exe2c,?聽過可以把一個可執行文件轉換成?c?代碼,沒有用過。
但是其中顯示出的令人振奮的功能,其中很多問題一直想去了解,但是沒有機會。
我最想了解的就是?exe2c?中的是他的"智能"的"反匯編引擎",?這個反匯編引擎要解決的主要問題:
1、如果有效的區分數據和指令
?在現在的編譯器中,常常會把全局性常量(比如跳轉表)放在代碼節中,我在做?obj2asm?時已經遇到,
?但是我的解決辦法全靠編譯器在符號類型中留下的信息得以解決,對于已經剝離符號信息的可執行文件,
?這可第一個要解決的問題。
2、在代碼中解析編譯器構造的函數例程
????其中包括兩個部分:?
????1、庫函數識別
????2、未知函數預測,?和所在范圍的確定
????其中?1?比較好解決,而?2?對與現代的高級語言編譯器大多數的函數,使用簡單的方法都可以被找出。
????其中的主要干擾因素是,編譯器對待結構化異常處理和內聯優化有的時候會相當的“惡心”。
附:
????簡單說說常見的數據和指令區分技術,還有就是未知函數預測
????
????我們首先要把起始點(一般都是?oep)放到?“嫌疑函數"?表中,
????然后進入一個大循環中。下面用隨手寫偽碼簡單描述一下:
?//?suspect_fun_lst;?嫌疑函數?表
?//?suspect_dat_lst;?嫌疑數據?表
?//?suspect_lab_lst;?嫌疑標號?表
????for?(?int?i?=?0;?i?<?suspect_fun_lst.size();?i++?)
????{
??instr_t?instr;?//?指令信息
??jmp_list?jmplst;
??long?p,?bad;
??funinfo_t&?fun?=?suspect_fun_lst.front();
??fun.size?=?0;
??p?=?fun.base;
??bad?=?0;
??while?(?bad?<?10?)?//?進行函數長度估測,和有效性判斷
??{
???if?(?!disam(p,?&instr)?)?//?進行反匯編
????break;
???
???//?檢查這條指令是否罕見,如果是?bad?加?1,?超過一定范圍這個函數的反匯編將結束
???is_rarity_instr(instr)?&&?bad++;?
???if?(?instr.is_call_imm32?)?//?call?_fun
???{
????if?(?!in_image(instr.call_target)?)?//?檢查目標地址是否在映像中
????{
?????bad?=?0x1000;
?????break;
????}
????
????funinfo_t*?xfun?=?find_fun(instr.call_target);?//?查找表中是否已經存在
????if?(?xfun?==?NULL?)
????{
?????xfun?=?new?funinfot_t;
?????xfun.base?=?instr.call_target;?//?函數地址
?????xfun.size?=?-1;?//?大小
?????xfun.nref?=?0;?//?被引用次數
?????suspect_fun_lst.push_back(xfun);
????}
????xfun.nref++;
???}
???else?if?(?instr.opnum_is_mem32?)
???{
????if?(?!in_image(instr.op_mem32)?)
????{
?????bad?=?0x1001;
?????break;
????}
????
????datinfo_t*?xdat?=?find_dat(instr.op_mem32);
????if?(?xdat?=?NULL?)
????{
?????xdat?=?new?datinfo_t;
?????xdat.addr?=?instr.op_mem32;?//?數據地址
?????xdat.size?=?instr.op_size;?//?操作數大小
?????xdat.nref?=?0;
?????suspect_dat_lst.push_back(instr.op_addr);
????}
????
????xdat.nref++;
???}
???else?if?(?instr.opnum_is_imm32?&&?in_image(instr.op_imm32)?)?//?mov?eax,?offset?_i?or?mov?eax,?offset?_callback
???{
????labinfo_t*?xlab?=?find_lab(instr.op_imm32);
????if?(?xlab?==?NULL?)
????{
?????xlab?=?new?labinfo_t;
?????xlab.addr?=?instr.op_imm32;
?????xlab.nref?=?0;
?????suspect_lab_lst.push_back(instr.op_imm32);
????}
????xlab.nref++;
???}
???
???if?(?instr.is_jmp_imm?)
???{
????if?(?jmplist.is_exist(instr.jmp_target)?)
????{
?????jmplist.push_back(instr.jmp_target);
????}
???}
???
???for?(?long?a?=?jmplist.begin();?a?!=?jmplist.end();?a++?)?//?把?
???{
????if?(?a?<?p?)
????{
?????instr_t*?t?=?get_instr(fun,?a);?//?判斷過去的?jmp?目標地址是否合法
?????if?(?t?==?NULL?)
?????{
??????bad?=?0x10002;
??????break;
?????}
?????
?????jmplist.remove(a);
????}
???}
???
???if?(?bad?>=??10?)
????break;
???if?(?jmplist.empty()?&&?instr.is_ret?)?//?函數結束
????break;
???p?+=?instr.len;
???fun.instr_lst.push_back(instr);?//?保存指令信息
??}
?}
?//?把三張表放在一起進行,按照權值高低(即主要包括引用次數,函數特征)除重過濾
?//?首先把?suspect_lab_lst?中的項和其他2張表進行對撞,如果其基址值在
?//?別的表中存在,則消去此表元素,將引用次數加到目標表中.
?//?過濾的主要規則包括:發生重疊時,保留"極"高權項,否則沒有全拋棄。
?//?...?還有很多可以去除和提高可疑數據和函數的方法,就不細數了。
?//?思路有了,代碼也就好寫了,偽碼我也不列了。
// 超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生
總結
以上是生活随笔為你收集整理的基于 ida 的反汇编转换 Obj 的可行性 笔记(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IDA Plugin 编写基础
- 下一篇: 基于 ida 的反汇编转换 Obj 的可