首页 > 编程语言 >C语言逆向汇编——参数局部变量、函数堆栈、调用约定和内嵌汇编码

C语言逆向汇编——参数局部变量、函数堆栈、调用约定和内嵌汇编码

时间:2023-04-01 09:46:45浏览次数:33  
标签:汇编 函数 int C语言 noopener plus rel 堆栈

第一节 1.1C语言

1、注意参数局部变量堆栈中的存储方式

2、参数调用函数前就已经存入堆栈,从[EBP+8]、[EBP+C]、……开始。

3、局部变量是在调用函数后,存入缓冲区里,从[EBP-4]、[EBP-8]、……开始

4、函数运算得到的结果,通常存在EAX里


 

 

 

 

 

 

 

 

第一节 1.2逆向汇编

 

 

第一节 1.3练习1

练习1:编写一个函数能够对任意2个整数实现加法,并分析函数的反汇编.

int Plus(int x,int y)

#include <iostream>
#include<Windows.h>

//实现加法功能的函数
int plus(int x,int y)
{
    return x + y;
}

int main()
{
    //调用函数plus();
    plus(1,2);
    system("pause");
}

 

 

第一节 1.4练习2

练习2:编写一个函数,能够对任意3个整数实现加法,并分析函数的反汇编(要求使用上一个函数).

int Plus2(int x,int y,int z)





#include "stdio.h"

int plus(int x,int y)
{
    return x+y;
}

int plus2(int x,int y,int z)
{
    int i = plus(x,y);
    return plus(i,z);
}

void main(int argc,char* argv[])
{
    plus2(1,2,3);
}

 

 

第一节 1.3练习3

3、编写一个函数,能够实现对任意5个整数实现加法(使用Plus1和Plus2).

并分析一个函数的反汇编代码.

int Plus3(int a,int b,int c,int d,int e)





#include "stdio.h"

int plus(int x,int y)
{
    return x+y;
}

int plus2(int x,int y,int z)
{
    int i = plus(x,y);
    return plus(i,z);
}

int plus3(int a,int b,int c,int d,int e)
{
    int i;
    int r;
    i = plus(a,b);
    r = plus2(c,d,e);
    return i+r;
}

void main(int argc,char* argv[])
{
    plus3(5,6,7,8,9);
}
第二节 2.1裸函数与汇编写法

1、裸函数的写法

2、如何在C语言里写汇编代码


 

 

声明一个裸函数后,编译器不会生成任何的代码

 

 


#include <iostream>
#include<Windows.h>

//构造裸函数
int __declspec(naked) plus(int x,int y)
{    
    __asm
    {
        //提升堆栈
        push ebp
        mov ebp,esp
        sub esp,0x40

        //保护现场
        push edi
        push ebx
        push esi

        //填充缓冲区
        lea edi,dword ptr ss:[ebp-0x40]
        mov ecx,0x10
        mov eax,0xcccccccc
        rep stosd

        //加法功能
        mov eax,[ebp+0x8]
        add eax,[ebp+0xc]

        //恢复现场
        pop esi
        pop ebx
        pop edi

        //降低堆栈
        mov esp,ebp
        pop ebp

        ret
    }
}
int main()
{
    plus(1,2);
    system("pause");
}
第二节 2.2调用约定
1、参数是如何传入堆栈?
2、如何平衡堆栈的?

————————————————————————-


调用约定参数压栈平衡堆栈
_cdecl              (C和C++默认的调用约定) 从右至左 调用者清理
_stdcall       API使用的调用约定 从右至左 自身清理
_fastcall ecx/edx传送前两个剩下的从右至左 自身清理(只有2个参数,不需要内平栈)

————————————————————————

_cdecl

cdecl(C declaration,即C声明)是源起C语言的一种调用约定,也是C语言的事实上的标准。

1.函数实参在线程栈上按照从右至左的顺序依次压栈

2.函数结果保存在寄存器EAX/AX/AL中

3.浮点型结果存放在寄存器ST0中

4.编译后的函数名前缀以一个下划线字符    例:sumExample 编译后:_sumExample

