在 Win64 上實現Ring3 級 HIPS

2021-09-30 10:03:47 字數 4368 閱讀 2818

自從更換了顯示卡,每天必不可少的事情就是玩遊戲。不過某些漢化版的遊戲實在太不像

話,在安裝遊戲的同時,竟然還把我的ie主頁給修改了!由於win64上沒有可用的hips (不

喜歡防毒軟體),而且遊戲安裝程式基本上都是32位遊戲,所以我趕緊拿出以前寫的win32

ring3 hips來防止遊戲安裝時亂改我的ie 主頁。結果呢?在玩《crysis》64位的時候,竟

然又被修改了ie 主頁!經測試發現,《crysis》64位的 exe 檔案被修改過,每次執行都會

先修改 ie主頁,再執行遊戲。由於是64位 exe,原先的 win32 ring3 hips肯定是沒有用

了,只好寫乙個win64 ring3 hips。

首先說說修改ie 主頁是怎麼一回事兒。ie 主頁不是記錄在乙個ini檔案裡的,而是記

錄在登錄檔裡,它的具體位置是:

hkey_local_machine\software\microsoft\internet explorer\main\start page

修改這個鍵值就能改變ie主頁。由於大部分人都是使用 ie,而如果一開啟 ie就自動

連線到某個**,就能給那個**帶來巨大的流量,那個**就能獲取鉅額的廣告利益。所

以這也就是為什麼大多數遊戲軟體都喜歡亂改ie主頁的原因。不過要利用我的電腦給它賺

錢,自然是痴心妄想,於是便有了下文。

知彼知己,百戰不殆。我們寫乙個64 位程式,來實現修改ie主頁:

#include

#include

#define obj_case_insensitive 0x00000040l

typedef struct _unicode_string

unicode_string, *punicode_string;

typedef struct _object_attributes object_attributes, *pobject_attributes;

typedef ntstatus (winapi *zwopenkey)

(__out  phandle keyhandle,

__in   access_mask desiredaccess,

__in   pobject_attributes objectattributes

);typedef ntstatus (winapi *zwsetvaluekey)

(__in      handle keyhandle,

__in      punicode_string valuename,

__in_opt  ulong titleindex,

__in      ulong type,

__in_opt  pvoid data,

__in      ulong datasize

);typedef ntstatus (winapi *zwclose)

(  __in  handle handle

);typedef void (winapi *rtlinitunicodestring)

(__inout   punicode_string destinationstring,

__in_opt  pcwstr sourcestring

);rtlinitunicodestring rtlinitunicodestring;

zwsetvaluekey zwsetvaluekey;

zwopenkey zwopenkey;

zwclose zwclose;

//設定 objectattributes的值

void initializeobjectattributes (out pobject_attributes

initializedattributes, in punicode_string objectname, in ulongattributes, in

handle rootdirectory, in psecurity_descriptor securitydescriptor)

//初始化用到的api

void initapi()

int main()

這裡順便說一句,64位系統裡絕大多數函式都是__fastcall約定,但是我在定義函式

原型的時候還是使用了__stdcall(winapi是__stdcall的馬甲)約定,難道不會出錯嗎?

我帶著這個疑問去問了「毛豆」的工程師,他的回答是,vs2010非常智慧型,在你編譯的時

候自動把__stdcall替換成__fastcall了。如果大家對這個回答感到很鬱悶,請不要怪我。

進入主題,如何反修改ie主頁。我的思路是:hook zwsetvaluekey。首先根據

zwsetvaluekey的第乙個引數keyhandle得到它的keyname。若keyname是

hkey_local_machine\software\microsoft\internet explorer\main,就檢查valuename,

否則放過;如果valuename是 start page,就彈出主動防禦提示框。否則放過。

根據 keyhandle得到 keyname在網上是沒有現成**的。經研究,可以使用zwquerykey

得到。不過zwquerykey得到的還不是可見的字串,還要經過字串的轉化處理。實現代

