我正在尝试编写一个CreateRemoteThread用于注入dll的程序.
问题是CreateRemoteThread拒绝工作.GetLastError()返回5,即ERROR_ACCESS_DENIED.我想不清楚为什么!
我正在使用此视频http://www.youtube.com/watch?v=H3O3hmXkt1I.
#include <iostream>
#include <direct.h>
#include <Windows.h>
#include <TlHelp32.h>
using namespace std;
char* GetCurrentDir()
{
char* szRet = (char*)malloc(MAX_PATH);
_getcwd(szRet, MAX_PATH);
return szRet;
}
LPCTSTR SzToLPCTSTR(char* szString)
{
LPTSTR lpszRet;
size_t size = strlen(szString)+1;
lpszRet = (LPTSTR)malloc(MAX_PATH);
mbstowcs_s(NULL, lpszRet, size, szString, _TRUNCATE);
return lpszRet;
}
void WaitForProcessToAppear(LPCTSTR lpcszProc, DWORD dwDelay)
{
HANDLE hSnap;
PROCESSENTRY32 peProc;
BOOL bAppeared = FALSE;
while(!bAppeared)
{
if((hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)) != INVALID_HANDLE_VALUE)
{
peProc.dwSize = sizeof(PROCESSENTRY32);
if(Process32First(hSnap, &peProc))
while(Process32Next(hSnap, …Run Code Online (Sandbox Code Playgroud) 我正在阅读关于DLL注入技术的内容,我记住了这个问题.
让我们假设我们想要将一个DLL注入Windows 7中的目标进程,该进程为kernel32.dll启用了ASLR
因此,任何一段注入的代码都不能使用任何winapi或任何系统调用,因为地址让我们说在注入器代码中的loadLibrary函数将与目标进程中的地址loadLibrary不同,不是吗?
所以这样的召唤CreateRemoteThread不起作用:
CreateRemoteThread(hProcess,
NULL,
0,
(LPTHREAD_START_ROUTINE) ::GetProcAddress(hKernel32,
"LoadLibraryA" ),
pLibRemote,
0,
NULL );
::WaitForSingleObject( hThread, INFINITE );
Run Code Online (Sandbox Code Playgroud)
如果我在这个推理中错了,请纠正我.
标题真的解释了这一切,我有一个进程进入另一个进程。我需要能够在此程序上为某个非 Windows 标准的 DLL 调用 GetModuleHandle,而且我没有主程序的源代码。
我需要使用它来调用带有 GetProcAddress 的导出函数,最后在 CreateRemoteThread 中使用它来远程启动该程序上的任务。
无论如何我可以从另一个程序而不是它正在创建远程线程的本地程序中获取 ModuleHandle 吗?
谢谢。
我写了dll注入程序,工作得很好.它将dll加载到远程进程并调用一些函数.现在我想将参数传递给该函数.CreateRemoteThread有lpParameter,但如何在dll中传递该参数以在函数中使用它?
更新:dll入口点很常见:
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
Run Code Online (Sandbox Code Playgroud)
Dll只包含一个具有以下原型的函数:
void TestFunction(const char* ua);
Run Code Online (Sandbox Code Playgroud)
调用该函数的代码是:
CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)((void*)codecaveExecAddr), (LPVOID)argumentAddress, 0, NULL);
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我尝试在TestFunction中传递"test"字符串.但后来我检查了TestFunction中的ua参数,它包含了一些垃圾.
以下是整个项目文件:
http://pastebin.com/gh4SnhmV
http://pastebin.com/Sq7hpSVx
http://pastebin.com/dvgXpUYz
更新2
TestFunction应该有一些特定的指标,或者我可以使用任何只要它只有一个LPVOID类型的参数?我糊涂了.谁能给我一个如何用一些参数调用注入的dll函数的例子?