delphi 5反彙編摘要
有許多任務具可以幫助delphi
的逆向工程,我用得較多的是dede和ida pro。在ida pro中通重載入flirt模組(file/load file/flirt signature fire…)可以根據開發工具獲得一些二進位制中不存在的符號。這對於破解、幫助閱讀彙編**是很有幫助的。同樣的功能在dede 3.5中叫做.dsf符號庫,不過實際用起來看flirt似乎能夠獲得更多的符號資訊,而dede可以得到delphi
特有的資料,如.dpr, .dfm, .pas工程檔案。
delphi
編譯**和一般的c編譯**不太一樣,比如呼叫約定中,c的thiscall用ecx傳遞this指標,而delphi
的thiscall用eax傳遞this指標;c的fastcall一般用ecx/edx兩個暫存器用於引數傳遞,而delphi
則用三個eax/edx/ecx;在使用浮點數時,c通過壓棧兩個dword傳遞double引數,而delphi
則用fld和fstp直接通過fpu傳遞引數。修飾名也不一樣,這裡不加敘述。
關於呼叫約定參考 http://baby.homeip.net/patrick/archives/000142.php
目前的ida尚不支援載入.map/.sym符號資訊,根據datarescue**的說明,可以通過.idc指令碼載入(http://www.ccso.com/faq.html
)。dede的ida/softice符號輸出中據說可以自動檢測執行的soft-ice並向其匯入符號,但實際使用時不是很靈光,根據.map檔案格式可以寫乙個程式將其轉換成.idc指令碼:
#!/usr/bin/perl
use strict;
sub dump_idc;
my $hex_pat = "[0-9a-fa-f]+";
my $start;
my @entries;
while (<>)
$start = hex($start);
next;
}
if (m/starts+lengths+names+class/)
if (m/$hex_pat:($hex_pat)s*(.*)$/)
}@entries = sort @entries;
&dump_idc;
sub dump_idc
print "}"; }1;
有些程式在檢驗註冊碼時通過丟擲異常等行為確定是否註冊成功,關於異常matt pietrek有一篇著名文章http://www.microsoft.com/msj/0197/exception/exception.aspx
值得一讀。從彙編**上看,所有try/catch塊都有類似的結構:
code:004bde4cxoreax, eax
code:004bde4epushebp
code:004bde4fpushoffset loc_4bde92
code:004bde54pushdword ptr fs:[eax]; 儲存上乙個handler
code:004bde57movfs:[eax], esp
code:004bde92 loc_4bde92:
code:004bde92jmp_any2_handler_deverr?
code:004bde97jmpshort loc_4bde89
code:004bdeeapopedx; 上乙個handler
code:004bdeebpopecx
code:004bdeecpopecx
code:004bdeedmovfs:[eax], edx; 恢復
注意到4bde97h處**未被執行,這是怎麼回事呢?原來它是finally對應的塊,seh核心會根據push offset loc_4bde92自動得到4bde97h的finally入口位址。因此在除錯有異常處理的程式時,有時需要在handler和finally的處理程式處也設定斷點。
今天先到這裡,可能的話下次再貼。
C的迴圈的反匯
要從事 逆向工程 工作,或對其感興趣,請必然要接觸到組合語言。然而我們在對計算機語言的了解大都是從高階語言 如c vb dephi 開始的。那當我們閱讀由高階語言翻譯成的機器語言時肯定會遇到很多障礙。下面是我在看了相關書籍後,做的一些筆記,希望有點參考價值!一 迴圈語句與發彙編後的機器語言 1 fo...
讀書筆記 Delphi5 開發人員指南 第一章
大學期間基本沒有什麼程式設計經驗,雖然上學期間相關的課程也學了一些,但那些只是基本的東西而已。比如c語言 比如資料結構 比如資料庫。況且作為乙個學生,乙個比較懶的學生,我基本上是只學了那些老師所教的東西,所謂的 重點 可以說,對於程式開發,我是乙個門外漢。而大學畢業後,我的工作恰又和程式設計有關。作...
MySQL 學習筆記(5)MySQL常用函式彙總
mysql 學習筆記 5 2016 04 11 字元函式 在這些字元函式中,like not like是比較特殊的,他們需要結合資料表使用。比如 select from tb1 where col1 like m 其中 代表任意個字元 代表任意乙個字元,上面的 表示包含m的字元就都需要提取出來。常用...