【问题标题】:Injected DLL not writing file注入的DLL不写入文件
【发布时间】: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()

标签: winapi dll hook


【解决方案1】:

【讨论】:

    【解决方案2】:

    感谢大家的 cmets 和提示。最后设法使它工作,问题在于函数CreateFile 失败(生成的文件名中有一些非法字符)。使用OutputDebugString 后,我能够查看输出并调试负责生成文件名的generateRandomStr 函数并且它起作用了。

    【讨论】:

      猜你喜欢
      • 2018-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-17
      • 1970-01-01
      • 1970-01-01
      • 2015-08-05
      相关资源
      最近更新 更多