_ReturnAddress 使用

msdn:

The _ReturnAddress intrinsic
provides the address of the instruction in the calling function that will be executed after control returns to the caller.

_ReturnAddress 返回当前调用函数返回的地址,即函数吓一跳指令地址

读起来有些拗口,我们通过实例观察下

代码:

// compiler_intrinsics__ReturnAddress.cpp
#include <stdio.h>
#include <windows.h>
#include <intrin.h>

#pragma intrinsic(_ReturnAddress)
__declspec(noinline) ULONG_PTR caller( VOID ) { return (ULONG_PTR)_ReturnAddress(); }

	__declspec(noinline)
	void noinline_func(void)
{
	 void *callerAddress = _ReturnAddress();
	printf("Return address from %s: %p\n", __FUNCTION__, callerAddress);
}

__forceinline
	void inline_func(void)
{
	 void *callerAddress = _ReturnAddress();
	printf("Return address from %s: %p\n", __FUNCTION__, callerAddress);
}

int main(void)
{
	noinline_func();
	ULONG_PTR uiLibraryAddress = caller();
	__asm
	{
		nop
		nop
		nop
		nop
	}
	inline_func();
	printf("Return address from %s: %p\n", __FUNCTION__, _ReturnAddress());
	printf("noinlineaddr = %p, inline_funcaddr = %p,uiLibraryAddress = %p \n",noinline_func,inline_func,uiLibraryAddress);
	system("pause");
	return 0;
}

程序中函数noinline_func()调用了 ReturnAddress(), ReturnAddress()返回调用函数noinline_func()的下条指令的地址,即001D1483

程序中函数inline_func()调用了 ReturnAddress(), ReturnAddress()返回调用函数inline_func()的下条指令的地址,即001D1494

caller()函数调用了 ReturnAddress()函数,返回地址为caller()下一条指令地址,001D1488

其他同样。。。。,

运行结果如下:

时间: 2024-10-09 16:07:48

_ReturnAddress 使用的相关文章

Windows x86/ x64 Ring3层注入Dll总结

0x01.前言 提到Dll的注入,立马能够想到的方法就有很多,比如利用远程线程.Apc等等,这里我对Ring3层的Dll注入学习做一个总结吧. 我把注入的方法分成六类,分别是:1.创建新线程.2.设置线程上下背景文,修改寄存器.3.插入Apc队列.4.修改注册表.5.挂钩窗口消息.6.远程手动实现LoadLibrary. 那么下面就开始学习之旅吧! 0x02.预备工作 在涉及到注入的程序中,提升程序的权限自然是必不可少的,这里我提供了两个封装的函数,都可以用于提权.第一个是通过权限令牌来调整权限

通过GetModuleHandleEx 得到函数调用者所在的DLL/EXE(转)

在有些情况下需要得到函数调用者的模块名字.比如你想限制你的某个函数只能被自己某个特定的DLL调用. 或者比如在异常处理中你想了解是那个DLL/EXE抛出了异常. API函数_ReturnAddress 和GetModuleHandleEx 函数可以帮助我们达到这个目的.以下代码演示它们的用法: void  ShowCallerModuleName() { HMODULE  hCallerModule = NULL; TCHAR  szModuleName[MAX_PATH] = _T( "&qu

vc 获得调用者的模块名称

void ShowCallerModuleName(void* calleraddr ){ HMODULE hCallerModule = NULL; TCHAR szModuleName[MAX_PATH] = _T(""); void *callerAddress = calleraddr;// _ReturnAddress(); if (GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCTSTR)calle

Windows SEH学习 x86

windows 提供的异常处理机制实际上只是一个简单的框架.咱通常所用的异常处理(比如 C++ 的 throw.try.catch)都是编译器在系统提供的异常处理机制上进行加工了的增强版本.这里先抛开增强版的不提,先说原始版本.     原始版本的机制很简单:谁都可以触发异常,谁都可以处理异常(只要它能看得见).但是不管是触发还是处理都得先注册.系统把这些注册信息保存在一个链表里,并且这个链表保存在线程的数据结构里.也就是说,异常所涉及的一些行为都是线程相关的.比如,线程 T1 触发的异常就只能