detours30編譯
A. VC 類相關問題編譯錯誤 請求幫助解決
*(DWORD *)&CDetour::sub_465920 = 0x0465920;
這句什麼意思?給函數指針賦一個固定值?能保證這個地址指向一個合適的函數么?
說實話,代碼在成員函數指針和命名方面比較詭異,導致難以理解。
你正常一點寫代碼就可以了。
比如先定義函數指針類型,再定義該函數指針類型的靜態成員變數,再給這個變數賦值,再通過這個變數調用函數。
CDetour *CDetours
CDetour::* sub_465920
這樣的命名你不覺得不好么?你寫代碼是不是只求編譯通過,從來不管可讀性的呢?你甚至是不是覺得代碼寫得越是費解越是顯得水平高呢?
B. detours 2.1 express版本的使用
不知道你是怎麼鏈接的detours.lib和detoured.lib?
可以你的代碼里這樣鏈接試試:
#pragma comment(lib, "detours.lib")
#pragma comment(lib, "detoured.lib")
還有一種可能就是,detours 2.1不支持Unicode編碼。(當然這也只是我的猜測。)
而你的工程用了Unicode編碼方式,你可以把編碼方式改為多位元組試試。
這樣改:
菜單 項目->**屬性,在屬性對話框中,左側選擇配置屬性-常規,右側字元集中選擇「使用多位元組字元集」
C. MFC鉤子問題 我想點擊一個按鈕 彈出一個對話框 然後用鉤子函數修改消息,點擊之後彈出另一個i對話框
你的這個問題用API HOOK 不太合適。
這種模式是採用子類化比較合適。
可以在父窗口中攔截BN_CLICKED 消息進行處理。
實現方式:
1、創建一個基於CWnd /(ATL CWindow)的類,實現BN_CLICKED事件的攔截處理。
2、實例化你創建的這個類,查找到按鈕的父窗口,然後調用調用類方法SubclassWIndow() 子類化父窗口就可以了。
3、如果是跨進程的遠程子類化,需要你將這個類編譯成一個DLL,然後通過鉤子或CreateRemoteThread() 將這個DLL注入到目標進程,然後執行第一二部就可以了。
以ATL 示例
#include <atlbase.h>
#include <atlwin.h>
class CX : public CWindowImpl<CX>
{
public:
BEGIN_MSG_MAP(CX)
COMMAND_CODE_HANDLER(BN_CLICKED,OnBtnClicked)
END_MSG_MAP()
LRESULT OnBtnClicked(WORD , WORD wID, HWND , BOOL bHandled)
{
bHandled = FALSE; // 可以執行默認的WM_COMMAND 消息
if (wID == 你需要子類化的窗口控制項ID)
{
// 調用你要改變的對話框,這塊自己處理
CXXDlg dlg;
dlg.DoModel();
bHandled = TRUE; // 阻止消息的默認處理
}
return 0;
}
};
掛接示例
static CX* g_pWnd = NULL;
// 查找按鈕的父窗口
// 如果父窗口有效則執行子類化,掛接你的子類化處理。
HWND hBtnParent = FindWIndow(xxxx);
if (!g_pWnd && IsWindow(hBtnParent))
{
g_pWnd = new CX;
g_pWnd = g_pWnd.SubclassWindow(hBtnParent); // 子類化父窗口
}
如果是遠程子類化,需要你進行注入,這個過程你可以從網上搜索相關資料
這個示例是在頁面中敲的,沒有經過測試,大體流程就是這樣,你可以依據的具體情況進行調整
D. 誰幫我寫個 用 detours 攔截 ws2_32.dll 中的 connect 例子,謝謝~~
這是一個用於攔截WinSock API的程序,主要的目的並不是為了截獲數據包,而是為了能從第三方角度方便地觀察二進製程序調用WinSock API的情況,最直接最原始一點的想法,是為了能比較方便地調試自己寫的Windows網路應用程序。
關於攔截API的方法有很多種,網上各種文章到處散布。我用的是全局消息鉤子注入進程空間,修改API調用地址。各種方法各有優缺點,比如修改Import Table表,要對PE文件格式有比較深入的了解,但我不了解;Trojan DLL,要替換整個DLL,而且WinSock有2個版本,分別對應了2個DLL文件,一個是wsock32.dll,另一個是ws2_32.dll,每個DLL的導出函數有100多個,工作量太大;還有用Detours開發包,說實話,文檔不夠豐富,而且1.5版還是免費使用,2.0的就要Money了,等等等等。不是說其它方法不好,而是說,我現在採用的方法剛好比較符合我的需求,但由此帶來一個重要的問題是,不能攔截Console程序,因為沒有窗口消息隊列,就像現在Aweay的MySPY中DebugView功能,是通過攔截OutputDebugString這API來實現的,所以寫的Console程序調用的OutputDebugString是攔截不到的,不像DebugTrack,是通過OutputDebugString的實現原理來捕捉的,可以攔截所有的輸出。
曾經看到LuoCong通過SEH來實現API Hook的例子程序,程序是用Win32asm寫的,看了幾遍發現,似乎用Win32asm才能比較方便地利用SEH的這個「副作用」,因為除了匯編以外,其它高級語言要獲得函數的參數值很是麻煩,但或許只是因為我自己水平太臭吧,不管怎麼說,反正現在我是用不上這技術了。
自從在LLYF Spy中開始用過Hook後,已經有點依賴這技術的感覺了,遇到什麼稍微麻煩點的問題,就會想到用Hook,而且現在也有點習慣用BCB6來編譯DLL,盡管這個DLL是用純SDK寫成的,可以很方便地移植到VC上來編譯,只是因為上次遇到過的奇怪的兼容性問題,使得我把BCB作為編譯用於搭配BCB編譯的EXE程序的DLL的首要選擇。
經過一番鍵盤搏擊,根據自己的需求估計,Hook了24個API:recv、recvfrom、send、sendto、socket、closesocket、accept、listen、bind、connect這些都有2份,wsock32.dll和ws2_32.dll各1份,WSASend、WSASendTo、WSARecv、WSARecvFrom這些只有ws2_32.dll里的那份。不過目前只是能獲得API的基本信息,像API名字,返回值,WSAGetLastError值,PID這些。下一步的計劃,是要能導出API的調用參數列表和傳輸數據內容。參數列表應該不是件很難的事,而傳輸數據的顯示,好像慣例都是用16進制加ASCII碼加偏移顯示的,還要花些時間在這個上面。
另外一個問題,則是同步問題。我是用內存映射來進行進程間通信的,萬一在讀的時候,另一個進程在寫,就不好了,所以還要找一個適當的同步機制。
最後一點,當然是穩定性,也是最重要的一點,不能因為這個進程的存在,使得其它程序也牽連受影響。
本文來自CSDN博客,轉載請標明出處: http://blog.csdn.net/missdeer/archive/2005/03/01/306971.aspx
E. visual studiodetours怎麼編譯
使用Windows10和vs1015,
首先打開 所有應用-visual studio 2015-選擇vs2015開發人員命令提示
進入DetoursExpress30的安裝目錄
F. detours怎麼編譯成dll
怎麼會弄不上去呢?你把Detours的源文件用vc6自帶的nmake編譯後,在將detours.h加在自己的工程中,並且將detours.dll放在工程目錄下,這樣就可以使用了啊!