zoukankan      html  css  js  c++  java
  • 【逆向知识】裸函数(Naked函数)

    1 说明

    指定裸函数编写的函数,编译器生成不带任何多余代码。 利用此功能,可以使用内联汇编程序代码编写自己的 prolog/epilog 代码序列。 裸函数对于编写虚拟设备驱动程序特别有用。

    2 练习目的

    • 熟悉堆栈结构

    • 参数、局部变量的位置

    • 返回值存储的位置

    3 代码实现

    // 20180217_裸函数.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    
    // 两数相加函数
    int add(int x, int y)
    {
    	return x+y;
    }
    
    
    // 裸函数实现 两数相加函数
    int __declspec(naked) Plus(int x, int y) 
    {
    	__asm
    	{
    		//保留调用前的栈底
    		push ebp
    		// 提升堆栈
    		mov ebp,esp
    		sub esp,0x40
    		// 保留现场
    		push ebx
    		push esi
    		push edi
    		// 开始填充缓冲区
    		mov eax,0xCCCCCCCC
    		mov ecx,0x10
    		lea edi,dword ptr ds:[ebp-0x40]
    		rep stosd
    
    		// 函数核心功能
    		mov eax,dword ptr ds:[ebp+0x8]
    		add eax,dword ptr ds:[ebp+0xC]
    
    		// 恢复现场
    		pop edi
    		pop esi
    		pop ebx
    
    		//降低堆栈
    		mov esp,ebp
    		pop ebp
    		ret
    	}
    }
    
    
    int main()
    {
    	// c语言函数实现
    	add(1, 2);
    	// 裸函数实现
    	Plus(1,2);
        return 0;
    }
    
    
  • 相关阅读:
    删数问题
    装箱问题
    活动选择
    智力大冲浪
    三国游戏
    最大乘积
    排队接水
    线段覆盖
    高精度重载运算符
    数的划分
  • 原文地址:https://www.cnblogs.com/17bdw/p/8452400.html
Copyright © 2011-2022 走看看