首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

重構 Detours 3.0 Traceapi.dll:單一 EXE 實現 API 監控注入

     編輯:關於C語言

Detours 3.0 附帶的 Traceapi.dll 範例可 Attach 至任意 Win32 程序監控 API 呼叫。但原版需 Makefile 編譯、先啟動 syelogd 監聽、再用 withdll 注入,流程繁瑣、檔案多、難以整合。本文記錄將其重構為單一 EXE + DLL、支援命令列直接指定目標程式的過程。

重構思路

  • 保留 traceapi.dll(編譯產出)作為注入載體。
  • 重寫 syelogd 主程式:整合命令列解析、Named Pipe 伺服器、DetourCreateProcessWithDll 注入啟動。
  • 新增參數 <target_exe> 直接指定欲掛載程式,啟動即注入、監控、記錄。

核心程式碼結構(MyTraceapi.cpp)

// 主要修改點在 main():
// 1. 解析命令列:/d (delta time) /o (exit after one) /q (quiet) /? (help)
//    新增:若參數以 .exe 結尾 → 視為目標程式路徑;.txt → 輸出日誌檔。
// 2. 初始化 IOCP + Worker Threads + Named Pipe (SYELOG_PIPE_NAME)。
// 3. 呼叫 DetourCreateProcessWithDll 啟動目標程式並注入 traceapi.dll。
// 4. 進入訊息循環,將管道接收的 API 呼叫記錄到螢幕/檔案。

DWORD main(int argc, char **argv) {
    // ... 參數解析、初始化 IOCP、建立管道連線 ...
    printf("SYELOGD: Target process:%s\n", lpAppName);
    fResult = DetourCreateProcessWithDll((LPSTR)lpAppName, NULL, NULL, NULL,
                                         FALSE, CREATE_DEFAULT_ERROR_MODE,
                                         NULL, NULL, &si, &pi,
                                         lpDllName, NULL); // lpDllName = "traceapi.dll"
    if (!fResult) { /* 錯誤處理 */ }
    while (argc) { Sleep(10000); } // 保持主執行緒存活
    // ... 清理資源 ...
}

編譯與使用

  1. 先用原版 nmake 編譯出 traceapi.dll(放同目錄)。
  2. 將上述 MyTraceapi.cpp 加入新專案編譯為 MyTraceapi.exe(需連結 detours.lib、ws2_32.lib 等)。
  3. 執行:MyTraceapi.exe [options] [log.txt] target.exe
原版 nmake 編譯 traceapi.dll
原版 nmake 編譯 traceapi.dll
重構後單一 EXE 指定目標程式
重構後:單一 EXE 直接指定掛載目標
注入 calc.exe 示例
注入計算機演示
運行中介面
運行介面
生成 log.txt 記錄 API 呼叫
關閉計算機後自動生成 log.txt,記錄完整 API 呼叫軌跡

效果總結

  • 從「多檔案、多步驟、Makefile」簡化為「MyTraceapi.exe log.txt calc.exe」單指令。
  • 保留原版完整 API 監控能力(參數、返回值、呼叫堆疊)。
  • 便於整合至自動化測試、CI/CD 或惡意代碼分析沙箱。

本文出自「About:Blank H4cking」部落格,轉載請保留出處:原文連結

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved