获取函数的真实地址 - jues
android分区
JList

获取函数的真实地址

jues posted @ 2013年8月15日 18:35 in 笔记(原创) , 2970 阅读

几年记得找到过一个例子,说怎么改其它函数中的变量方面的,后来以为自己会记得,现在又忘了,

自己摸索一下,写了一个应该类似的获取函数的真实地址函数,特意发来以防止再忘记。

如有错漏,望多多指出。

#include <stdio.h>


/************************************************************************

  作者: jues
  邮箱: jue_s@live.cn
  主页: http://jues.i11r.com/
  
    函数: get_fun_add
    说明: 获取函数的真实地址
	环境: win2003 sp2 VC6.0 
	日期: 2013-08-15 18:31
	
	  参数: fun 为 要获取的函数
	  返回: 真实的函数地址
	  
************************************************************************/
long get_fun_add( long fun )
{
	/**/
	if ( (char)0xE9 == (char)( *(char*)fun ) )/*0xE9 = jmp 汇编中的跳转指令,这里判断是否是虚函数*/
		( ( char* )&fun )[ 0 ] += ( ( char* )fun )[ 1 ]/* 偏移数长度 */ + 0x05/* 操作数长度 */  ;
	else
		fun = 0x000000;
	
	return fun;
}

void test()
{
	char str[] = "this is test.";
	/**/
	
	puts( str );
}

void main()
{
	long fun;
	char *str;
	/**/
	fun = ( long )get_fun_add;
	str = ( char* )get_fun_add;
	fun = get_fun_add( ( long )get_fun_add );
	
	test();
}
klouyang 说:
2013年8月16日 18:42

这有什么用呢?

Avatar_small
jues 说:
2013年8月17日 11:37

@klouyang: 这看你用来做什么,比如说,你知道一个函数中的变量地址.但那个函数又不能传参数过去,你又要改那个变量,这样话你就用到这个函数功能.

klouyang 说:
2013年8月27日 15:02

long get_fun_add( long fun )
{
/**/
if ( (char)0xE9 == (char)( *(char*)fun ) )/*0xE9 = jmp 汇编中的跳转指令,这里判断是否是虚函数*/
( ( char* )&fun )[ 0 ] += ( ( char* )fun )[ 1 ]/* 偏移数长度 */ + 0x05/* 操作数长度 */ ;
else
fun = 0x000000;

return fun;
}

void test()
{
char str[] = "this is test.";
/**/

puts( str );
}

int main()
{
long fun;
char *str;
/**/
fun = ( long )get_fun_add;
str = ( char* )get_fun_add;
printf("fun addr: %p\n", (void *)fun);

fun = get_fun_add( ( long )get_fun_add );
printf("fun addr: %p\n", (void *)fun);

test();

return 0;
}

输出是:

fun addr: 0x109143d70
fun addr: 0x0
this is test.

如此看来, 行不通啊..

gcc 版本:
[nuoerlz get_func_addr]$ gcc --version
i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)
Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Avatar_small
jues 说:
2013年8月27日 18:05

不好意思,别的版本编译器我没有测试,刚才我用你上面的代码在VC6下试了下,也是可以成功的。


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter