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

S.l.e!ep.¢%

像打了激速一樣,以四倍的速度運轉,開心的工作
簡單、開放、平等的公司文化;尊重個性、自由與個人價值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

SSDT Hook的妙用-對抗ring0 inline hook

Posted on 2009-10-28 22:46 S.l.e!ep.¢% 閱讀(465) 評論(0)  編輯 收藏 引用 所屬分類: RootKit
【原創】SSDT Hook的妙用-對抗ring0 inline hook
墮落天才 當前離線

標 題: 【原創】SSDT Hook的妙用-對抗ring0 inline hook
作 者: 墮落天才
時 間: 2007-03-10,15:18
鏈 接: http://bbs.pediy.com/showthread.php?t=40832

*******************************************************
*標題:【原創】SSDT?Hook的妙用-對抗ring0?inline?hook??*
*作者:墮落天才????????????????????????????????????????*
*日期:2007年3月10號???????????????????????????????????*
*聲明:本文章的目的僅為技術交流討論????????????????????*
*******************************************************

1,SSDT
?????SSDT即系統服務描述符表,它的結構如下(參考《Undocument?Windows?2000?Secretes》第二章):
?????typedef?struct?_SYSTEM_SERVICE_TABLE
?????{
???????PVOID???ServiceTableBase;????????//這個指向系統服務函數地址表
???????PULONG??ServiceCounterTableBase;
???????ULONG???NumberOfService;?????????//服務函數的個數,NumberOfService*4?就是整個地址表的大小
???????ULONG???ParamTableBase;
?????}SYSTEM_SERVICE_TABLE,*PSYSTEM_SERVICE_TABLE;???
?????
?????typedef?struct?_SERVICE_DESCRIPTOR_TABLE
?????{
???????SYSTEM_SERVICE_TABLE???ntoskrnel;??//ntoskrnl.exe的服務函數
???????SYSTEM_SERVICE_TABLE???win32k;?????//win32k.sys的服務函數,(gdi.dll/user.dll的內核支持)
???????SYSTEM_SERVICE_TABLE???NotUsed1;
???????SYSTEM_SERVICE_TABLE???NotUsed2;
?????}SYSTEM_DESCRIPTOR_TABLE,*PSYSTEM_DESCRIPTOR_TABLE;
?????
?????內核中有兩個系統服務描述符表,一個是KeServiceDescriptorTable(由ntoskrnl.exe導出),一個是KeServieDescriptorTableShadow(沒有導出)。兩者的區別是,KeServiceDescriptorTable僅有ntoskrnel一項,KeServieDescriptorTableShadow包含了ntoskrnel以及win32k。一般的Native?API的服務地址由KeServiceDescriptorTable分派,gdi.dll/user.dll的內核API調用服務地址由KeServieDescriptorTableShadow分派。還有要清楚一點的是win32k.sys只有在GUI線程中才加載,一般情況下是不加載的,所以要Hook?KeServieDescriptorTableShadow的話,一般是用一個GUI程序通過IoControlCode來觸發(想當初不明白這點,藍屏死機了N次都想不明白是怎么回事)。
?
?2,SSDT?HOOK?
????SSDT?HOOK?的原理其實非常簡單,我們先實際看看KeServiceDescriptorTable是什么樣的。????
????lkd>?dd?KeServiceDescriptorTable
????8055ab80??804e3d20?00000000?0000011c?804d9f48
????8055ab90??00000000?00000000?00000000?00000000
????8055aba0??00000000?00000000?00000000?00000000
????8055abb0??00000000?00000000?00000000?00000000???
????在windbg.exe中我們就看得比較清楚,KeServiceDescriptorTable中就只有第一項有數據,其他都是0。其中804e3d20就是
KeServiceDescriptorTable.ntoskrnel.ServiceTableBase,服務函數個數為0x11c個。我們再看看804e3d20地址里是什么東西:
????lkd>?dd?804e3d20
????804e3d20??80587691?805716ef?8057ab71?80581b5c
????804e3d30??80599ff7?80637b80?80639d05?80639d4e
????804e3d40??8057741c?8064855b?80637347?80599539
????804e3d50??8062f4ec?8057a98c?8059155e?8062661f
????如上,80587691?805716ef?8057ab71?80581b5c?這些就是系統服務函數的地址了。比如當我們在ring3調用OpenProcess時,進入sysenter的ID是0x7A(XP?SP2),然后系統查KeServiceDescriptorTable,大概是這樣KeServiceDescriptorTable.ntoskrnel.ServiceTableBase(804e3d20)?+?0x7A?*?4?=?804E3F08,然后804E3F08?->8057559e?這個就是OpenProcess系統服務函數所在,我們再跟蹤看看:
????lkd>?u?8057559e
????nt!NtOpenProcess:
????8057559e?68c4000000??????push????0C4h
????805755a3?6860b54e80??????push????offset?nt!ObReferenceObjectByPointer+0x127?(804eb560)
????805755a8?e8e5e4f6ff??????call????nt!InterlockedPushEntrySList+0x79?(804e3a92)
????805755ad?33f6????????????xor?????esi,esi
????原來8057559e就是NtOpenProcess函數所在的起始地址。??
????嗯,如果我們把8057559e改為指向我們函數的地址呢?比如?MyNtOpenProcess,那么系統就會直接調用MyNtOpenProcess,而不是原來的NtOpenProcess了。這就是SSDT?HOOK?原理所在。

