|

楼主 |
发表于 2020-4-23 00:34:06
|
显示全部楼层
本帖最后由 691086891 于 2020-4-23 00:35 编辑
试了一晚上发现对于64位程序只有x64配置下才能使函数执行成功(提权后不用管理员模式运行),对于32位程序x64和win32均可使函数执行成功(需要提权后使用管理员模式运行,否则openprocess函数都会被拒绝访问),但是即使函数都执行成功了,dll还是没有被注入啊???dllmain也没有被调用。。。。。怎么办啊??
inject源码如下(ShowError就是个自定义MessageBox)
为什么整个函数执行成功还是没法实现dll注入啊,试了一个64位一个32位程序结果都这样。。。。。
BOOL Inject(LPCTSTR szModule, DWORD dwID)
{
DWORD d = 0;
//hProcess: 进程句柄
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_CREATE_THREAD | PROCESS_VM_READ | PROCESS_VM_OPERATION, NULL, dwID);
d = GetLastError();
if (!hProcess)
{
ShowError(_T("hProcess Error!"));
return FALSE;
}
int cByte = (_tcslen(szModule))*sizeof(TCHAR)+1;
//在目标进程分配内存空间
LPVOID pAddr = VirtualAllocEx(hProcess, NULL, cByte, MEM_COMMIT, PAGE_READWRITE);
d = GetLastError();
//向目标进程写入dll路径 权限问题
if (!pAddr && WriteProcessMemory(hProcess, pAddr, szModule, cByte, NULL))
{
d = GetLastError();
ShowError(_T("pAddr Error || WriteProcessMemory Error"));
return FALSE;
}
d = GetLastError();
//获取LoadLibrary函数地址
FARPROC pFuncProcAddr = GetProcAddress(GetModuleHandle(_T("kernel32.dll")), "LoadLibraryW");
d = GetLastError();
if (!pFuncProcAddr)
{
ShowError(_T("pFuncProcAddr Error"));
return FALSE;
}
DWORD dwThreadID = 0;//线程ID
//远程创建线程
HANDLE hRemoteThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pFuncProcAddr, pAddr, 0, &dwThreadID);
d = GetLastError();
if (d == 5)
{
ShowError(_T("拒绝访问!"));
return FALSE;
}
if (!hRemoteThread)
{
ShowError(_T("CreateRemoteThread Error"));
return FALSE;
}
else
{
TCHAR Text[256] = { 0 };
_stprintf_s(Text, 256, _T("%d"), d);
ShowError(Text);
}
WaitForSingleObject(hProcess, INFINITE);
CloseHandle(hRemoteThread);
CloseHandle(hProcess);
return TRUE;
} |
|