碼如下:

int widetomultibyte(const wchar* wchar, char* mchar)

char *keyhandletokeyname(handle keyhandle)

接下來到核心偽函式的處理部分。首先拿出我以前寫好的win64 hook模板(已經做好

long fake_zwsetvaluekey

(__in      handle keyhandle,

__in      punicode_string valuename,

__in_opt  ulong titleindex,

__in      ulong type,

__in_opt  pvoid data,

__in      ulong datasize

)return pzwsetvaluekey(keyhandle, valuename, titleindex, type, data,

datasize);

}在裡面有一些自定義函式,如cs、cstr等,都是為了方便字串操作的。雖然c++的

cstring 都有類似的功能,但是我不喜歡cstring,所以自己實現了:

//連線兩個char*字串

char *cs(char *str1, char *str2)

//把整數轉化為字串

char *cstr(long n)

文章幾句話帶過的東西,在研究的時候可不是那麼輕易得到的。特別要注意,在偽函式

中動態呼叫的 messageboxa 必須要用 loadlibrary,否則在 cui 程式中會崩潰。另外在

fake_createpeocessw(實現 ring3 全域性鉤子)中注入 dll 前要檢查啟動的程序型別,如果

是 64 位程序才注入 dll,如果是 32 位程序則不要注入,否則會導致要啟動的 32 位程序無

法啟動,甚至導致自身程式崩潰。實現判斷是否64位程序可以用iswow64process來實現:

bool iswow64(handle hproc)

測試方法:

1.複製全部檔案到c盤根目錄

2.使用 injectdllx64.exe把 hookdll.dll注入到explorer.exe

3.執行 ntsetvaluekey.exe

注意:測試時請關閉uac

測試截圖:

被攔截:

然而問題大家都看出來了,就是無法阻止32 位程序修改 ie主頁!這個想要直接解決基

本上是不可能,因為32位程式不能給64位程式注入dll,64位程式也不能給32位程式注

入 dll。如果真的要實現乙個主動防禦系統,必須有兩個部分:針對64位程序的部分和針

對 32位程序的部分。針對64位程序的部分我已經實現了,針對32位程序的部分我就提出

程建立,如果有程序被建立,就注入hook zwsetvaluekey的 32 位 dll。不過這畢竟不是完

美的方法。我會繼續研究win64上實現 hips,如果成功,會第一時間發表在《黑客防線》

上。如果已經有讀者想到了比這個好的方法,也請不吝賜教。

另外本文也只是個提出乙個「解決方法」,而不是「解決方案」。如果要實現可用的hips,

還有很長的路要走。比如增加記住使用者選擇的專案,增加意外處理防止把程式搞崩潰了。最

重要的是不能直接使用messagebox彈框框,而是要使用訊息機制把資訊傳送到另外乙個程

序裡進行集中的提示處理。要注意的事項太多,不勝列舉。還請有興趣的朋友自行研究。

安裝環境 win64

1.安裝環境 win64 2.安裝 2.2 配置環境變數 將安裝目錄新增至path變數中 3.在解壓目錄中增加配置檔案 my.ini 3.1 在配置檔案中新增如下資訊 mysql 設定mysql客戶端預設字符集 default character set utf8 mysqld 設定3306埠 po...

win64位系統安裝numpy

1.進入windows的控制台,在控制台中輸入pip install wheel,安裝wheel這個包。2.進入根據自己python的版本號和作業系統位數選擇合適的安裝檔案。安裝完成 驗證一下 1.在cmd中執行python,在python shell中輸入from numpy import 引庫。...

win64安裝mongodb詳細過程

win64安裝mongodb詳細過程 第一步 進入mongodb官網 點選右上角的download,進入 介面根據作業系統選擇不同的版本,此處只講解如何在win7 64位作業系統安裝mongodb。mongodb win32 x86 64 2008plus ssl 3.4.4 signed 第二步 ...