<iframe align="center" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog.html" frameborder="0" width="728" scrolling="no" height="90"></iframe>
一般的程序都是在运行前已经编译好的,因此修改指令的机会比较少,但在软件的防确解里,倒是使用很多。当修改指令之后,怎么样才能让CPU去执行新的指令呢?这样就需要使用函数FlushInstructionCache来把缓存里的数据重写回主内存里去,让CPU重新加载新的指令,才能执行新的指令。下面就来学习一下使用这个函数来实现跳到一个静态函数里执行,而不是直接地调用这个函数。
函数FlushInstructionCache声明如下:
WINBASEAPI
BOOL
WINAPI
FlushInstructionCache(
__in HANDLE hProcess,
__in_bcount_opt(dwSize) LPCVOID lpBaseAddress,
__in SIZE_T dwSize
);
hProcess是进程句柄。
lpBaseAddress是要同步内存的开始地址。
dwSize是要同步内存的大小。
调用函数的例子如下:
#001//声明函数类型。
#002typedef void (*TESTFUN)(void);
#003
#004//定义修改代码的结构。
#005#pragma pack(push,1)
#006struct ThunkCode
#007{
#008BYTE m_jmp; // jmp TESTFUN,跳转指令。
#009DWORD m_relproc; // relative jmp,相对跳转的位置。
#010};
#011#pragma pack(pop)
#012
#013//测试动态修改内存里的指令数据。
#014//蔡军生2007/12/06 QQ:9073204 深圳
#015class CFlush
#016{
#017public:
#018//保存动态修改代码的内存。
#019ThunkCode m_Thunk;
#020
#021//初始化跳转代码。
#022void Init(TESTFUN pFun, void* pThis)
#023{
#024 //设置跳转指针。
#025 m_Thunk.m_jmp = 0xe9;
#026
#027 //设置跳转的相对地址。
#028 m_Thunk.m_relproc = (int)pFun - ((int)this+sizeof(m_Thunk));
#029
#030 //把CPU里的缓冲数据写到主内存。
#031 FlushInstructionCache(GetCurrentProcess(),
#032 &m_Thunk, sizeof(m_Thunk));
#033}
#034
#035//真实运行的函数。
#036static void TestFun(void)
#037{
#038 OutputDebugString(_T("CFlush 动态修改代码运行/r/n"));
#039}
#040
#041};
#042
如下调用这个类:
#001//测试运行。
#002CFlush flushTest;
#003
#004flushTest.Init(flushTest.TestFun,&flushTest);
#005TESTFUN pTestFun = (TESTFUN)&(flushTest.m_Thunk);
#006pTestFun();
分享到:
相关推荐
-----6 Windows API 一日一练(4)MessageBox函数----------------------9 Windows API 一日一练(5)RegisterClass和RegisterClassEx函数-----------------------------------------------------------------------...
Windows API 一日一练(4)MessageBox函数--------------------------------------------------------9 Windows API 一日一练(5)RegisterClass 和 RegisterClassEx 函数---------------11 Windows API 一日一练(6)...
windows函数训练,大家来看看1
Windows API 就是windows应用程序接口,是针对microsoft windows操作系统家族的系统编程接口,这样的系统包括Windows 7,Windows Vista、Windows XP、Windows Server 2003、Windows 2000、Windows 95、Windows 98、...
windows API一日一练适合windows编程的初学者,它包含了常用的API函数
API函数一日一练,API函数一日一练,API函数一日一练
书中详细介绍了每一个Win32 API函数的使用方法,其中着重介绍其原型表示、函数说明、参数说明、注意事项、相应头文件(.H)、链接库(.LIB或.DLL)和典型示例。对于每个函数《Windows API 函数参考手册》给出了相应...
熟悉WIN32API极好教材,对熟悉操作系统底层函数及外挂技术入门基础
。。。
。。。
详细描述了Windows+API的使用方法,提供了学习api函数的最佳途径
《WindowsAPI函数参考手册》是2002年人民邮电出版社出版的图书,作者是《windowsapI函数参考手册》组。《Windows API 函数参考手册》是关于Microsoft Win32 API函数的完整参考手册。书中详细介绍了每一个Win32 API...
Windows api函数大全 Windows api函数大全 Windows api函数大全 Windows api函数大全
Windows API 函数 for Windows API 函数 Windows API 函数 for Windows API 函数 Windows API 函数 for Windows API 函数
Windows API大全,本书主要介绍VC++里API函数及其用法-WindowsAPI Daquan, the book introduces VC Lane API function