用symbol來獲得ShadowSSDT的原始地址和函式名
在網上看了下,獲得ShadowSSDT的函式名和原始地址的方法和文章不是很多。比較簡單的應該算是設計張函式名錶和用symbol的方法。
個人覺得用symbol來獲得ShadowSSDT還是比較方便的,而且自己也不用去建立一張表,何樂而不為。^_^
這辦法簡單的原因是我只需要一個win32.sys,win32.pdb,以及呼叫不到10個的API就能完成工作。
好,來看看怎麼呼叫這些函式。
1.呼叫SymInitialize初始化Dbghelp這系列的函式。
2.呼叫ImageLoad讀取檔案win32.sys。
3.呼叫SymLoadModule來讀取pdb檔案。
4.呼叫SymEnumSymbols列舉符號,其中一個引數是回撥函式SymEnumSymbolsProc,that's the key。
SymEnumSymbolsProc中有一個系統會幫忙填充一個為PSYMBOL_INFO結構的引數。在這個結構中我主要用到的是Name和Address。
5.呼叫ImageUnload和SymCleanup做一些清理工作。
OK,看一下我的思路。
首先是獲得W32pServiceTable的地址。熟悉ShadowSSDT都知道,W32pServiceTable是在核心初始化用來填充ShadowSSDT的表。
然後,知道了W32pServiceTable的地址,後面的事情也很容易。用SymEnumSymbolsProc把ShadowSSDT每個函式的地址和函式名儲存下來。
個人覺得用symbol來獲得ShadowSSDT還是比較方便的,而且自己也不用去建立一張表,何樂而不為。^_^
這辦法簡單的原因是我只需要一個win32.sys,win32.pdb,以及呼叫不到10個的API就能完成工作。
好,來看看怎麼呼叫這些函式。
1.呼叫SymInitialize初始化Dbghelp這系列的函式。
2.呼叫ImageLoad讀取檔案win32.sys。
3.呼叫SymLoadModule來讀取pdb檔案。
4.呼叫SymEnumSymbols列舉符號,其中一個引數是回撥函式SymEnumSymbolsProc,that's the key。
SymEnumSymbolsProc中有一個系統會幫忙填充一個為PSYMBOL_INFO結構的引數。在這個結構中我主要用到的是Name和Address。
5.呼叫ImageUnload和SymCleanup做一些清理工作。
OK,看一下我的思路。
首先是獲得W32pServiceTable的地址。熟悉ShadowSSDT都知道,W32pServiceTable是在核心初始化用來填充ShadowSSDT的表。
然後,知道了W32pServiceTable的地址,後面的事情也很容易。用SymEnumSymbolsProc把ShadowSSDT每個函式的地址和函式名儲存下來。
說起來有點複雜,但程式碼很簡單的。
#include <windows.h>
#include <stdio.h>
#include <Dbghelp.h>
#pragma comment(lib, "Dbghelp.lib")
#pragma comment(lib, "Imagehlp.lib")
extern "C" {
PLOADED_IMAGE
IMAGEAPI
ImageLoad(
PCSTR DllName,
PCSTR DllPath
);
BOOL
IMAGEAPI
ImageUnload(
PLOADED_IMAGE LoadedImage
);
}
//
//用於存放得到的ShadowSSDT的函式和函式名
//
typedef struct _SHADOWFUNC
{
CHAR FuncName[100];
DWORD FuncAddr;
}SHADOWFUNC, *PSHADOWFUNC;
DWORD g_W32pServiceTable = 0;
SHADOWFUNC g_ShadowFunc[667] = {0};
//
//回撥函式,用於獲得ShadowSSDT的函式和函式名
//
BOOL CALLBACK SymEnumSymbolsProc(
PSYMBOL_INFO pSymInfo,
ULONG SymbolSize,
PVOID UserContext
)
{
PDWORD pW32pServiceTable = NULL;
INT i = 0;
if (!UserContext)
{
if (strstr(pSymInfo->Name, "W32pServiceTable"))
{
printf("%s, %#x\n", pSymInfo->Name, pSymInfo->Address);
g_W32pServiceTable = (DWORD)pSymInfo->Address;
}
}
else
{
pW32pServiceTable = (PDWORD)UserContext;
for (i = 0; i < 667; i++)
{
if (*(pW32pServiceTable + i) == (DWORD)pSymInfo->Address)
{
g_ShadowFunc[i].FuncAddr = (DWORD)pSymInfo->Address;
lstrcpyn(g_ShadowFunc[i].FuncName, pSymInfo->Name, 100);
}
}
}
return TRUE;
}
void main()
{
INT i = 0;
PDWORD pW32pServiceTable = 0;
HANDLE hHandle = 0;
PLOADED_IMAGE ploadImage = {0};
DWORD dwload = 0;
hHandle = GetCurrentProcess();
SymInitialize(hHandle, NULL, TRUE);
ploadImage = ImageLoad("win32k.sys", NULL);
dwload = SymLoadModule (hHandle, ploadImage->hFile,
"win32k.sys", "win32k.pdb",
0, ploadImage->SizeOfImage);
SymEnumSymbols(hHandle, dwload, NULL, SymEnumSymbolsProc, NULL);
if (g_W32pServiceTable)
{
pW32pServiceTable = (PDWORD)(g_W32pServiceTable - dwload
+ (DWORD)ploadImage->MappedAddress);
SymEnumSymbols(hHandle, dwload, NULL, SymEnumSymbolsProc, pW32pServiceTable);
}
for (i = 0; i < 667; i++)
{
printf("%03d, 0x%08X, %s\n", i, g_ShadowFunc[i].FuncAddr, g_ShadowFunc[i].FuncName);
}
ImageUnload(ploadImage);
SymCleanup(hHandle);
}
效果如下:
相關文章
- 函式名/函式地址/函式指標函式指標
- 獲得url地址?後的引數
- feof (函式名)函式
- 獲得登入使用者的Email地址AI
- JavaScript 變數名和函式名相同JavaScript變數函式
- [轉]用Whois獲得電信運營商的IP地址是如何分配的?
- .net post提交和獲得html頁面的原始碼HTML原始碼
- C獲取程式名稱的方法
- 各位高手,如何獲得遠端主機的 MAC 地址?Mac
- 除錯JS獲得動態視訊地址除錯JS
- java獲取ip地址和mac地址JavaMac
- 通過EPROCESS獲取程式名
- 使用代理IP輕鬆獲得韓國IP地址
- 總結獲得【酷我音樂】歌曲URL地址
- [轉帖]利用WebClient和WebRequest類獲得網頁原始碼Webclient網頁原始碼
- javascript變數名和函式名相同如何處理JavaScript變數函式
- Java/JSP獲得客戶端網路卡MAC地址的三種方法解析(附:獲得真實IP)JavaJS客戶端Mac
- ES6 symbol 以及symbol的簡單應用Symbol
- 如何獲得微信小遊戲原始碼遊戲原始碼
- 完美獲得SAS檢視原始碼原始碼
- (JavaScript)函式名裡有什麼?JavaScript函式
- Java 中獲取MAC地址 和IP地址JavaMac
- 函式: 獲得每月的最後一天函式
- 怎樣無線上網無法獲得IP地址的問題
- C#獲得本機的計算機名及IP地址C#計算機
- C++ 獲取指定的過載函式地址C++函式
- pytest-根據類或函式名選擇用例函式
- 在Intranet中獲得客戶端IP地址客戶端
- perl根據函式名動態呼叫函式
- C語言獲得陣列長度的函式C語言陣列函式
- 無線網路卡無法獲得IP地址的解決方案(轉)
- 如何獲得更小的應用檔案尺寸?來了解下 Android App BundleAndroidAPP
- apt-spy來獲得適合自己的源,適用於UBUNTU/DebianAPTUbuntu
- Python透過函式名呼叫函式的幾種場景Python函式
- 如何利用資料視覺化和分析來獲得實時洞察?視覺化
- 如何用Java獲得過去或未來的日期?Java
- C++函式名後面有個constC++函式
- 用Java獲得當前效能資訊Java