C# 注入C++;在windows 10上使用C将DLL插入记事本#

C# 注入C++;在windows 10上使用C将DLL插入记事本#,c#,.net,winapi,dll,windows-10,C#,.net,Winapi,Dll,Windows 10,我在为x86编译的.NET4.6.1中使用C#(显然)。 在上面的代码中,我对似乎不起作用的命令进行了注释。CreateRemoteThread调用。没有返回任何错误,受害者进程(记事本)没有显示任何正在注入以下DLL的迹象(我从示例项目中提取,因为我很懒) bool bInject(uint pToBeInjected, string sDllPath) { IntPtr hndProc = OpenProcess((0x2 | 0x8 | 0x10 | 0x20 |

我在为x86编译的.NET4.6.1中使用C#(显然)。 在上面的代码中,我对似乎不起作用的命令进行了注释。CreateRemoteThread调用。没有返回任何错误,受害者进程(记事本)没有显示任何正在注入以下DLL的迹象(我从示例项目中提取,因为我很懒)

bool bInject(uint pToBeInjected, string sDllPath)
    {
        IntPtr hndProc = OpenProcess((0x2 | 0x8 | 0x10 | 0x20 | 0x400), 1, pToBeInjected);

        if (hndProc == INTPTR_ZERO)
        {
            return false;
        }

        IntPtr lpLLAddress = GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");

        if (lpLLAddress == INTPTR_ZERO)
        {
            return false;
        }

        IntPtr lpAddress = VirtualAllocEx(hndProc, (IntPtr)null, (IntPtr)sDllPath.Length, (0x1000 | 0x2000), 0X40);

        byte[] bytes = Encoding.ASCII.GetBytes(sDllPath);

        WriteProcessMemory(hndProc, lpAddress, bytes, (uint)bytes.Length, 0);

        // This next one is the one that doesn't seem to work.
        CreateRemoteThread(hndProc, (IntPtr)null, INTPTR_ZERO, lpLLAddress, lpAddress, 0, (IntPtr)null);
        CloseHandle(hndProc);

        return true;
    }
#定义WIN32_LEAN_和_MEAN
#包括
外部“C”\u declspec(dllexport)
DWORD WINAPI MessageBoxThread(LPVOID lpParam){
MessageBox(NULL,“Hello world!”,“Hello world!”,NULL);
返回0;
}
外部“C”\u declspec(dllexport)
BOOL APICENT DllMain(模块HMODULE,
德沃德·乌尔打电话的理由,
LPVOID(保留){
开关(ul\u呼叫原因\u){
案例DLL\u进程\u附加:
CreateThread(NULL,NULL,MessageBoxThread,NULL,NULL,NULL);
打破
案例DLL\u线程\u连接:
案例DLL\u线程\u分离:
案例DLL\u进程\u分离:
打破
}
返回TRUE;
}
请记住,我使用的是windows 10。我想可能有额外的安全检查来阻止我注入DLL。在此之后,我计划创建一个引导DLL来加载CLR,以及另一个C#DLL


非常感谢您提供的任何帮助

您应该使用预处理器定义作为API调用的标志,这样更清楚

我相信对于
VirtualAllocEx
您试图将
PAGE\u READWRITE
作为一个标志传递,但是您传递了
0x40
,它被定义为
#define PAGE\u READWRITE 0x04
。因此,要么直接使用
PAGE\u READWRITE
,要么如果你想变得“酷”,就使用
0x04

此外,我从未使用过string类,但您应该使用
sDllPath.Length+1
,因为它可能不会将null终止符添加到您的路径中

更准确地说(在将来的问题中),您可以将错误代码添加到问题中!您可以使用:

#define WIN32_LEAN_AND_MEAN
#include <windows.h>

extern "C" __declspec(dllexport)
DWORD WINAPI MessageBoxThread(LPVOID lpParam) {
  MessageBox(NULL, "Hello world!", "Hello World!", NULL);
  return 0;
}

extern "C" __declspec(dllexport)
BOOL APIENTRY DllMain(HMODULE hModule,
                      DWORD ul_reason_for_call,
                      LPVOID lpReserved) {
  switch (ul_reason_for_call) {
    case DLL_PROCESS_ATTACH:
      CreateThread(NULL, NULL, MessageBoxThread, NULL, NULL, NULL);
      break;
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
      break;
  }
  return TRUE;
}

在您的
CreateRemoteThread
之后,您可以随时了解应用程序中的错误

您不应该导出DllMain,它是DLL的入口点。此外,请将WINAPI添加为问题的标志。如果您有一个off by one错误,字符串必须以零结尾才能成为LoadLibrary可以使用的正确C字符串。您已决定不需要任何错误报告,通过使用不受支持的黑客将指向具有不兼容签名的函数的指针传递给
CreateRemoteThread
调用。除非您学会如何使用调试器,否则您将无法从您决定与之抗争的系统中获得更多帮助。非常感谢!我会和结果联系的!嗯,所以我尝试了你说的方法,错误信息现在显示“操作成功完成”。尽管没有显示任何消息框。我感觉我的DLL缺少一些东西。你在使用Visual studio吗?调试应用程序,并查看
CreateRemoteThread
提交loadlibrary的地址是否有效。只需在
CloseHandle(hndProc)上设置一个断点。然后在关闭手柄之前检查其是否有效。
CHAR Error[MAX_PATH]; // MAX_PATH is used for system paths, it's still big enough
wsprintfA(Error, "Error: %lu", GetLastError());
MessageBoxA(0, Error, 0, 0);