windows逆向基礎02 逆向四則運算之加減乘

2021-08-16 01:42:35 字數 3516 閱讀 9293

(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 軟體逆向 軟體逆向包括 系統級逆向和 級...