【发布时间】:2016-03-24 08:36:16
【问题描述】:
我正在使用 WinAPI 编写 C 代码,它安装了一个全局钩子 (WH_GETMESSAGE),它将一个 DLL 注入系统中的所有兼容进程。注入的 DLL 监视传递到消息队列的某些消息并创建一个文本文件。 DLL 中的回调函数应使用特定目录中随机生成的名称创建一个文本文件。这些方法在 main 上测试时有效,但在 DLL 中失败(即没有创建文本文件)。注意:以下工作正常。
- DLL 已成功注入所有(32 位)进程,使用检查 ProcessExplorer。
- 正在调用回调函数,检查使用
MessageBeep(-1)
我在代码中遗漏了什么吗?有什么方法可以调试我在进程中注入的 DLL 代码,例如在 Firefox 中。
这是我在 DLL 中的代码:
LRESULT CALLBACK GetMsgProc(int code,WPARAM wParam,LPARAM lParam){
if (code < 0) {
return CallNextHookEx(NULL, code, wParam, lParam);
}
if ((code == HC_ACTION) && (wParam == PM_REMOVE)){
//for any message create and write to text file
writeToLogFile();
}
return CallNextHookEx(NULL, code, wParam, lParam);
}
这是创建文本文件的代码:
BOOL writeToLogFile() {
char fileName[10];
char fName[] = "C:\\Users\\MyDir\\";
char buffer[75]; //place concatenated string here
generateRandomStr(fileName); //methos to generate file name
snprintf(buffer, sizeof(buffer), "%s%s.txt", fName, fileName);
HANDLE fHandle =
CreateFile(buffer,
FILE_GENERIC_READ | FILE_GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
//file handle code check ommited for brevity
DWORD bytesWritten;
WriteFile(fHandle, buffer, strlen(buffer), &bytesWritten, NULL);
CloseHandle(fHandle);
return TRUE;
}
/*Generate file name string (a-z characters)*/
VOID generateRandomStr(char holder[]) {
size_t i = 0;
srand(time(NULL)); //system clock seconds for seed
while (i < 9) {
int x = (97 + rand() % 97);
if (x > 96 && x < 122) {
holder[i] = ((char)x);
//puts((char)x);
i++;
}
}
holder[i++] = '\0'; //terminate the string
【问题讨论】:
-
你应该做一些调试。找出代码失败的地方。
-
这是我的主要问题,如何从宿主进程中调试注入的 DLL。
-
许多经验不足的程序员不理解调试比交互式调试器更多。有多种形式的调试。您需要跟踪调试。添加对
OutputDebugString的调用并观察输出出现在例如SysInternals DbgView 中。借此机会学习一些更高级的调试技术,这些技术将帮助您成为更好的程序员。 -
谢谢。我会试试 DbgView 看看是否有帮助。
-
@Kelli:您说“为简洁起见省略了文件句柄代码检查”,但该代码实际上是否发现了任何错误?
WriteFile()上的任何错误怎么办?此外,注入的主机进程是否甚至有权写入目标文件夹?在您尝试创建文件之前,该文件夹是否存在?CreateFile()不会创建不存在的文件夹,您需要为此调用CreateDirectory()。