#include BOOL LockOtherThread()
{
DWORD dwCurrPid=GetCurrentProcessId();
DWORD dwCurrTid=GetCurrentThreadId();
HANDLE hThread=NULL;
HANDLE hThreadSnap=NULL;
THREADENTRY32 te32= { 0};
te32.dwSize= sizeof(THREADENTRY32);//遍历线程
if (Thread32First(hThreadSnap, &te32))
{do{if (te32.th32OwnerProcessID ==dwCurrPid) {if (te32.th32ThreadID !=dwCurrTid){//获取句柄
hThread =OpenThread(THREAD_SUSPEND_RESUME, FALSE, te32.th32ThreadID);if (NULL !=hThread){
SuspendThread(hThread);
}
CloseHandle(hThread);
}
}
}while (Thread32Next(hThreadSnap, &te32));
}
CloseHandle(hThreadSnap);returnTRUE;
}
BOOL UnlockOtherThread()
{
DWORD dwCurrPid=GetCurrentProcessId();
DWORD dwCurrTid=GetCurrentThreadId();
HANDLE hThread=NULL;
HANDLE hThreadSnap=NULL;
THREADENTRY32 te32= { 0};
te32.dwSize= sizeof(THREADENTRY32);//遍历线程
if (Thread32First(hThreadSnap, &te32))
{do{if (te32.th32OwnerProcessID ==dwCurrPid) {if (te32.th32ThreadID !=dwCurrTid){//获取句柄
hThread =OpenThread(THREAD_SUSPEND_RESUME, FALSE, te32.th32ThreadID);if (NULL !=hThread){
ResumeThread(hThread);
}
CloseHandle(hThread);
}
}
}while (Thread32Next(hThreadSnap, &te32));
}
CloseHandle(hThreadSnap);returnTRUE;
}static void __inner_memcpy(unsigned char* pDest, unsigned char* pSrc, unsigned intcount)
{while(count > 0) {*pDest++ = *pSrc++;
count--;
}
}
XSimpleStub::XSimpleStub(void* pOrigFunc, void* pNewFunc, boolneed_lock_other_thread):
str_func_addr(pOrigFunc), is_stub_succ(false), need_lock_other_thread_(need_lock_other_thread)
{//源地址、目标地址需要进行一次判定
if (nullptr != pOrigFunc && nullptr !=pNewFunc)
{
DWORD ProtectVar;//保护属性变量
MEMORY_BASIC_INFORMATION MemInfo; //内存分页属性信息//取得对应内存的原始属性
if (0 != VirtualQuery(pOrigFunc, &MemInfo, sizeof(MEMORY_BASIC_INFORMATION)))
{//如果需要锁住所有其他线程,则先执行锁定动作
if(need_lock_other_thread) {
LockOtherThread();
}//修改页面为可写
if(VirtualProtect(MemInfo.BaseAddress, MemInfo.RegionSize, PAGE_READWRITE, &MemInfo.Protect))
{//备份原数据,防止自身需要使用memcpy,不能使用类似接口
__inner_memcpy((unsigned char*)str_instruct_back, (unsigned char*)pOrigFunc, JMPCODE_LENGTH);//修改目标地址指令为 jmp pDestFunc
*(unsigned char*)pOrigFunc = JMPCMD; //拦截API,在函数代码段前面注入jmp xxx
*(DWORD*)((unsigned char*)pOrigFunc + JMPCMD_LENGTH) = (DWORD)pNewFunc - (DWORD)pOrigFunc -JMPCODE_LENGTH;//改回原属性
VirtualProtect(MemInfo.BaseAddress, MemInfo.RegionSize, MemInfo.Protect, &ProtectVar);//修改后,还需要刷新cache
FlushInstructionCache(GetCurrentProcess(), pOrigFunc, JMPCODE_LENGTH);
is_stub_succ= true;
}//如果需要锁住所有其他线程,则先执行锁定动作
if(need_lock_other_thread) {
UnlockOtherThread();
}
}
}
}
XSimpleStub::~XSimpleStub()
{if(is_stub_succ)
{
DWORD TempProtectVar;//临时保护属性变量
MEMORY_BASIC_INFORMATION MemInfo; //内存分页属性信息
if (0 != VirtualQuery(str_func_addr, &MemInfo, sizeof(MEMORY_BASIC_INFORMATION)))
{//如果需要锁住所有其他线程,则先执行锁定动作
if(need_lock_other_thread_) {
LockOtherThread();
}//修改页面为可写
if(VirtualProtect(MemInfo.BaseAddress,MemInfo.RegionSize, PAGE_READWRITE,&MemInfo.Protect))
{//恢复代码段
__inner_memcpy((unsigned char*)str_func_addr, (unsigned char*)str_instruct_back, JMPCODE_LENGTH);//改回原属性
VirtualProtect(MemInfo.BaseAddress,MemInfo.RegionSize, MemInfo.Protect,&TempProtectVar);//修改后,还需要刷新cache
FlushInstructionCache(GetCurrentProcess(), str_func_addr, JMPCODE_LENGTH);
}//如果需要锁住所有其他线程,则先执行锁定动作
if(need_lock_other_thread_) {
UnlockOtherThread();
}
}
}
}