VC下防止反彙編的辦法(1)

2022-05-06 14:18:12 字數 1956 閱讀 5120

最近在看ida的書,講組合語言的部分提到了一種防止遞迴向下彙編器逆向程式的方法

可以看到vc生成的彙編**中新增了一些字首字尾:

字首用來儲存呼叫前堆疊頂ebp,還有設定新的堆疊頂位置到ebp。如果有區域性變數,還要減少esp位置(相當於入棧幾個未知資料)以留出區域性變數的位置。注意函式堆疊是從記憶體大編號向小編號堆疊的,越大的位址編號越靠下,就像乙個金字塔,下大上小。

字尾用來清理堆疊(mov esp,ebp),並且從堆疊中恢復此次呼叫之前的ebp(pop ebp)。不難發現在被呼叫的函式體內修改函式返回位址的話,就需略過ebp的位置。因此內嵌彙編的那一句需要用ebp+4來得到返回位址指標。後面位址+13是略過的呼叫方的乙個printf方法呼叫,要跳過多少**可以在反彙編視窗自行檢視位址計算一下。

下面是呼叫方的**:

int

main()

;00ac1038 mov dword ptr [a],

000ac103f mov dword ptr [ebp-14h],1

00ac1046 mov dword ptr [ebp-10h],2

00ac104d mov dword ptr [ebp-0ch],3

00ac1054 mov dword ptr [ebp-8],4

printf(

"%d\b

",func2(a));

00ac105b lea eax,[a]

00ac105e push eax

00ac105f call func2 (0ac10d0h)

00ac1064 add esp,

400ac1067 push eax

00ac1068 push 0ac2108h

00ac106d call printf (0ac1140h)

00ac1072 add esp,

8printf(

"writing code...\n");

00ac1075 push 0ac210ch

00ac107a call printf (0ac1140h)

00ac107f add esp,

4func3();

00ac1082 call __vcrt_va_start_verify_argument_type

const * const>(0ac10f0h)

getchar();

00ac1087 call dword ptr [__imp__getchar (0ac20a8h)]

return0;

00ac108d xor eax,eax

}

還有要注意的是這裡為了防止**優化,要關閉vc的編譯優化選項。用以上這種方法可以配合一些跳轉讓反彙編的工具不能正確**哪部分是**區,從而達到隱藏一部分**的目的。

以上是stdcall呼叫約定的例子,cdecl和其他約定的以後再嘗試整理。

反彙編的應用1 軟體破解

下面的案例主要介紹反彙編的使用價值,即在軟體加解密方面的應用,可以很好地體會到基本的彙編指令在實踐中的應用,也可以認識到ollydbg在軟體除錯過程中的威力。選用的示例程式crackme.exe程式來自看雪論壇的 從零開始用ollydbg cracking 系列。本文只做學習交流用途,不作其他任何用...

C 反彙編揭秘1 乙個簡單的C 程式反彙編解析

本系列主要從彙編角度研究c 語言機制和彙編的對應關係。第一篇自然應該從最簡單的開始。c 的源 如下 class my class void method int n my class private int m member int tmain int argc,tchar argv 可以直接deb...

關於後期lldb反彙編顯示問題的解決辦法

之前很多人都xcode公升級到了5以後,lldb在反彙編的時候顯示會有問題,這邊我就一併給出解決方案吧,也算是做個存檔.我的xcode是最新的版本是6.1,lldb版本也是最新lldb 320.4.156.由於後期版本,蘋果的lldb預設使用的是arm反彙編顯示,所以這時候我們在顯示我們想要的反彙編...