APIHOOK

 


弄了三天,终于成功的HOOK上了CreateProcess。代码如下

001 /*================================================================
002 * 函 数 名: OldFunc2NewFunc
003 * 参 数:
004 * FARPROC pOldFunc [IN] : 原API入口地址
005 * FARPROC pNewFunc [IN] : 自定义API入口地址
006 *
007 * 功能描述:
008 * 获取并置换原API函数JMP地址
009 * 返 回 值: 无
010 * 抛出异常:
011 * 作 者:  2010-03-24
012 ================================================================*/

013 VOID OldFunc2NewFunc(FARPROC pOldFunc, FARPROC pNewFunc)
014 {
015 DWORD dwPID = ::GetCurrentProcessId();
016
017 if (DWORD(pOldFunc) == GET_FAILED)
018 {
019 OutputErrorMsg(::GetLastError());
020 return;
021 }
022
023 if (!EnableDebugPrivilege())
024 {
025 OutputErrorMsg(::GetLastError());
026 return;
027 }
028 g_hProcess = ::OpenProcess(PROCESS_ALL_ACCESS,FALSE, dwPID);
029 if (NULL == g_hProcess)
030 {
031 OutputErrorMsg(::GetLastError());
032 return;
033 }
034
035 pOldFunction = pOldFunc;
036
037 //bNewCode[0] = 0xE9; // JMP 指令机器码
038 // 计算跳转距离
039 //DWORD dwFuncAddr = 0;
040 //pFuncAddr = (DWORD*)(bNewCode + 1);
041 /*
042 __asm
043 {
044 pushad
045 call _calc_dela
046 _calc_dela:
047 pop ebx
048 sub ebx, offset _calc_dela
049 ;lea eax, stHAH.newAPIAddr
050 lea eax, pNewFunc
051 mov edx, pOldFunc
052 sub eax, edx
053 sub eax, 5
054 add eax, ebx
055 lea edx, stHAH.newAPIAddr
056 mov [edx], eax
057 popad
058 }
059
060 //stHAH.newAPIAddr = DWORD(pNewFunc) – DWORD(pOldFunc) – 5;
061 //stHAH.newAPIAddr= DWORD(*pFuncAddr);
062 */

063
064 stHAH.newAPIAddr = DWORD(pNewFunc);
065
066 // 保存原API函数入口地址
067 MoveMem(bOldCode, pOldFunc, sizeof(HOOKAPIS_HEAD));
068
069 // 置换原API函数JMP地址为自定义API函数JMP地址
070 WriteAPIEntry(pOldFunc, &stHAH, sizeof(HOOKAPIS_HEAD));
071 }
072 /*================================================================
073 * 函 数 名: WriteAPIEntry
074 * 参 数:
075 * FARPROC pOldFunc [IN] : 原API入口地址
076 * LPCVOID lpData [IN] : 自定义API函数JMP地址
077 * SIZE_T size [IN] : 写入数据长度
078 *
079 * 功能描述:
080 * 写API入口函数地址
081 * 返 回 值: 无
082 * 抛出异常:
083 * 作 者: 马 2010-03-26
084 ================================================================*/

085 VOID WriteAPIEntry(FARPROC pOldFunc, LPCVOID lpData, SIZE_T size)
086 {
087 BOOL bResult;
088 MEMORY_BASIC_INFORMATION stMBI;
089 HANDLE hProcess = ::GetCurrentProcess();
090
091 memset(&stMBI, 0, sizeof(MEMORY_BASIC_INFORMATION));
092 // 返回页面虚拟信息
093 if (::VirtualQueryEx(hProcess, pOldFunc, &stMBI,sizeof(MEMORY_BASIC_INFORMATION)))
094 {
095 // 修改所在页面的属性
096 bResult = ::VirtualProtectEx(hProcess, stMBI.BaseAddress,
097 size, PAGE_EXECUTE_READWRITE, &stMBI.Protect);
098 if (!bResult)
099 {
100 OutputErrorMsg(::GetLastError());
101 return;
102 }
103
104 // 修改跳转指令使其JMP自定义API函数入口
105 bResult = ::WriteProcessMemory(hProcess, pOldFunc, lpData,
106 size, NULL);
107 if( !bResult)
108 {
109 OutputErrorMsg(::GetLastError());
110 return;
111 }
112
113 // 还原该页属性
114 bResult = ::VirtualProtectEx(hProcess, pOldFunc,
115 size, PAGE_EXECUTE_READ, &stMBI.Protect);
116 if (!bResult)
117 {
118 OutputErrorMsg(::GetLastError());
119 return;
120 }
121 }
122
123 }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值