linux程序打桩,Windows下对函数打桩,及Linux类似技术

#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();

}

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值