由於在上一篇你的鍵盤莫名其妙的被一個 DLL 程式偷走,雖然看過他的原始碼但還是有些不清楚。所以現在得來查查看他是甚麼偷走的。
一樣使用昨天的 MainHook.exe
到 x64dbg
來解析程式 :
進入 EP
後,首先利用搜字串來到主函式
找到一個 DLL
載入失敗會顯示的字串,進去
向上看一下跟 C++ 中寫的差不多,應該就是主函式了。在起始點上建一個 EP
。
看到這邊有大部分的程序。
這邊看起來有點複雜,來解釋一下重要的指令 ( 都用 RVA
) :
10B4 : 把字串放到 rdx
( 64位元的 EDX
)
10C3 : 透過 call
GetProcAddress
拿到 HookStart
函數的位置 ( 在 RAX
)
而 10C9 ~ 10DC 是在做差不多的事。
10DF : 呼叫 HookStart
( 位置在 10D3 傳給 RBX )
10E1 : 與下一行來顯示字串
10FD : 呼叫 HookStop
( 位置在 10DC 傳給 RSI )
那這樣就對主程式的結構清楚了,那來觀察 nodepad.exe 被注射 DLL 時發生了甚麼事。
在 檔案>附加 中選擇 nodepad.exe 的程序來開啟監看。這樣就可以監察運行中的程式。
在偏好設定中把 DLL EP
設為預設中斷點,當掛好的 DLL 使用到時,就可以停在那裏。
按下 F9 讓程式正常運行。
使用 HookMain.exe
開始注入,注意先不要在記事本上輸入按鍵。
那我們先來找找這份 DLL 會載入到哪個位置。
用 ProcessExplorer 查到載入位置
透過 DLL 檔中的 EP
( 890 )找到指令位置計算位置
7FFAF3530000 + ( 890 - 400 + 1000 ) = 00007FFAF3531490
看一下這邊位置就是 DLL 的程式區。
當我們在記事本上按下按鍵時,就可以發現這邊被停止並且被設為 EP
點了( 其實不用計算那麼多 )。
這時切換到 符號
頁面,可以看到在導出表上記錄著我們的那些函數。
往下滑到符號類型,可以看到指向 1020 的 KeyboardProc
,進入後就可以看到當鍵盤按下時觸發的程序了
KeyboardProc :
嘗試在 1020 的位置設下中斷點,按下 F9 運行。可以發現每次在記事本上按下按鍵時都會觸發 KeyboardProc
,又回到 1020 停止。由此可以知道每次按下鍵盤時,你的文字都會被丟掉。
請試試看透過更改程式名稱比對 “notepad.exe” 的流程,來找回鍵盤。( 提示 : jmp )
這是在 DLL 上的兩個 function,有興趣可以看一下。
HookStart :
HookStop: