(1)把不帶符號表的exe(debug && release版本)還原成高階**;
(2)最初還原等價** ,終極目標還原相同原始碼(變數名可以不一樣);
ida基礎:
d:定義游標處的彙編為某資料;
c:定義游標處的彙編為**;
a: 定義游標處的彙編為字串
n:更改游標處變數名;
快速定位main函式:
主要是熟悉各個開發環境中的結構,一般來說,大部分是三個push後就是main;
ide編譯選項:debug,release:
vc6與vs2013:
所謂常量摺疊就是,常量的運算在編譯期間直接完成;
int a = 1+3;
摺疊後直接:
int a =4;
常量傳播就是,變數在引用之前沒有被修改過,就可以直接替換;
int a = 2;
int b =3;
int c = a + b;
常量傳播後:
int c = 2+ 3;
摺疊後:
int c = 5;
把ida的原始碼複製出來,一行一行修改,變數就使用暫存器名字;
標誌性指令:有符號imul,無符號mul;
編譯器會盡可能的把乘法優化成加法,無法優化時就直接使用乘法指令;
下面列舉乘法常常出現的c++**情況,並且對應的debug和release彙編;
//變數
int nvarone = argc;
int nvartwo = argc;
原始碼:
printf("2 *15 =%d", 2 *15);
debug:
push 1eh//常量傳播 30
push offset string "2 *15 =%d" (00422074)
release:
push 1eh//常量傳播 30
push offset a215d ; "2 *15 =%d"
原始碼:
printf("nvarone *15 =%d", nvarone*15);
debug:
00401043 mov edx,dword ptr [ebp-4]
00401046 imul edx,edx,0fh//
release:
mov esi, [esp+0ch+argc]
lea eax, [esi+esi*2]// 非2的n次方,經常使用多個lea
lea eax, [eax+eax*4] // 非2的n次方,經常使用多個lea
push eax
push offset anvarone15d ; "nvarone *15 =%d"
原始碼:
printf("nvarone*2^4 =%d", nvarone*16);
debug:
00401057 mov eax,dword ptr [ebp-4]
0040105a shl eax,4// shl邏輯左移
release:
mov ecx, esi
shl ecx, 4//常量的值為2的n次方,直接使用左移
push ecx
push offset anvarone24d ; "nvarone*2^4 =%d"
原始碼:
printf("nvarone*16+5 =%d", nvarone*16+5);
printf("nvarone*7+9 =%d ", nvarone*7+9);
debug:
shl edx, 5
add edx, 5
push edx
push offset format ; "nvarone*32+5 =%d"
call _printf
add esp, 8
mov eax, [ebp+var_4]
imul eax, 7
add eax, 9
push eax
push offset anvarone79d ; "nvarone*7+9 =%d"
call _printf
release:
shl eax, 5
add eax, 5
push eax
push offset anvarone325d ; "nvarone*32+5 =%d"
call sub_401040
lea ecx, ds:0[esi*8]
sub ecx, esi
add ecx, 9
push ecx
push offset anvarone79d ; "nvarone*7+9 =%d"
call sub_401040
printf("nvartwo * nvarone =%d", nvartwo * nvarone);
debug:
00401082 mov edx,dword ptr [ebp-8]
00401085 imul edx,dword ptr [ebp-4]
00401089 push edx
release:
mov ecx, esi
imul ecx, esi//變數乘以變數只能使用iuml指令,沒有優化
push ecx
push offset anvartwonvarone ; "nvartwo * nvarone =%d"
debug下,乘法只有2的n次方會有shl移位優化;其餘都是直接使用imul乘法指令;
relese下,乘法指令盡可能的進行優化,要不就是直接使用多個lea(非2的n次方),要不就是使用shl邏輯左移(2的n次),要不就是imul(常量*常量)
release會有一種特殊的流水線優化;
lea ecx,[esi+ esi*2]
add esp,8
shl ecx ,1
這種優化比例很少,幾乎是最後的優化手段(後面繼續細講); 逆向基礎 常用逆向工具介紹
偵錯程式修補和轉儲工具 整合工具 immunity debugger ida interactive disassembler,互動式反彙編器 是業界乙個功能十分強大的反彙編工具,是安全滲透人員進行逆向安全測試的必備工具,其強大的靜態反彙編和逆向除錯功能能夠幫助安全測試人員發現 級別的高危致命安全漏...
羽夏逆向指引 逆向基礎
你如果是從中間插過來看的,請仔細閱讀羽夏逆向指引 序,方便學習本教程。既然你想要學習逆向,基礎沒有是不行的。如下將詳細介紹你需要的基礎和我可能涉及講解的內容。注意,本篇可能對您來說是勸退文,只有3分鐘熱度或者連作業系統怎麼使用都不熟練的同志就不要繼續了。為什麼需要一門編譯型語言呢?什麼是編譯型語言?...
Window逆向基礎之逆向工程介紹
以設計方法學為指導,以現代設計理論 方法 技術為基礎,運用各種專業人員的工程設計經驗 知識和創新思維,對已有產品進行解剖 深化和再創造。逆向工程不僅僅在計算機行業 各行各業都存在逆向工程。計算機行業逆向工程 計算機行業中的逆向工程有兩種分類 1 硬體逆向 2 軟體逆向 軟體逆向包括 系統級逆向和 級...