Winapi 注入的DLL未写入文件

Winapi 注入的DLL未写入文件,winapi,dll,hook,Winapi,Dll,Hook,我正在使用WinAPI编写C代码,安装一个全局钩子(WH_GETMESSAGE),将DLL注入系统中所有兼容的进程。注入的DLL监视传递到消息队列的特定消息,并创建文本文件。DLL中的回调函数应使用特定目录中随机生成的名称创建文本文件。这些方法在main上测试时有效,但在DLL中测试时失败(即未创建文本文件)。注意:以下各项工作正常 DLL已成功注入所有(32位)进程,并使用 ProcessExplorer 正在调用回调函数,请使用 MessageBeep(-1) 代码中是否缺少某些内容?还

我正在使用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);
    }
LRESULT回调GetMsgProc(int-code,WPARAM-WPARAM,LPARAM-LPARAM){
如果(代码<0){
返回CallNextHookEx(NULL、code、wParam、lParam);
}
如果((代码==HC_动作)和&(wParam==PM_移除)){
//对于任何消息,请创建并写入文本文件
writeToLogFile();
}
返回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
BOOL writeToLogFile(){
字符文件名[10];
char fName[]=“C:\\Users\\MyDir\\”;
char buffer[75];//将连接的字符串放在此处
generateRandomStr(fileName);//生成文件名的方法
snprintf(buffer,sizeof(buffer),“%s%s.txt”,fName,fileName);
手柄=
创建文件(缓冲区,
文件(通用)读|文件(通用)写,,
文件共享读取文件共享写入,
NULL,始终创建_,
文件\u属性\u正常,
无效);
//为简洁起见,文件句柄代码检查被选中
德沃德·拜特斯莱特;
WriteFile(fHandle、buffer、strlen(buffer)和byteswrite,NULL);
闭合手柄(fHandle);
返回TRUE;
}
/*生成文件名字符串(a-z字符)*/
VOID generateRandomStr(字符持有者[]){
尺寸i=0;
srand(time(NULL));//种子的系统时钟秒数
而(i<9){
int x=(97+rand()%97);
如果(x>96&&x<122){
持有者[i]=((字符)x);
//放置((字符)x);
i++;
}
}
holder[i++]='\0';//终止字符串

查看以下内容。它讨论了DLL注入。

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

您应该进行一些调试。找出代码失败的地方。这是我的主要问题,如何从主机进程调试注入的DLL。经验要少得多ced程序员并不认为调试不仅仅是一个交互式调试器。有许多形式的调试。您需要跟踪调试。添加对
OutputDebugString
的调用,并观察输出显示在例如SysInternals DbgView中。借此机会学习一些更高级的调试技术,这些技术将帮助你成为一名更好的程序员。谢谢。我会试试DbgView,看看它是否有用。@Kelli:你说“文件句柄代码检查”是为了简洁而设置的,但是该代码是否真的捕捉到了错误?关于
WriteFile()的错误呢
?此外,注入的主机进程是否具有写入目标文件夹的权限?在您尝试创建文件之前,该文件夹是否存在?
CreateFile()
不创建不存在的文件夹,您需要调用
CreateDirectory()