首页
社区
课程
招聘
[求助]如何获取当前执行的函数指针(地址)和参数长度?
发表于: 2018-5-29 00:39 3706

[求助]如何获取当前执行的函数指针(地址)和参数长度?

2018-5-29 00:39
3706
hi,pe的大神们,请教个问题:
我希望在函数里加一句宏,就能实现保存此函数的指针和所有参数
从而转到另一个线程去执行这个函数,自动传入参数进行调用。

在另一个线程执行并模拟所有参数都没问题
问题在于如何获取当前函数的地址,且复制所有参数。才好发到另一线程执行。

两个难题:
1.我需要知道当前函数的地址,这个有难度。
2.我需要知道当前函数的所有参数长度,起始地址是多少,长度是多少?

如:
#define _XXX宏()\
        if (GetCurrentThreadID != g_tid)\
            backup pFun and Param\
            return\

int DoWork(void *obj)
{
        _XXX宏();

    delete obj;
}






[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2018-5-29 01:02 被sunbinjin编辑 ,原因:
收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 12628
活跃值: (3127)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
汇编我知道用push  eip保存函数地址,参数本身就在栈上
2018-5-29 08:52
0
雪    币: 174
活跃值: (620)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
rongge 汇编我知道用push eip保存函数地址,参数本身就在栈上
可以用汇编,但eip已经不是函数入口地址了吧?已经执行过一些了。
参数本身是在栈上,但要知道长度哦。除非知道函数返回时ret的值?
2018-5-29 09:14
0
雪    币: 782
活跃值: (3430)
能力值: ( LV7,RANK:140 )
在线值:
发帖
回帖
粉丝
4
既然你需要用到宏,那么我认为你需要的是一种通用的,对于很多函数都要生效的一种方式。而且这些函数,可能参数是不固定数量,甚至不固定类型的。那么你的新线程如何知道参数的数量与各自的类型?
如果这些函数是已经写好了,确定下来的,那么我也没有很好的方法去封装,也许可以加一个__declspec(dllexport)导出,然后运行时根据还原出来的接口来确定参数的数量与类型。
如果是还没写的,我会这样实现:
int  func(char*  szType,  xxx,xxx,xxx);
由szType的长度来确定后面参数的数量,然后szType的内容,每个字节确定一个类型,比如szType  =  "ncs"的话,表示三个参数,依次是整数、字符、字符串指针。大概类似于这样吧。然后在传入新线程时,只需要把当前EIP作为新线程的参数传递过去,自己解析一下就可以了。
刚看到你还要获取当前函数的指针。。。这个不太会,如果函数作为naked,那么可以在入口处获取eip。如果不是naked,那么可以写一个宏,替换原有的函数定义,宏的内容包含了函数定义以及通过函数名获取函数指针。
最后于 2018-5-29 10:47 被yeyeshun编辑 ,原因:
2018-5-29 10:26
0
雪    币: 174
活跃值: (620)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
yeyeshun 既然你需要用到宏,那么我认为你需要的是一种通用的,对于很多函数都要生效的一种方式。而且这些函数,可能参数是不固定数量,甚至不固定类型的。那么你的新线程如何知道参数的数量与各自的类型?如果这些函数是已经 ...
如果拿到了参数后,调用可以不关心参数类型和个数,用push+call就行了。或者memcpy到esp之类的方法。
确实是希望通用的,放到哪都不用填写参数最爽了。
调用处有办法,现在是保存参数处无法实现。
2018-5-29 16:06
0
游客
登录 | 注册 方可回帖
返回
//