日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

基于 ida 的反汇编转换 Obj 的可行性 笔记(1)

發(fā)布時(shí)間:2024/4/11 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于 ida 的反汇编转换 Obj 的可行性 笔记(1) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
標(biāo) 題: 【原創(chuàng)】基于 ida 的反匯編轉(zhuǎn)換 Obj 的可行性 筆記(1)
作 者: dummy
時(shí) 間: 2007-08-18,16:33
鏈 接: http://bbs.pediy.com/showthread.php?t=49910

以前有種工具可以叫?exe2c,?聽過(guò)可以把一個(gè)可執(zhí)行文件轉(zhuǎn)換成?c?代碼,沒(méi)有用過(guò)。
但是其中顯示出的令人振奮的功能,其中很多問(wèn)題一直想去了解,但是沒(méi)有機(jī)會(huì)。
我最想了解的就是?exe2c?中的是他的"智能"的"反匯編引擎",?這個(gè)反匯編引擎要解決的主要問(wèn)題:
1、如果有效的區(qū)分?jǐn)?shù)據(jù)和指令
?在現(xiàn)在的編譯器中,常常會(huì)把全局性常量(比如跳轉(zhuǎn)表)放在代碼節(jié)中,我在做?obj2asm?時(shí)已經(jīng)遇到,
?但是我的解決辦法全靠編譯器在符號(hào)類型中留下的信息得以解決,對(duì)于已經(jīng)剝離符號(hào)信息的可執(zhí)行文件,
?這可第一個(gè)要解決的問(wèn)題。
2、在代碼中解析編譯器構(gòu)造的函數(shù)例程
????其中包括兩個(gè)部分:?
????1、庫(kù)函數(shù)識(shí)別
????2、未知函數(shù)預(yù)測(cè),?和所在范圍的確定
????其中?1?比較好解決,而?2?對(duì)與現(xiàn)代的高級(jí)語(yǔ)言編譯器大多數(shù)的函數(shù),使用簡(jiǎn)單的方法都可以被找出。
????其中的主要干擾因素是,編譯器對(duì)待結(jié)構(gòu)化異常處理和內(nèi)聯(lián)優(yōu)化有的時(shí)候會(huì)相當(dāng)?shù)摹皭盒摹薄?br /> 附:
????簡(jiǎn)單說(shuō)說(shuō)常見(jiàn)的數(shù)據(jù)和指令區(qū)分技術(shù),還有就是未知函數(shù)預(yù)測(cè)
????
????我們首先要把起始點(diǎn)(一般都是?oep)放到?“嫌疑函數(shù)"?表中,
????然后進(jìn)入一個(gè)大循環(huán)中。下面用隨手寫偽碼簡(jiǎn)單描述一下:
?//?suspect_fun_lst;?嫌疑函數(shù)?表
?//?suspect_dat_lst;?嫌疑數(shù)據(jù)?表
?//?suspect_lab_lst;?嫌疑標(biāo)號(hào)?表
????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?)?//?進(jìn)行函數(shù)長(zhǎng)度估測(cè),和有效性判斷
??{
???if?(?!disam(p,?&instr)?)?//?進(jìn)行反匯編
????break;
???
???//?檢查這條指令是否罕見(jiàn),如果是?bad?加?1,?超過(guò)一定范圍這個(gè)函數(shù)的反匯編將結(jié)束
???is_rarity_instr(instr)?&&?bad++;?
???if?(?instr.is_call_imm32?)?//?call?_fun
???{
????if?(?!in_image(instr.call_target)?)?//?檢查目標(biāo)地址是否在映像中
????{
?????bad?=?0x1000;
?????break;
????}
????
????funinfo_t*?xfun?=?find_fun(instr.call_target);?//?查找表中是否已經(jīng)存在
????if?(?xfun?==?NULL?)
????{
?????xfun?=?new?funinfot_t;
?????xfun.base?=?instr.call_target;?//?函數(shù)地址
?????xfun.size?=?-1;?//?大小
?????xfun.nref?=?0;?//?被引用次數(shù)
?????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;?//?數(shù)據(jù)地址
?????xdat.size?=?instr.op_size;?//?操作數(shù)大小
?????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);?//?判斷過(guò)去的?jmp?目標(biāo)地址是否合法
?????if?(?t?==?NULL?)
?????{
??????bad?=?0x10002;
??????break;
?????}
?????
?????jmplist.remove(a);
????}
???}
???
???if?(?bad?>=??10?)
????break;
???if?(?jmplist.empty()?&&?instr.is_ret?)?//?函數(shù)結(jié)束
????break;
???p?+=?instr.len;
???fun.instr_lst.push_back(instr);?//?保存指令信息
??}
?}
?//?把三張表放在一起進(jìn)行,按照權(quán)值高低(即主要包括引用次數(shù),函數(shù)特征)除重過(guò)濾
?//?首先把?suspect_lab_lst?中的項(xiàng)和其他2張表進(jìn)行對(duì)撞,如果其基址值在
?//?別的表中存在,則消去此表元素,將引用次數(shù)加到目標(biāo)表中.
?//?過(guò)濾的主要規(guī)則包括:發(fā)生重疊時(shí),保留"極"高權(quán)項(xiàng),否則沒(méi)有全拋棄。
?//?...?還有很多可以去除和提高可疑數(shù)據(jù)和函數(shù)的方法,就不細(xì)數(shù)了。
?//?思路有了,代碼也就好寫了,偽碼我也不列了。
// 超強(qiáng)干貨來(lái)襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生

總結(jié)

以上是生活随笔為你收集整理的基于 ida 的反汇编转换 Obj 的可行性 笔记(1)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。