??3,?ring0?inline?hook
?????ring0?inline?hook?跟ring3的沒什么區別了,如果硬說有的話,那么就是ring3發生什么差錯的話程序會掛掉,ring0發生什么差錯的話系統就掛掉,所以一定要很小心。inline?hook的基本思想就是在目標函數中JMP到自己的監視函數,做一些判斷然后再JMP回去。一般都是修改函數頭,不過再其他地方JMP也是可以的。下面我們來點實際的吧:
?????lkd>?u?nt!NtOpenProcess
?????nt!NtOpenProcess:
?????8057559e?e95d6f4271??????jmp?????f199c500
?????805755a3?e93f953978??????jmp?????f890eae7
?????805755a8?e8e5e4f6ff??????call????nt!InterlockedPushEntrySList+0x79?(804e3a92)
?????...
?????同時打開“冰刃”跟“Rootkit?Unhooker”我們就能在NtOpenProcess函數頭看到這樣的“奇觀”,第一個jmp是“冰刃”的,第二個jmp是“Rootkit?Unhooker”的。他們這樣是防止被惡意程序通過TerminateProcess關閉。當然“冰刃”還Hook了NtTerminateProcess等函數。

×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
????好了,道理就說完了,下面就進入本文正題。
????對付ring0?inline?hook的基本思路是這樣的,自己寫一個替換的內核函數,以NtOpenProcess為例,就是MyNtOpenProcess。然后修改SSDT表,讓系統服務進入自己的函數MyNtOpenProcess。而MyNtOpenProcess要做的事就是,實現NtOpenProcess前10字節指令,然后再JMP到原來的NtOpenProcess的十字節后。這樣NtOpenProcess函數頭寫的JMP都失效了,在ring3直接調用OpenProcess再也毫無影響。
***************************************************************************************************************************
#include<ntddk.h>

typedef?struct?_SERVICE_DESCRIPTOR_TABLE
{
??PVOID???ServiceTableBase;
??PULONG??ServiceCounterTableBase;
??ULONG???NumberOfService;
??ULONG???ParamTableBase;
}SERVICE_DESCRIPTOR_TABLE,*PSERVICE_DESCRIPTOR_TABLE;?//由于KeServiceDescriptorTable只有一項,這里就簡單點了
extern?PSERVICE_DESCRIPTOR_TABLE????KeServiceDescriptorTable;//KeServiceDescriptorTable為導出函數

