我想绕过EndScene任意DirectX 9应用程序来创建一个小的叠加层.例如,您可以采用FRAPS的帧计数器覆盖,激活后会在游戏中显示.
我知道以下方法:
创建一个新的d3d9.dll,然后将其复制到游戏路径.由于首先搜索当前文件夹,然后转到system32等,我的修改后的DLL会被加载,执行我的附加代码.
缺点:你必须在开始游戏之前把它放在那里.
缺点:您无法添加游戏特定代码.您不能排除不希望加载DLL的应用程序.
缺点:每个系统的偏移量都不相同.
缺点:当进程已经运行时,无法注入DLL.您必须使用CREATE_SUSPENDED标志启动进程以挂接初始Direct3DCreate9.
EndScene从该设备获取偏移量并将其挂钩,从而导致游戏使用的设备挂钩.缺点:从我读过的一些信息来看,创建第二个设备可能会干扰现有设备,并且可能会出现窗口与全屏模式等错误.
EndScene.缺点:看起来不那么可靠.
如何挂钩EndScene注入的DLL,可以在游戏运行时加载,而不必在其他系统上处理不同的d3d9.dll,并使用可靠的方法?例如,FRAPS如何执行它的DirectX挂钩?DLL不应该适用于所有游戏,只适用于我通过注入它的特定进程CreateRemoteThread.
我最近在浏览互联网时遇到了Dll Injection.
我认为这是一个有趣的主题但是,我不知道它的目的是什么?
我已经读过它可以用于破解/黑客游戏和软件,但它是否也可以做一些积极的事情呢?
如果是的话,它可以用于什么?
什么语言支持这个?
为了记录,我不会尝试破解/破解任何获得知识的游戏,无意做违法行为!
谢谢你的时间,
Emerion
ps:关于这个主题的网站/书籍将不胜感激!
我在一些小型测试应用程序中创建了一个额外的线程,并希望从这个额外的线程中挂起主线程.附加线程是通过CreateRemoteThread外部进程创建的.
由于SuspendThread需要一个HANDLE应该挂起的线程,我想知道如何HANDLE从我的附加线程中运行的代码中获取它.
如果您看一下简单DLL注入的以下工作代码:
//Open the target process with read , write and execute priviledges
Process = OpenProcess(PROCESS_CREATE_THREAD|PROCESS_QUERY_INFORMATION|PROCESS_VM_READ|PROCESS_VM_WRITE|PROCESS_VM_OPERATION, FALSE, ID);
//Get the address of LoadLibraryA
LoadLibrary = (LPVOID)GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
// Allocate space in the process for our DLL
Memory = (LPVOID)VirtualAllocEx(Process, NULL, strlen(dll)+1, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
// Write the string name of our DLL in the memory allocated
WriteProcessMemory(Process, (LPVOID)Memory, dll, strlen(dll)+1, NULL);
// Load our DLL
CreateRemoteThread(Process, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibrary, (LPVOID)Memory, NULL, NULL);
//Let the program regain control of itself
CloseHandle(Process); …Run Code Online (Sandbox Code Playgroud) 是否可以使用C#将DLL文件注入到诸如explorer或svchost的进程中?我知道这在C++中是可行的,但它是否在C#中?如果是这样,DLL的编写方式是否重要,例如它是否会在C++ DLL或Visual Studio C#.NET DLL之间有所不同?如果这是可能的话,有人可以发布我可以用来执行此操作的代码.非常感谢你.
科莫迪亚说:
在Windows 8上使用Modern UI无法进行DLL注入,可以将DLL注入Metro应用程序,但是,您将无法将Winsock流量重定向到localhost.
换句话说,windows metro应用程序工作在沙箱环境中,无法完成DLL注入.
让我们看看Nektra 说的话:
你可以看到Komodia和Nektra说的是一个相互矛盾的信息,我的问题是Windows 8下DLL注入背后的真实情况,我可以照常将我的代码注入Metro应用程序(NT,win9x),就像Nektra所说的那样吗?
我编写了这个函数来将DLL注入到运行进程中:
DLL_Results CDLL_Loader::InjectDll()
{
DWORD ThreadTeminationStatus;
LPVOID VirtualMem;
HANDLE hProcess, hRemoteThread;
HMODULE hModule;
if (!isInit())
return NOT_INIT;
if (isInjected())
return DLL_ALREADY_HOOKED;
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessID);
if (hProcess == NULL)
return PROCESS_ERROR_OPEN;
VirtualMem = VirtualAllocEx (hProcess, NULL, strlen(DllFilePath), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
if (VirtualMem == NULL)
return PROCESS_ERRORR_VALLOC;
if (WriteProcessMemory(hProcess, (LPVOID)VirtualMem, DllFilePath, strlen(DllFilePath), NULL) == 0)
{
VirtualFreeEx(hProcess, NULL, (size_t)strlen(DllFilePath), MEM_RESERVE|MEM_COMMIT);
CloseHandle(hProcess);
return PROCESS_ERROR_WRITE;
}
hModule = GetModuleHandle(L"kernel32.dll");
hRemoteThread = CreateRemoteThread(hProcess, NULL, 0,
(LPTHREAD_START_ROUTINE)GetProcAddress(hModule, "LoadLibraryA"),
(LPVOID)VirtualMem, 0, NULL);
if (hRemoteThread …Run Code Online (Sandbox Code Playgroud) 我正在开发一个捕获所有用户交互的项目.MSDN告诉(这个)
SetWindowsHookEx可用于将DLL注入另一个进程.32位DLL无法注入64位进程,64位DLL无法注入32位进程.如果应用程序需要在其他进程中使用钩子,则需要32位应用程序调用SetWindowsHookEx将32位DLL注入32位进程,并且64位应用程序调用SetWindowsHookEx注入64位DLL进入64位进程.
我的问题是,如果构建了一个应用程序会发生什么Any CPU.我是否需要SetWindowsHookEx从构建的DLL 调用Any CPU.
我写了HookLogger_32.exe加载HookFunctions_32.dll(包括x86)和HookLogger_64.exe加载HookFunctions_64.dll(都是x64)设置WH_CBT和WH_MOUSE全局(不是特定的线程).
HookLogger_32.exe,HookLogger_64.exe,HookFunctions_32.dll和HookFunctions_64.dll是用C++编写的.
当我点击构建的.NET应用程序时Any CPU,这些DLL会被注入(通过SetWindowHookEx).Windows操作系统挂起,我必须强行重启我的机器.
当针对x86或x64构建相同的.NET应用程序时,当我在HookLoggers(32位和64位)启动后单击应用程序时,一切正常.
这种未定义行为的任何原因.
我工作的平台是64位机器.
我希望用户从我的网站下载exe,其中(同步下载时)将一个XML文件注入到该应用程序中.此XML文件包含公钥和签名.
如何在下载之前注入文件并在执行期间稍后引用它?
理想情况下,我不会使用shell来注入文件,而是使用本机.NET API.
我有一些代码
var aa = a();
b(aa);
Run Code Online (Sandbox Code Playgroud)
在调试时,我在b()通话中设置了一个断点.然后转到即时窗口,我希望能够从我的项目中的DLL执行代码,但尚未加载.说我想要一个新的Boo电话Foo().代码Baz位于dll 的命名空间中Spongle.dll.
当我输入
>> new Baz.Boo().Foo(aa)
Run Code Online (Sandbox Code Playgroud)
我收到错误:类型或命名空间名称'Baz'在此范围内无效.
如果我更改我的代码,以便我Boo已经加载它可以正常工作.
new Boo(); // dummy to ensure loading
var aa = a();
b(aa);
Run Code Online (Sandbox Code Playgroud)
是否可以在调试期间从即时窗口加载dll,这样我可以调用我的代码,尽管它已经加载(还)?我可以使用new Boo()我的应用程序主类的静态初始化程序,但是在单元测试期间我遇到了问题,因为它不一定涉及具有该静态初始化程序的类.
dll-injection ×10
c++ ×4
c# ×3
dll ×2
hook ×2
windows ×2
deployment ×1
directx ×1
dllimport ×1
visual-c++ ×1