反汇编:函数嵌套调用
实现的功能:两层函数调用,外层函数的传入的两个参数再传到子函数中相加,实现四个数相加返回
004010E8 |. 6A 03 PUSH 3 ; 压入3 004010EA |. 6A 02 PUSH 2 ; 压入2 004010EC |. 6A 01 PUSH 1 ; 压入1 004010EE |. E8 12FFFFFF CALL StackDem.00401005 ; 压入CALL地址+指令长度,再调用CALL 004010F3 |. 83C4 0C ADD ESP,0C ; 外平栈 004010F6 |. 33C0 XOR EAX,EAX ; 清空eax
进入00401005 CALL
00401070 /> \55 PUSH EBP ; 保存ebp 00401071 |. 8BEC MOV EBP,ESP ; 提升栈底 00401073 |. 83EC 48 SUB ESP,48 ; 提升栈顶 00401076 |. 53 PUSH EBX ; 压入ebx 00401077 |. 56 PUSH ESI ; 压入esi 00401078 |. 57 PUSH EDI ; 压入edi 00401079 |. 8D7D B8 LEA EDI,DWORD PTR SS:[EBP-48] ; 提升栈顶的低地址赋值给edi 0040107C |. B9 12000000 MOV ECX,12 ; ecx 为 0x12 00401081 |. B8 CCCCCCCC MOV EAX,CCCCCCCC ; eax 为 0xCCCCCCCC 00401086 |. F3:AB REP STOS DWORD PTR ES:[EDI] ; 将eax的值赋值给 之前提升的栈顶和栈底之间的值 00401088 |. C745 FC 02000>MOV DWORD PTR SS:[EBP-4],2 ; 给初始化中的第一个地址赋值为2 0040108F |. 8B45 0C MOV EAX,DWORD PTR SS:[EBP+C] ; 将压入的第一个参数的值 赋值 给eax 00401092 |. 50 PUSH EAX ; 压入 第一个参数的值 00401093 |. 8B4D 08 MOV ECX,DWORD PTR SS:[EBP+8] ; 将压入的第二个参数的值 赋值 给eax 00401096 |. 51 PUSH ECX ; 压入 第二个参数的值 00401097 |. E8 6EFFFFFF CALL StackDem.0040100A 0040109C |. 83C4 08 ADD ESP,8 ; 恢复入CALL之前的栈顶 0040109F |. 8945 F8 MOV DWORD PTR SS:[EBP-8],EAX ; 把上面的CALL返回值 赋值给这个CALL中处理的第二个参数 004010A2 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] ; 把子CALL中的参数赋值给当前eax 004010A5 |. 0345 F8 ADD EAX,DWORD PTR SS:[EBP-8] ; 上面两个值相加 004010A8 |. 0345 10 ADD EAX,DWORD PTR SS:[EBP+10] ; 上面两个值相加完之后再加上这个CALL中压入的第一个参数 004010AB |. 5F POP EDI 004010AC |. 5E POP ESI 004010AD |. 5B POP EBX 004010AE |. 83C4 48 ADD ESP,48 ; 恢复刚入CALL之前的栈顶 004010B1 |. 3BEC CMP EBP,ESP ; 比较栈顶和栈底是否相等 004010B3 |. E8 68000000 CALL StackDem.00401120 ; 检查堆栈平衡 004010B8 |. 8BE5 MOV ESP,EBP ; 把刚入CALL的时候堆栈中的栈底赋值给栈顶 004010BA |. 5D POP EBP ; 恢复入CALL之前的栈底 004010BB \. C3 RETN
进入0040100A
00401030 /> \55 PUSH EBP ; 压入ebp 00401031 |. 8BEC MOV EBP,ESP 00401033 |. 83EC 44 SUB ESP,44 00401036 |. 53 PUSH EBX 00401037 |. 56 PUSH ESI 00401038 |. 57 PUSH EDI 00401039 |. 8D7D BC LEA EDI,DWORD PTR SS:[EBP-44] 0040103C |. B9 11000000 MOV ECX,11 00401041 |. B8 CCCCCCCC MOV EAX,CCCCCCCC 00401046 |. F3:AB REP STOS DWORD PTR ES:[EDI] ; 初始化垃圾数据 00401048 |. C745 FC 0A000>MOV DWORD PTR SS:[EBP-4],0A ; 初始化的第一个数据 赋值为0x0A 0040104F |. 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8] ; 把压入的第二个参数的值 赋值给eax 00401052 |. 0345 0C ADD EAX,DWORD PTR SS:[EBP+C] ; 把压入的第一个参数的值 添加给eax 00401055 |. 0345 FC ADD EAX,DWORD PTR SS:[EBP-4] ; 把初始化的第一个数据 加给 eax 00401058 |. 5F POP EDI 00401059 |. 5E POP ESI 0040105A |. 5B POP EBX 0040105B |. 8BE5 MOV ESP,EBP 0040105D |. 5D POP EBP 0040105E \. C3 RETN
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY