我正在使用WinAPI编写C代码,它安装了一个全局钩子(WH_GETMESSAGE),它将DLL注入到系统中的所有兼容进程中。注入的DLL监视传递给消息队列的某些消息并创建文本文件。 DLL中的回调函数应使用特定目录中随机生成的名称创建文本文件。这些方法在 main 上测试时有效,但在DLL中失败(即没有创建文本文件)。注意:以下工作正常。
MessageBeep(-1)
代码中是否有我遗漏的内容?有没有办法调试我在例如Firefox中的进程中注入的DLL代码。
这是我在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
答案 0 :(得分:0)
答案 1 :(得分:0)
感谢大家的意见和建议。最后设法使其工作,问题是功能CreateFile
失败(生成文件名中的一些非法字符)。使用OutputDebugString
后,我能够查看输出并调试负责生成文件名的generateRandomStr
函数,并且它有效。