青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 94, comments - 250, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

---INLINE HOOK實現(xiàn)NDIS HOOK
前面講述了如何通過獲取NDIS_PROTOCOL_BLOCK來實現(xiàn)NDIS HOOK,這里講述第二種方法,那就是inline hook方法。說起inline hook,也不是什么新鮮玩意,無非是在一個函數(shù)的首部嵌入一個jmp機器指令,在該函數(shù)執(zhí)行有效代碼前就跳到我們的代理函數(shù),在我們的代理函數(shù)里做了必要的處理以后,再跳回原來的函數(shù),接著執(zhí)行原函數(shù)的指令。
既然tcpip.sys是標準的NDIS協(xié)議驅(qū)動,那么收包函數(shù)顯然應(yīng)該是在tcpip.sys內(nèi)部實現(xiàn)的,我們直接找到這兩個收包函數(shù),然后對其inline hook不就可以了嗎?經(jīng)過逆向分析,我找到了這兩個函數(shù),本人安裝了兩個XP系統(tǒng),其中一個導(dǎo)出了這兩個函數(shù),另一個系統(tǒng)卻沒導(dǎo)出,所以我們?nèi)匀恍枰锰卣鞔a搜索這兩個函數(shù),這兩個函數(shù)聲明如下:
NDIS_STATUS
ARPRcv (NDIS_HANDLE BindContext,
NDIS_HANDLE MacContext,
UCHAR* HeadBuffer,
ULONG HeadSize,
UCHAR* Buffer,
ULONG BufferSize,
ULONG PacketSize);
INT
ARPRcvPacket (NDIS_HANDLE BindContext,
PNDIS_PACKET Packet);
搜索這兩個函數(shù)地址的代碼如下:
//以下全局變量保存兩個函數(shù)的地址
void* ARPRcv=NULL;
void* ARPRcvPacket=NULL;
void SearchProtocolRoutine()
{
//以下分別為兩個收包函數(shù)的特征碼
UCHAR ARPRcvBytes[] ={0x8b,0xff,0x55,0x8b,0xec,0x56,0x8b,0x75,0x08,0x33};
UCHAR ARPRcvPacketBytes[]={0x8b,0xff,0x55,0x8b,0xec,0x51,0x53,0x56,0x57,0x8b};
//獲取tcpip.sys模塊的基地址,該函數(shù)在前一節(jié)已經(jīng)提供給大家
char* base=FindModule("tcpip.sys");
while(ARPRcv==NULL||ARPRcvPacket==NULL)
{
if(ARPRcv==NULL&&
RtlCompareMemory(ARPRcvBytes,base,10)==10)
{
ARPRcv=base;
}
else if(ARPRcvPacket==NULL&&
RtlCompareMemory(ARPRcvPacketBytes,base,10)==10)
{
ARPRcvPacket=base;
}
base++;
}
}
各種編譯器所編譯的函數(shù),前幾個指令都是幾乎一樣的,用來建立堆棧幀,這些指令叫函數(shù)的序言。
在win2000上是三字節(jié)
push ebp
mov ebp, esp
到了winxp以及后續(xù)系統(tǒng)上,則變成了五字節(jié)
mov edi, edi
push ebp
mov ebp, esp
而一個近跳轉(zhuǎn)指令剛好是五字節(jié),在xp上剛好覆蓋了函數(shù)的序言,所以在XP上掛鉤也相對容易一點,這里著重說明如何對ARPRcv進行掛鉤,我們在ARPRcv內(nèi)部插入一個jmp指令,將跳到ARPRcvProx函數(shù),該函數(shù)是個裸函數(shù),函數(shù)實現(xiàn)如下:
_declspec(naked) ARPRcvProx()//跳板函數(shù)
{
_asm
{
mov edi, edi
push ebp
mov ebp ,esp
//七個參數(shù)開始壓棧
push [ebp+20h]
push [ebp+1ch]
push [ebp+18h]
push [ebp+14h]
push [ebp+10h]
push [ebp+0ch]
push [ebp+8]
call NewARPRcv //調(diào)用NewARPRcv函數(shù)
cmp eax,0x10003 //判斷函數(shù)返回值是否NDIS_STATUS_NOT_ACCEPTED
jz end //如果是NDIS_STATUS_NOT_ACCEPTED,直接結(jié)束本函數(shù)
//而不跳回到ARPRcv函數(shù)
mov eax,ARPRcv //如果返回的不是NDIS_STATUS_NOT_ACCEPTED,將會
//執(zhí)行到這條指令,該指令將 ARPRcv函數(shù)的地址裝入eax
add eax,5 //將ARPRcv地址值加上5,存入eax,表示即將跳轉(zhuǎn)的//地址
jmp eax //開始跳回ARPRcv體內(nèi)
end:
pop ebp
retn 1ch
}
}
在該函數(shù)內(nèi)部,又調(diào)用了NewARPRcv函數(shù),原型和ARPRcv保持一致,也必須由我們自己實現(xiàn):
NDIS_STATUS
NewARPRcv(
IN NDIS_HANDLE ProtocolBindingContext,
IN NDIS_HANDLE MacReceiveContext,
IN PVOID HeaderBuffer,
IN UINT HeaderBufferSize,
IN PVOID LookAheadBuffer,
IN UINT LookaheadBufferSize,
IN UINT PacketSize
)
{
/*
在這里加入你的判斷邏輯代碼,是否攔截該數(shù)據(jù)
如果要攔截,則返回 NDIS_STATUS_NOT_ACCEPTED
否則返回NDIS_STATUS_SUCCESS,把數(shù)據(jù)交給ARPRcv處理
*/
return NDIS_STATUS_SUCCESS;
}
同樣的原理,我們在ARPRcvPacket里面插入jmp指令,將跳轉(zhuǎn)到ARPRcvPacketProx裸函數(shù),該函數(shù)實現(xiàn)如下:
_declspec(naked) ARPRcvPacketProx()
{
_asm
{
mov edi, edi
push ebp
mov ebp ,esp
//兩個參數(shù)開始壓棧
push [ebp+0ch]
push [ebp+8]
call NewARPRcvPacket//調(diào)用NewARPRcvPacket
cmp eax,0 //如果返回0則表示拒絕該數(shù)據(jù)包
jz end //直接返回本函數(shù)
mov eax ,ARPRcvPacket
add eax ,5
jmp eax //跳回ARPRcvPacket函數(shù)第六個字節(jié)
end: pop ebp
retn 8
}
}
在該函數(shù)內(nèi)部,將會調(diào)用NewARPRcvPacket,函數(shù)實現(xiàn)如下:
INT
NewARPRcvPacket(NDIS_HANDLE BindContext,
PNDIS_PACKET ndisPacket)
{
/*
在這里加入你的判斷邏輯,是否攔截該數(shù)據(jù),如果要攔截,則返回0,
否則返回非0
*/
DbgPrint("RcvPacket");
return 1;
}
請仔細閱讀以上代碼的注釋,接下來,我們還必須提供一個函數(shù)實現(xiàn)安裝和卸載掛鉤功能
void PatchARPRcv(BOOLEAN isPatch)//isPatch為TRUE表示安裝掛鉤,為FALSE表示卸載掛鉤。
{
/*即將用以下五個字節(jié)覆蓋ARPRcv函數(shù)前五個字節(jié)
這5個字節(jié)就是jmp XXXX指令的機器碼,因為跳轉(zhuǎn)的相對地址還需要
進一步計算,所以暫時用零填充
*/
UCHAR patchBytes[5]={0xe9,0x00,0x00,0x00,0x00};
//即將用以下五個字節(jié)覆蓋ARPRcvPacket函數(shù)前五個字節(jié)
UCHAR patchBytes2[5]={0xe9,0x00,0x00,0x00,0x00};
//保存原始函數(shù)的前五個字節(jié),方便以后恢復(fù)掛鉤
UCHAR restoreBytes[5]={0x8b,0xff,0x55,0x8b,0xec};
/*
以下兩行代碼計算跳轉(zhuǎn)的偏移量
*/
int offset=(char*)ARPRcvProx-(char*)ARPRcv-5;
int offset2=(char*)ARPRcvPacketProx-(char*)ARPRcvPacket-5;
//修正patchBytes和patchBytes2中的相對地址
memcpy(patchBytes+1,&offset,4);
memcpy(patchBytes2+1,&offset2,4);
if(isPatch)
{
DisableWriteProtect();//禁止寫保護
memcpy(ARPRcv,patchBytes,5);
memcpy(ARPRcvPacket,patchBytes2,5);
EnableWriteProtect(); //開啟寫保護
}
else
{
DisableWriteProtect();
memcpy(ARPRcv,restoreBytes,5);
memcpy(ARPRcvPacket,restoreBytes,5);
EnableWriteProtect();
}
}
因為ARPRcv和ARPRcvPacket函數(shù)處于只讀頁,所以必須先禁用寫保護才能向其中插入代碼,禁用寫保護和開啟寫保護代碼如下:
void
DisableWriteProtect()
{
_asm{
cli
mov eax, cr0
and eax, 0FFFEFFFFh
mov cr0, eax
}
}
void
EnableWriteProtect()
{
_asm{
mov eax, cr0
or eax, not 0FFFEFFFFh
mov cr0, eax
sti
}
}
注意這些代碼暫時只適用XP系統(tǒng),在win2000和win2003上都需要少許改動。


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美主播一区二区三区美女 久久精品人| 国产精品99久久久久久有的能看| 噜噜噜91成人网| 久久久久久9| 久久在线免费观看视频| 久久天天狠狠| 欧美精品久久久久久久久老牛影院| 久久一区二区三区四区| 美女精品在线| 欧美午夜精品久久久久免费视| 国产精品美女www爽爽爽| 国产精品资源在线观看| 樱桃成人精品视频在线播放| 99热在线精品观看| 午夜欧美精品| 欧美成人一品| 亚洲一区二区视频| 久久三级视频| 欧美在线视频免费| 欧美电影免费观看高清| 国产精品高潮视频| 亚洲大胆av| 亚洲性色视频| 欧美国产高清| 亚洲一区自拍| 欧美精品一区二| 韩国美女久久| 午夜精品理论片| 亚洲国内自拍| 欧美一区二区三区精品电影| 欧美欧美全黄| 尤物在线观看一区| 久久成人综合视频| 一区二区三区你懂的| 另类综合日韩欧美亚洲| 国产日韩欧美三区| 亚洲图片欧美日产| 久久婷婷综合激情| 一本久久综合| 免费日韩成人| 狠狠爱综合网| 性色一区二区| 亚洲天堂免费观看| 欧美区亚洲区| 亚洲国产日韩欧美在线99| 欧美在线高清| 亚洲午夜三级在线| 欧美视频一区二区三区在线观看| 亚洲电影在线免费观看| 久久精品夜夜夜夜久久| 亚洲午夜性刺激影院| 欧美日韩国产首页在线观看| 在线观看日韩av电影| 久久裸体艺术| 久久精品一区二区三区四区| av不卡免费看| 欧美午夜久久久| 亚洲视频在线二区| 一区二区精品国产| 国产精品亚洲欧美| 久久精品国产久精国产爱| 欧美一级久久久久久久大片| 国产精自产拍久久久久久蜜| 欧美与黑人午夜性猛交久久久| 亚洲一区在线观看视频| 国产欧美精品国产国产专区| 欧美在线一级va免费观看| 午夜精品久久99蜜桃的功能介绍| 国产视频一区在线观看| 久久久一二三| 欧美高清在线一区二区| 一本色道精品久久一区二区三区 | 国产精品一区二区在线观看网站| 这里只有精品在线播放| 一区二区av在线| 国产精品男gay被猛男狂揉视频| 午夜伦理片一区| 午夜亚洲福利| 亚洲激情一区二区| 亚洲乱码国产乱码精品精| 欧美午夜理伦三级在线观看| 欧美一区二区视频网站| 久久免费偷拍视频| 中文在线资源观看网站视频免费不卡 | 国产欧美日韩综合一区在线观看 | 在线观看视频一区二区欧美日韩 | 影音先锋日韩有码| 美女免费视频一区| 欧美激情一区二区久久久| 亚洲视频你懂的| 欧美一进一出视频| 亚洲电影专区| 国产精品99久久久久久有的能看| 国产综合色产在线精品| 欧美激情视频在线播放| 欧美日韩中文在线| 一区精品在线播放| 亚洲精品中文字幕有码专区| 国产精品一区二区男女羞羞无遮挡 | 欧美韩国在线| 欧美中文字幕视频| 欧美国产日本韩| 久久久久久精| 久久久久久有精品国产| 亚洲性夜色噜噜噜7777| 欧美专区日韩视频| 亚洲影院在线| 欧美国产精品一区| 免费影视亚洲| 国产主播一区二区| 亚洲综合色丁香婷婷六月图片| 亚洲激情一区二区| 久久久久高清| 久久久久久久久久久久久女国产乱| 欧美日韩精品综合| 亚洲激情在线激情| 伊人精品久久久久7777| 亚洲在线播放电影| 亚洲香蕉视频| 欧美日韩国产欧美日美国产精品| 欧美成人69av| 国内精品久久久久久影视8 | 欧美日韩国产不卡| 欧美成人自拍视频| 韩国精品主播一区二区在线观看| 久久综合激情| 国产亚洲综合在线| 亚洲一区三区电影在线观看| 在线性视频日韩欧美| 麻豆久久婷婷| 欧美国产综合一区二区| 激情亚洲网站| 久久久久久九九九九| 久久精品国语| 国产一区二区视频在线观看| 亚洲小视频在线| 香蕉精品999视频一区二区| 国产精品二区影院| 日韩一区二区精品在线观看| 久久香蕉精品| 国产亚洲精品bt天堂精选| 亚洲香蕉在线观看| 亚洲黄色免费电影| 欧美成人高清视频| 91久久极品少妇xxxxⅹ软件| 亚洲人成网站999久久久综合| 欧美大片在线观看一区| 亚洲狼人综合| 亚洲女人天堂av| 国产欧美一区二区三区沐欲| 久久精品99国产精品酒店日本| 蜜臀a∨国产成人精品| 亚洲精品视频在线播放| 欧美日韩大片| 欧美一区二区久久久| 免费久久99精品国产自| 日韩亚洲欧美一区| 国产伦精品免费视频| 久久精品噜噜噜成人av农村| 欧美成年人网站| 亚洲欧美99| 尤物精品在线| 国产精品99免费看 | 免费黄网站欧美| 99精品国产福利在线观看免费| 欧美视频在线播放| 欧美中日韩免费视频| 欧美不卡视频一区| 亚洲综合日韩| 亚洲国产综合在线| 国产精品自在在线| 欧美**人妖| 新67194成人永久网站| 欧美二区在线播放| 欧美在线一二三四区| 亚洲美女淫视频| 红桃av永久久久| 欧美午夜视频一区二区| 免费短视频成人日韩| 亚洲综合精品自拍| 亚洲精品在线免费观看视频| 久久九九免费| 香蕉av福利精品导航| 亚洲伦理在线观看| 激情视频一区| 国产精品永久免费视频| 欧美日韩成人网| 免费国产自线拍一欧美视频| 午夜宅男久久久| 亚洲影院色无极综合| 亚洲国产中文字幕在线观看| 久久蜜桃精品| 久久久99国产精品免费| 亚洲欧美网站| 亚洲欧美日韩一区二区| 亚洲一区二区三区在线视频| 日韩午夜视频在线观看| 亚洲日本理论电影| 亚洲欧洲在线一区| 亚洲精品久久7777|