#pragma
warning(disable:4786)
#include
#include
using namespace std;
// 这个函数取得函数fun的函数体首位地址[return
value:*ppend)
void* GetFunAddr( void* fun, void** ppend = 0
)
{
void* pbegin = fun;
#ifdef _DEBUG
pbegin = (unsigned*)(
(unsigned)pbegin + (((*(unsigned*)pbegin)>>8)+5) );
#endif
if( 0
!= ppend )
{
unsigned char* p = (unsigned
char*)pbegin;
for( ; *p!=(unsigned char)0xC3; ++p ); // C3 == __asm
ret, 这其实不对,应该只找操作码,跳过操作数
*ppend = ++p;
}
return
pbegin;
}
// 将函数体代码保存到数组中 //
这段代码没有考虑fun中其他函数的调用,也没有考虑重定向问题,仅仅是一个演示
const vector
GetFunObject( void* fun )
{
void* pb = 0;
void* pe =
0;
pb = GetFunAddr( fun, &pe );
return vector( (unsigned char*)pb, (unsigned char*)pe );
}
// 这是个演示函数
int
test( int a, int b )
{
return a+b;
}
void
main()
{
typedef (*TEST)(int,int);
vector testobj = GetFunObject(test);
TEST p =
(TEST)&testobj[0];
int a = (*p)( 1, 2 );
cout << "1+2="
<< a << endl;
}
阅读(1097) | 评论(4) | 转发(0) |