内联汇编如何实现
内联汇编
行内联汇编
_asm pushad _asm mov eax,0x12345678;
块内联汇编
_asm { Pushad; Popad; }
尝试用内联汇编弹出一个提示框:
MessageBoxA(0,0,0,0);
char str[] = "HelloWorld"; _asm { push 0; push 0; lea eax, [str]; push eax; push 0; call MessageBoxA; }
传入函数前首先应参数入栈,最先入栈的为最后的函数形参,想要push一个字符串进去,我们不能简单的push str,我们应该把字符串的地址传入函数参数。
- lea eax,[str] :把str的地址给到eax
- push eax:eax入栈,保存的是字符串的地址。
裸函数
内容为空的函数
void func() { }
我们一般认为它是空的,但是它真的是空的吗?
不是的。
我们查看其反汇编
void func() { //保存栈底的地址 00EB1800 push ebp //提升堆栈空间 00EB1801 mov ebp,esp 00EB1803 sub esp,0C0h //保存临时变量 00EB1809 push ebx 00EB180A push esi 00EB180B push edi //填充堆栈空间 00EB180C mov edi,ebp 00EB180E xor ecx,ecx 00EB1810 mov eax,0CCCCCCCCh 00EB1815 rep stos dword ptr es:[edi] //安全检查 00EB1817 mov ecx,offset _C300FBC1_源@cpp (0EBC0F2h) 00EB181C call @__CheckForDebuggerJustMyCode@4 (0EB1316h) } //恢复临时变量 00EB1821 pop edi 00EB1822 pop esi 00EB1823 pop ebx //降低堆栈空间 00EB1824 add esp,0C0h 00EB182A cmp ebp,esp 00EB182C call __RTC_CheckEsp (0EB123Ah) 00EB1831 mov esp,ebp //弹出一开始的栈底 00EB1833 pop ebp 00EB1834 ret
我们可以在反汇编层面把一个函数分为三部分:
- 第一部分,进入函数,提升堆栈空间,保存临时变量,并且CC填充堆栈
- 第二部分,函数的内容,包括我们所实现的行为。
- 第三部分,即将返回主函数,降低堆栈的空间,恢复ebp及临时变量。
任何函数都具有这些操作,所以说一个什么都没有的函数其实并不是空的。
所以,我们能否自己实现一个真正的裸函数? 即这个函数里连这些汇编指令都没有。
void _declspec(naked) func() { }
- _declspec(naked):添加此表示函数为一个真正的裸函数,它里面什么都没有,只有一堆CC填充对于一个裸函数而言,就是编译器不会为这个函数生成代码,想用汇编怎么写就怎么写,那也就意味着,函数的开辟栈针,平衡堆栈,返回等都是由我们自己来实现。
我们在裸函数里自己实现一个小功能?
弹出一个提示框。
void _declspec(naked) func(char* name) { _asm { push ebp; mov ebp, esp; sub esp, 0x20; push 0; push 0; mov eax, [ebp + 8]; push eax; push 0; call MessageBoxA; add esp, 0x20; mov esp, ebp; pop ebp; ret 0x4; } } int main() { char str[] = "HelloWorld"; _asm { lea eax, [str]; push eax; call func; } return 0; }
我们省略了填充的过程,运行如下;
本文来自博客园,作者:hugeYlh,转载请注明原文链接:https://www.cnblogs.com/helloylh/p/17209685.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)