【逆向知识】堆栈图-汇编中的函数

push        ebp                 ; 提升堆栈
mov         ebp,esp
sub         esp,0CCh
------------------------------------------
push        ebx                 ; 保留现场,函数在执行的时候会用到一些寄存器,但这些寄存器中
push        esi                 ; 值很可能会被程序用到,所以要先存储到内存中
push        edi
push        ecx
------------------------------------------
lea         edi,[ebp-0CCh]      ; 向分配的空间填充数据
mov         ecx,33h
mov         eax,0CCCCCCCCh
rep stos    dword ptr es:[edi]
----------------------------------
pop         ecx                 ; 函数实际实现的功能
mov         dword ptr [this],ecx  

mov         eax,dword ptr [this]
mov         dword ptr [eax+4],1  

mov         eax,dword ptr [nID]
push        eax
push        offset string "\r\nID:%d Who is your God? I am!\r\n"... (0EC6E94h)
call        _printf (0E33D73h)
add         esp,8
----------------------------------------
pop         edi                 ; 恢复现场,将之前保留的寄存器的值恢复
pop         esi
pop         ebx
-----------------------------------------
add         esp,0CCh            ; 堆栈平衡
cmp         ebp,esp
call        __RTC_CheckEsp (0E32356h)
mov         esp,ebp             ; 降低堆栈
pop         ebp                 ; 恢复栈底
ret         4                   ; 函数执行完毕,返回到调用处,等同于pop eip

原文地址:https://www.cnblogs.com/17bdw/p/8451376.html

时间: 2024-11-06 12:40:28

【逆向知识】堆栈图-汇编中的函数的相关文章

逆向知识十三讲,汇编中数组的表现形式,以及还原数组

逆向知识十三讲,汇编中数组的表现形式,以及还原数组 讲解数组之前,要了解数组的特性 1.数据具有连续性 2.数据类型相同 比如: int Ary[3] = {0,1,2}; 我们可以看出,上面定义的数组,数据是连续的,其中每个数据类型大小都是int类型(类型也是一样的) 汇编中识别数组: 1.地址连续 2.带有比例因子寻址   (lea  reg32,[xxx  + 4 *xxxx]) 一丶一维数组在汇编中的表现形式 首先说下数组寻址公式,便于下面讲解 公式: 数组首地址 + sizeof(ty

汇编中调用函数(类比c

使用call 标号 +ret指令来实现,还可实现嵌套调用 call 标号 : : 标号: : ret

逆向知识第九讲,switch case语句在汇编中表达的方式

一丶Switch Case语句在汇编中的第一种表达方式 (引导性跳转表) 第一种表达方式生成条件: case 个数偏少,那么汇编中将会生成引导性的跳转表,会做出 if else的情况(类似,但还是能分辨出来的) 1.高级代码: #include "stdafx.h" int main(int argc, char* argv[]) { switch(argc) { case 0: printf("case 0\n"); break; case 1: printf(&

逆向知识第十讲,循环在汇编中的表现形式,以及代码还原

一丶do While在汇编中的表现形式 1.1高级代码: #include "stdafx.h" int main(int argc, char* argv[]) { int nSum = 0; int i = 0; do { nSum = nSum + i; } while (i <=100); return 0; } 高级代码很简单,只是一个简单的求1~100的累加 1.2 Debug版本下的汇编表现形式 代码定式很简单 ADDR .....do While逻辑代码块 xxx

逆向知识第八讲,if语句在汇编中表达的方式

一丶if else的最简单情况还原(无分支情况) 高级代码: #include "stdafx.h" int main(int argc, char* argv[]) { unsigned int nNumber = 0; scanf("%ud",&nNumber); if(argc == 0) { nNumber = 0; //第一种情况下无分支 } else { nNumber = -1; } return nNumber; } 总共两种情况,我们看下R

大脸猫讲逆向之ARM汇编中PC寄存器详解

i春秋作家:v4ever 近日,在研究一些开源native层hook方案的实现方式,并据此对ARM汇编层中容易出问题的一些地方做了整理,以便后来人能有从中有所收获并应用于现实问题中.当然,文中许多介绍参考了许多零散的文章,本文重点工作在于对相关概念的整理收集,并按相对合理顺序引出后文中对hook技术中的一些难点的解读. Android平台大多采用了ARM架构的CPU,而ARM属RISC,与X86架构的处理器有不同的特征,本文讲介绍ARM中不容易理解的PC寄存器各种问题,包括ARM流水线.PC寄存

逆向知识十一讲,识别函数的调用约定,函数参数,函数返回值.

逆向知识十一讲,识别函数的调用约定,函数参数,函数返回值. 在反汇编中,我们常常的会看到各种的函数调用,或者通过逆向的手段,单独的使用这个函数,那么此时,我们就需要认识一下怎么识别函数了. 一丶识别__cdecl 函数(俗称C Call),函数参数,函数返回值 首先写一个C Call的函数 1.返回值 int类型, 参数int 类型 高级代码: int __cdecl MyAdd(int a,int b) { return a + b; } int main(int argc, char* ar

从1.6W名面试者中收集的Java面试题精选汇总(内附知识脑图)

本篇的面试题是接之前读者的要求,发出来的. 首先,声明下,以下知识点并非全部来自BAT的面试题. 如果觉得在本文中笔者总结的内容能对你有所帮助,可以点赞关注一下. 本文会以引出问题为主,后面有时间的话,笔者陆续会抽些重要的知识点进行详细的剖析与解答. 基础篇 基本功 1.面向对象的特征 2.final, finally, finalize 的区别 3.int 和 Integer 有什么区别 4.重载和重写的区别 5.抽象类和接口有什么区别 6.说说反射的用途及实现 7.说说自定义注解的场景及实现

PC逆向之代码还原技术,第六讲汇编中除法代码还原以及原理第二讲,被除数是正数 除数非2的幂

目录 一丶简介 二丶代码还原讲解 1.被除数无符号 除数非2的幂 2.被除数无符号 除数为特例7 三丶代码还原总结 一丶简介 上一篇博客说的除2的幂. 如果被除数是有符号的,那么会进行调整,并使用位操作进行优化 本片博客专门讲解除数不是2的幂 二丶代码还原讲解 1.被除数无符号 除数非2的幂 高级代码: Release汇编 .text:0040101A mov eax, 38E38E39h .text:00401023 mul [esp+10h+var_8] .text:00401027 shr