能力值:
( LV2,RANK:10 )
|
-
-
2 楼
void test(void)
{
MessageBox(NULL,_T("1111"),_T("test"),MB_OK);
}
void CtestJMDlg::OnBnClickedButton1()
{
CString tStr;
#if 0
char *p = (char *)OnBnClickedButton1;
#else
char *p = (char *)test;
#endif
DWORD tRVA = m_Encrypt.GetFunctionRVA(p);
tStr.Format(_T("RVA=%08lx %ld"),tRVA,tRVA);
::MessageBox(NULL,tStr,_T("test"),MB_OK);
}
DWORD CEncrypt::GetFunctionRVA(void* FuncName)
{
void *_tempFuncName = FuncName;
char *ptempFuncName = (char *)(_tempFuncName);
DWORD _jmpdwRVA, dwRVA;
CopyMemory(&_jmpdwRVA, ptempFuncName+1, 4);
dwRVA = (DWORD)ptempFuncName + _jmpdwRVA + 5;
return (dwRVA);
}
上面是主要代码,当将#if 0改成#if 1时,即取void CtestJMDlg::OnBnClickedButton1()的地址时出现类型转换的错误。
Thanks!
|
能力值:
( LV6,RANK:90 )
|
-
-
3 楼
1.在h文件加入
#pragma warning(disable : 4248)
2.在CPP文件加入
#define BEGIN_MEMFUNC_ENTRY_MAP() \
typedef void (CObject::*PFuntionName)(void); \
PFuntionName pFunAddress = NULL; \
#define MEMFUNC_ENTRY(memFunc,entry) \
pFunAddress = (PFuntionName)memFunc; \
entry = *((DWORD*)&pFunAddress); \
3.在使用的地方
DWORD dwAddress = 0;
BEGIN_MEMFUNC_ENTRY_MAP() // 这行必须要
MEMFUNC_ENTRY(CString::Delete,dwAddress) // 这里就可以得到CString::Delete的函数地址了
*/
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
谢谢,OK了
似乎不需要#pragma warning(disable : 4248),注释掉没有编译没有问题!
其实主要是类型转换的问题,有个小疑问,自己定义的类CEncrypt并没有基类,更没有基于CObject,为何可以使用pFunAddress = (PFuntionName)CEncrypt::Test;来转换?
|
能力值:
( LV6,RANK:90 )
|
-
-
5 楼
类不需要从CObject派生,这里纯粹是骗过编译器而已,放心吧
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
thanks!
|
能力值:
( LV4,RANK:50 )
|
-
-
7 楼
#include <stdio.h>
#include <stdlib.h>
class C
{public:
void f() {}
};
void main()
{
char buf[12];
sprintf(buf,"%u",C::f);
int d=atoi(buf);
printf("%p\n",d);
}
#include <stdio.h>
#include <stdarg.h>
class C
{public:
void f() {}
};
int func(int unused,...)
{
va_list args;
va_start(args,unused);
return va_arg(args,int);
}
void main()
{
printf("%p\n",func(0,C::f));
}
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
[QUOTE=dwing;333494]#include <stdio.h>
#include <stdlib.h>
class C
{public:
void f() {}
};
void main()
{
char buf[12];
sprintf(buf,"%u",...[/QUOTE]
这也行!
有个C4313的warning, 程序执行没有问题。
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
再问一下,如何由地址转换到类成员函数,即dwAddress转换到CString::Delete?
解决:
和entry = *((DWORD*)&pFunAddress); 的道理是一样的。
|
能力值:
(RANK:650 )
|
-
-
10 楼
[QUOTE=dwing;333494]#include <stdio.h>
#include <stdlib.h>
class C
{public:
void f() {}
};
void main()
{
char buf[12];
sprintf(buf,"%u",...[/QUOTE]
太强了,又学到一招
我以后有困难找dwing
|
能力值:
( LV15,RANK:2473 )
|
-
-
11 楼
我要拜师学艺
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
|
|
|