欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

關(guān)于hook設(shè)置函數(shù)如何支持多核CPU的一個說明

系統(tǒng) 2057 0

前兩天看Intel網(wǎng)站上貼了一篇關(guān)于設(shè)置HOOK的文章,講到在多核CPU上,由于執(zhí)行代碼可能存在CPU CACHE里,因此當(dāng)更改了函數(shù)起始6字節(jié)后,CPU CACHE里的對應(yīng)內(nèi)容并沒有被修改,所以需要調(diào)用 FlushInstructionCache() 函數(shù)來更新CACHE。

更新后的代碼如下,增加的代碼以粗體標(biāo)出了。

/**?通過地址來設(shè)置某個函數(shù)的鉤子函數(shù)

?@param?HANDLE hApiHook - 由ApiHook_Init()函數(shù)生成的句柄?
?@param?DWORD dwSrcFuncAddr - 源函數(shù)地址?
?@param?DWORD dwNewFuncAddr - 鉤子函數(shù)地址?
?@return?INT (by default) - -1表示失敗,>=0表示在hook數(shù)組中的序號?
*/
INT ApiHook_SetByAddr(HANDLE hApiHook, DWORD dwSrcFuncAddr, DWORD dwNewFuncAddr)
{
?DWORD?dwOldProtect;
?DWORD?dwNewProtect;
?DWORD?? lpSrcFunc;
??? DWORD?? lppNewFunc;
??? UINT???? i;
?INT??nAlreadyFlag = 0;

?APIHOOK??*pApiHook = (APIHOOK *)hApiHook;
?if ( NULL == hApiHook )
?{
??return -1;
?}

?lpSrcFunc = dwSrcFuncAddr;
??? /* 查找是否已被設(shè)置了鉤子 */
?for ( i = 0; i < pApiHook->uMaxFunctions; i++ )
?{
??if ( pApiHook->pHookData[i].dwSrcFuncAddr == lpSrcFunc )
??{
???/* 如果已經(jīng)被設(shè)置了鉤子,僅僅改變. */
???nAlreadyFlag = 1;
???break;
??}

?}
?/* 如果沒有設(shè)置源函數(shù)的鉤子函數(shù),在表中找出一個可供記錄的位置. */
?if ( i == pApiHook->uMaxFunctions )
?{
??for ( i = 0; i < pApiHook->uMaxFunctions; i++ )
??{
???if (pApiHook->pHookData[i].wFlag == 0 )
???{
????break;
???}
??}??
??if ( i == pApiHook->uMaxFunctions )
??{
???return -1;
??}
?}

??? /* 將新的鉤子函數(shù)地址記錄到表中 */
?pApiHook->pHookData[i].dwNewFuncAddr = dwNewFuncAddr;
?
?/* 以下這段代碼將源函數(shù)頭部6個字節(jié)保存到表中 */
?lppNewFunc = (DWORD)(&(pApiHook->pHookData[i].dwNewFuncAddr) );

?if ( !nAlreadyFlag )
?{
??/* 將源函數(shù)起始處6個字節(jié)保存到 byHeaderCode.中 */
??????? memcpy( pApiHook->pHookData[i].byHeaderCode, (const void *)lpSrcFunc, 6);
?}

??? /* 以下這段代碼將源函數(shù)首部6個字節(jié)改成為一條跳轉(zhuǎn)到新函數(shù)地址的指令 */
??? if ( VirtualProtect( (LPVOID)lpSrcFunc,
???????????????????????? 6,
???????????????????????? PAGE_EXECUTE_READWRITE,
???????????????????????? &dwOldProtect ) == 0 )
??? {
??????? /*
???????? * Failure.
???????? */
??????? return -1;
??? }
?
??? *(unsigned char *)lpSrcFunc = (unsigned char)0xff;
??? *(((unsigned char *)lpSrcFunc)+1) = (unsigned char)0x25;

??? memcpy( (void *)(lpSrcFunc+2),
??????????? (const void *)&lppNewFunc,
??????????? 4 );??????????????????????????? /* address? */

??? if ( VirtualProtect( (LPVOID)lpSrcFunc,
???????????????????????? 6,
???????????????????????? dwOldProtect,
?????? &dwNewProtect) == 0 ) {
??????? /*
???????? * Failure.
???????? */
??????? return -1;
??? };

?pApiHook->pHookData[i].wFlag = 1;
?pApiHook->pHookData[i].dwSrcFuncAddr = lpSrcFunc;

?/* 使用以下FlushInstructionCache調(diào)用來支持多核CPU上的CACAHE的更新,
? * 上面的代碼只更改了內(nèi)存里的地址,沒有更改CPU CACHE里的對應(yīng)內(nèi)容。
? */
?FlushInstructionCache(GetCurrentProcess(), NULL, NULL);

?return (INT)i;
}

?



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1209218


關(guān)于hook設(shè)置函數(shù)如何支持多核CPU的一個說明


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 欧美日韩一二三区 | 污污成人一区二区三区四区 | 全黄裸片武则天一级第4季 亚洲一区国产 | 97av视频在线播放 | 久草网在线观看 | 亚洲精品一 | 久久精品视频99 | 国产精品久久久久久久免费 | 日本黄视频在线观看 | 91香蕉视频在线看 | 性欧美18一19sex性高清播放 | 99国精产品一区二区三区A片 | 精品午夜寂寞黄网站在线 | 亚洲国产精品成人 | 91短视频版官网 | 亚洲综合图片人成综合网 | 首页亚洲国产丝袜长腿综合 | 欧美日韩国产一区二区三区播放 | jizz日| 日本高清视频在线三级 | 电视剧知青1至45集免费观看 | 在线观看欧美三级 | 久久在线 | 成熟自由日本语热亚洲人 | 久草8 | 成人午夜大片免费视频77777 | 日本三日本三级香港三级 | 国产日产精品一区二区三区四区 | 久久综合九色综合网站 | 精品久久久久久国产 | 神马午夜不卡片 | 日本高清乱理伦片中文字幕啊 | 亚洲三级视频在线观看 | 超碰日韩 | 久草老司机 | 香蕉草草久在视频在线播放 | 久久特级毛片 | 亚洲天堂成人网 | 日韩三 | 这里精品| 狠狠干中文字幕 |