notepad hook

0x00 前言

昨天花了半天寫了個四不像的玩意兒,本來打算以惡意代碼的方式去寫,但今天不怎麼想完 善功能了,所以全局hook和自刪除之類的就沒有了(其實是debug太麻煩。),結果就是這 個程序很沙雕,你必須先打開記事本再運行它纔行。不過獲取記事本信息是沒什麼問題的。


0x01 行爲

完全是想到什麼寫什麼,所以有些功能完全沒發揮作用呢。。 PS:這裏所有生成的文件都存放在你的C:/User/username/Documents/文件夾下。

  1. 要注入的DLL文件以資源的形式嵌在啓動器中,首先將其釋放到文件夾下,名爲 notepadhook.dll
  2. 複製啓動器自身到文件夾下
  3. 將複製的啓動器路徑添加到註冊表的自啓動項中
  4. 枚舉進程快照,找到notepad.exe,將DLL文件注入
  5. DLL文件使用Inline hook對ReadFile和WriteFile進行hook,將讀取和保存的信息寫入到 readlog.txt和writelog.txt

0x02 啓動器

啓動器本質上就是個DLL注入器,不過DLL文件以資源的形式嵌入到自身當中,所以要先釋 放DLL文件到磁盤中。自我複製完全是爲了開機自啓動才寫的,但沒有誰一開機就會啓動記 事本,所以運行起來是沒用的,本來想hook CreateProcess將所有子進程都進行注入,以 此達到一旦啓動記事本就會被hook的效果,但完全不想debug了。。。
0x03 notepadhook.dll hook的功能由這個DLL來實現,雖然說可以對native層的API進行hook,但我去看了眼文檔,參數太過複雜,就hook記事本來說,hook ReadFile和WriteFile兩個ring3層 API完全足夠了。hook方式使用的是Inline hook中的mov eax, address; jmp rax這種方 式,這在64位中很常見。hook之後就是將數據緩衝區寫入到readlog.txt和writelog.txt中了。


0x04 註冊表操作

在這個程序中,對註冊表進行了兩個操作。 一是設置將自我複製的啓動器添加到自啓動的子鍵中,即 HKEY_CURRENT_USE\Software\Microsoft\Windows\CurrentVersion\Run,創建一個 新的鍵值,並將其值設置爲路徑即可
二是用於獲取C:/User/username/Documents/這個路徑,因爲username是未知的,每個 計算機的用戶名不同,可以通過獲取 Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders這個鍵中的 Personal的值來獲取這個路徑,這應該是個缺省值,可以修改的。


0x05 枚舉進程

這裏我們只針對notepad進行hook,而DLL注入需要知道進程的pid,Windows貌似沒有 提供直接通過進程名來獲取pid的API,所以若想完成這個操作,通常可以通過枚舉系統進 程快照的方式來獲取進行信息,其實就是遍歷一個類似鏈表的東西,熟悉下API就行了

DWORD GetPrcessIdByProcessName(const char* pszProcessName)
{
	DWORD dwProcessId = 0;
	PROCESSENTRY32 pe32 = { 0 };
	HANDLE hSnapshot = NULL;
	BOOL bRet = FALSE;
	::RtlZeroMemory(&pe32, sizeof(pe32));
	pe32.dwSize = sizeof(pe32);

	hSnapshot = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

	bRet = ::Process32First(hSnapshot, &pe32);
	while (bRet)
	{
		if (!::lstrcmpi(pe32.szExeFile, pszProcessName))
		{
			dwProcessId = pe32.th32ProcessID;
			break;
		}
		bRet = ::Process32Next(hSnapshot, &pe32);
	}
	return dwProcessId;
}


0x06 DLL注入

DLL注入是一種從外部操縱目標進程空間的方式,可以爲程序添加額外功能,這種功能可以 是補丁性質的,也可以是惡意的。DLL注入其實可以研究得比較深,不過爲了好寫,這個程 序只用了最最常見的DLL注入方式——遠線程注入。遠線程注入的核心是 CreateRemoteThread函數,通過這個函數在某個進程中開啓一個線程。具體步驟如下:
1.打開目標進程並獲取其句柄 2.在目標進程中分配一塊緩衝區 3.將DLL文件路徑寫入該緩衝區 4.獲取LoadLibraryA/LoadLibraryW函數的地址 5.利用CreateRemoteThread開啓一個線程,這個線程調用LoadLibrary函數,以DLL文件 路徑爲參數


0x07 API Hook

API Hook根據實現方式可以分爲3類,Address Hook,Inline Hook和利用異常處理 Hook。 Address Hook的本質就是劫持函數表,有pwn基礎的同學可以類比GOT覆蓋,這樣的表有 很多,如IAT,虛函數表,甚至一些系統中斷表之類的。 Iline Hook就是一種簡單的跳轉操作,它直接修改函數開頭的指令,令要hook的API開頭跳 轉到我們自定義的函數中,常用的有mov rax, address; jmp rax    push address; retn這 樣的一些指令,不過Inline Hook操作的直接是代碼段,所以有時會出現一些奇怪的問題。 利用異常處理進行hook感覺要相對複雜些,作爲代表的就是模擬一個調試器的行爲來進行 hook,在要hook的API開頭寫入0xcc,運行到此處時就會觸發一個BreakPoint異常,然後 交給我們的調試器來處理,不過寫起來挺麻煩。 Hook技術在PC端和移動端都很受歡迎,也出現了許多hook框架,利用這些框架可以更好 的完成某種功能,而非總是調用底層的API,這是很麻煩的。


0x08 測試

首先打開一個記事本,然後啓動程序


打開一個文本文件

修改一下然後保存

去到我的文檔文件夾下

可以看到生成了4個文件,第一個是釋放的DLL文件,第二個是自我複製的文件,後兩個就是獲取的信息了,打開看看

可以看到除了有我們打開的那個文件,還有其他一些亂七八糟的,這可能是ReadFile這個函數調用時都被鉤取了。

這裏面就很乾淨了,保存的是修改後的文本。

注意測試完成後要刪除註冊表啓動項哦

0x09 總結

複習了下Windows API吧。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章