5.调用者负责从线程栈中弹出实参(即清栈

6.8比特或者16比特长的整形实参提升为32比特长

7.受到函数调用影响的寄存器(volatile registers):EAX, ECX, EDX, ST0 - ST7, ES, GS

8.不受函数调用影响的寄存器: EBX, EBP, ESP, EDI, ESI, CS, DS

9.RET指令从函数被调用者返回到调用者(实质上是读取寄存器EBP所指的线程栈之处保存的函数返回地址并加载到IP寄存器)

10.堆栈平衡是由调用函数来执行的(在call [地址],之后会有add esp xx表示参数的字节数

 

 

标签:汇编,函数,int,C语言,noopener,plus,rel,堆栈
From: https://www.cnblogs.com/bonelee/p/17278094.html

相关文章

  • c语言include文件路径(c语言include相对路径)
    原文:http://www.easyaq.com/post/11694.html今天给各位分享c语言include文件路径的知识,其中也会对c语言include相对路径进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录一览:1、C语言include能不能是相对路径?2、C语言中,include是什么意思?3、#incl......
  • 逍遥自在学C语言 | 第一个C语言程序 九层之台起于垒土
    一、人物简介第一位闪亮登场,有请今后会一直教我们C语言的老师——自在。第二位上场的是和我们一起学习的小白程序猿——逍遥。二、C语言简介C语言是一种高级语言,运行效率仅次于汇编,支持跨平台C语言是学习其他高级语言的基础,如C++、Java和Python三、编程环......
  • C语言编程练习_查找数组中不重复的数字
    题目描述:给定一个整形数组空间arr,数据中包含两个一样的数字若干,只有一个数字是单独一个。设计一个函数把这个出现一次的数字返回出来。 解决方案一:穷举法:假设arr数组中的每个元素都是重复的。也可能是不重复的(效率差)#include<stdio.h>intfun1(intarr[],intlen){  ......
  • C语言 特殊例子及说明
    #include<stdio.h>main(){charc;c=0345;printf("%d\n",c);}16进制:每个16进制转成4位2进制,分组计算8进制345:转2进制,每个8进制转成3位2进制2进制:011100101229:1286432168421补码:11......
  • C语言以结构体的方式写入eeprom数据
    unsignedcharmin_change0=0,//要保存的变量值第一组,每一次改变都会保存unsignedcharmin_change_backup0=0;//该变量为中间变量,用于与min_change做对比,下同unsignedcharmin_change1=0,//要保存的变量值第二组,每一次改变都会保存unsignedcharmin_change_b......
  • 文件-C语言
    格式化的输入输出:printf%[flag][width][.prec][hil]typescanf%[flag]typeprintf:%[flag][width][.prec][hil]typeFlag含义-左对齐+在前面放+或-(space)正数留空00填充width或prec含义number最小字符数*下一个参数是字符数.numbe......
  • 学习C语言第三天
    前一天学习的数组,接下来要学习的是二维数组和函数。一.二维数组1.1引入场景有三个小队,每个小队都有10个人,对小队进行一些操作。1.2二维数组的定义和表达形式二位数组通常称为矩阵类型说明符数组名[常量表达式][常量表达式]例:intarr[3][3];//一个......
  • 堆栈分析-常见服务器问题
    一、常见服务器问题定位:1、常见服务器问题:日常开发中,我们常见的服务器问题主要可以归类为一下几种::CPU过载问题内存过高问题磁盘IO问题网络问题2、服务器问题定位总体思......
  • 联合、变量、宏-C语言
    在C语言中,联合有以下特性:存储方面:所有的成员共享一个空间同一时间只有一个成员是有效的union的大小是其最大的成员初始化:对第一个成员做初始化静态本地变量:在本地......
  • C语言的函数原型(执行顺序问题)
    以下面一段代码为参考:像这样把sum()写在上面是因为:C语言的编译器是从上往下执行代码的,当他看到sum(1,10);sum(1,100);时,要知道sum()是个什么东西,也就是sum()要几个参......