/////////////////////////////////////
VOID?Hook();
VOID?Unhook();
VOID?OnUnload(IN?PDRIVER_OBJECT?DriverObject);
//////////////////////////////////////
ULONG?JmpAddress;//跳轉到NtOpenProcess里的地址
ULONG?OldServiceAddress;//原來NtOpenProcess的服務地址
//////////////////////////////////////
__declspec(naked)?NTSTATUS?__stdcall?MyNtOpenProcess(PHANDLE?ProcessHandle,
???????????????ACCESS_MASK?DesiredAccess,
???????????????POBJECT_ATTRIBUTES?ObjectAttributes,
???????????????PCLIENT_ID?ClientId)?
{
??DbgPrint("NtOpenProcess()?called");
??__asm{
????push????0C4h
????push????804eb560h??//共十個字節
????jmp?????[JmpAddress]?????
??}
}
///////////////////////////////////////////////////
NTSTATUS?DriverEntry(IN?PDRIVER_OBJECT?DriverObject,PUNICODE_STRING?RegistryPath)
{
??DriverObject->DriverUnload?=?OnUnload;
??DbgPrint("Unhooker?load");
??Hook();
??return?STATUS_SUCCESS;
}
/////////////////////////////////////////////////////
VOID?OnUnload(IN?PDRIVER_OBJECT?DriverObject)
{
??DbgPrint("Unhooker?unload!");
??Unhook();
}
/////////////////////////////////////////////////////
VOID?Hook()
{
??ULONG??Address;
??Address?=?(ULONG)KeServiceDescriptorTable->ServiceTableBase?+?0x7A?*?4;//0x7A為NtOpenProcess服務ID
??DbgPrint("Address:0x%08X",Address);

??OldServiceAddress?=?*(ULONG*)Address;//保存原來NtOpenProcess的地址
??DbgPrint("OldServiceAddress:0x%08X",OldServiceAddress);

??DbgPrint("MyNtOpenProcess:0x%08X",MyNtOpenProcess);

??JmpAddress?=?(ULONG)NtOpenProcess?+?10;?//跳轉到NtOpenProcess函數頭+10的地方,這樣在其前面寫的JMP都失效了
??DbgPrint("JmpAddress:0x%08X",JmpAddress);
????
??__asm{//去掉內存保護
????cli
?????????mov??eax,cr0
????and??eax,not?10000h
????mov??cr0,eax
??}

??*((ULONG*)Address)?=?(ULONG)MyNtOpenProcess;//HOOK?SSDT

??__asm{//恢復內存保護??
??????????mov??eax,cr0
????or???eax,10000h
????mov??cr0,eax
????sti
??}
}
//////////////////////////////////////////////////////
VOID?Unhook()
{
??ULONG??Address;
??Address?=?(ULONG)KeServiceDescriptorTable->ServiceTableBase?+?0x7A?*?4;//查找SSDT

??__asm{
????cli
??????????mov??eax,cr0
????and??eax,not?10000h
????mov??cr0,eax
??}

??*((ULONG*)Address)?=?(ULONG)OldServiceAddress;//還原SSDT

??__asm{??
?????????mov??eax,cr0
????or???eax,10000h
????mov??cr0,eax
????sti
??}

??DbgPrint("Unhook");
}
××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
????就這么多了,或許有人說,沒必要那么復雜,直接恢復NtOpenProcess不就行了嗎?對于象“冰刃”“Rookit?Unhooker”這些“善良”之輩的話是沒問題的,但是象NP這些“窮兇極惡”之流的話,它會不斷檢測NtOpenProcess是不是已經被寫回去,是的話,嘿嘿,機器馬上重啟。這也是這種方法的一點點妙用。
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            日韩亚洲精品在线| 一本色道久久综合亚洲91| 国产一区二区在线观看免费播放| 免费一区视频| 免费成人毛片| 欧美日韩亚洲国产精品| 美国成人毛片| 欧美视频在线观看| 国产精品久久久久久久浪潮网站| 国产欧美日韩视频在线观看 | 亚洲国产精品99久久久久久久久| 黄色精品一区| 一区二区免费在线观看| 亚洲一区二区三区四区五区黄| 亚洲欧美综合| 美女视频黄免费的久久| 亚洲国产专区| 亚洲激情在线观看| 欧美一级艳片视频免费观看| 久久一区欧美| 国内外成人免费视频| 国产精品日韩在线观看| 亚洲国产激情| 嫩模写真一区二区三区三州| 中文欧美在线视频| 欧美激情精品久久久久久大尺度| 国产精品国产三级国产aⅴ入口| 亚洲国产一区在线| 母乳一区在线观看| 久久精品女人天堂| 国产一区二区日韩精品| 久久久av网站| 久久福利毛片| 在线精品亚洲| 免费av成人在线| 欧美+日本+国产+在线a∨观看| 国产中文一区| 亚洲国产精品黑人久久久 | 久久大综合网| 欧美一级片在线播放| 狠狠色2019综合网| 亚洲高清视频一区| 欧美黄污视频| 亚洲视频在线观看| 亚洲私拍自拍| 国产一区二区三区网站| 欧美激情国产日韩精品一区18| 免费亚洲电影在线| 亚洲一区三区视频在线观看| 欧美与欧洲交xxxx免费观看| 亚洲大片免费看| 99国产一区| 在线成人小视频| 亚洲一区二区av电影| 久久精品国产久精国产思思| 亚洲高清在线精品| 国产乱码精品一区二区三| 久久不射中文字幕| 欧美久久久久久久久| 久久男女视频| 国产亚洲va综合人人澡精品| 亚洲黄色av一区| 亚洲黄一区二区| 午夜精品久久久久| 一级成人国产| 欧美精品久久一区二区| 免费成人激情视频| 黑人巨大精品欧美一区二区| 亚洲一区欧美一区| 亚洲欧美一区二区三区极速播放 | 国产乱码精品一区二区三| 亚洲高清资源| 亚洲精品国精品久久99热一| 久久综合国产精品| 免费在线成人| 亚洲国产日韩美| 欧美va天堂va视频va在线| 久久久亚洲高清| 国产一区二区激情| 嫩草影视亚洲| 一本大道av伊人久久综合| 日韩视频一区二区三区在线播放免费观看 | 免费一级欧美片在线播放| 狠狠色丁香婷婷综合影院| 欧美在线视屏| 亚洲欧洲在线免费| 香蕉乱码成人久久天堂爱免费 | 亚洲国产精品va在线看黑人| 牛牛影视久久网| 亚洲深夜福利在线| 欧美国产日韩在线观看| 亚洲午夜极品| 亚洲第一网站免费视频| 欧美午夜一区二区福利视频| 久久综合中文字幕| 亚洲午夜未删减在线观看| 另类天堂av| 欧美在线观看一区| 亚洲免费在线电影| 洋洋av久久久久久久一区| 国产一区二区久久精品| 国产精品美女主播| 国产精品毛片a∨一区二区三区| 欧美成人乱码一区二区三区| 久久久久久久综合狠狠综合| 欧美在线视频日韩| 亚洲欧美日韩综合| 99成人免费视频| 91久久精品一区二区别| 欧美激情在线播放| 欧美激情视频一区二区三区在线播放 | 西西裸体人体做爰大胆久久久| 欧美a级一区| 欧美国产欧美亚洲国产日韩mv天天看完整 | 欧美有码视频| 亚洲在线不卡| 先锋亚洲精品| 午夜久久黄色| 久久精品中文字幕一区| 久久综合九九| 免费看精品久久片| 欧美日韩国产小视频在线观看| 欧美理论大片| 国产精品免费看片| 国产精品亚洲综合一区在线观看| 国产欧美日韩中文字幕在线| 国产一区二区三区四区三区四| 亚洲三级视频| 欧美一区二区视频在线观看2020| 老司机aⅴ在线精品导航| 亚洲国产乱码最新视频| 亚洲午夜小视频| 你懂的国产精品| 国产欧美视频一区二区三区| 亚洲激情欧美激情| 久久国产日韩欧美| 亚洲承认在线| 久久久精品动漫| 欧美视频专区一二在线观看| 1000部国产精品成人观看| 日韩一级黄色大片| 欧美mv日韩mv国产网站app| 亚洲香蕉网站| 欧美日韩在线观看一区二区三区| 国产亚洲在线| 久久九九久精品国产免费直播| 亚洲激情视频网站| 欧美日韩不卡一区| 在线观看欧美| 老司机久久99久久精品播放免费| 午夜国产精品视频| 午夜伦欧美伦电影理论片| 欧美激情在线狂野欧美精品| 精品福利av| 亚洲激情偷拍| 欧美国产精品劲爆| 亚洲精选一区二区| 亚洲精品国产精品国自产在线 | 欧美激情一区二区在线| 久久久夜夜夜| 亚洲伦理自拍| 亚洲视频电影在线| 国产伦一区二区三区色一情| 久久午夜国产精品| 91久久中文| 午夜精品视频网站| 一区在线免费| 在线视频精品一| 曰韩精品一区二区| 亚洲一二三区精品| 激情成人综合网| 亚洲成人在线网站| 国产精品女主播在线观看 | 性久久久久久久久久久久| 香蕉久久夜色精品国产| 亚洲第一视频网站| 亚洲欧美精品在线| 亚洲一区二区在线免费观看| 久热这里只精品99re8久| 欧美一区二区三区免费视| 你懂的视频一区二区| 蜜桃av一区二区| 国产嫩草一区二区三区在线观看| 亚洲国产日日夜夜| 亚洲大片在线观看| 久久久亚洲精品一区二区三区| 中国成人亚色综合网站| 欧美久久久久久久| 亚洲第一精品久久忘忧草社区| 国产视频在线观看一区| 中文在线一区| 亚洲视频在线观看视频| 欧美成人精品一区| 一区二区三区四区五区在线| 亚洲精品资源| 国产亚洲在线| 一区二区不卡在线视频 午夜欧美不卡'| 欧美金8天国| 欧美国产综合| 伊人久久亚洲影院|