我現在寫的一個自動注入工具,可將dll自動注入到某行程中,但除錯時在創建獲取遠程地址時失敗?
現在確定dll檔案沒有問題。發現在 hthread = CreateRemoteThread(process, NULL, 0, funstart, paddr, 0, 0);失敗。
請大佬指導。
代碼如下:
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include<TlHelp32.h>
//通過令牌提升權限
BOOL opendebug()
{
//令牌
HANDLE htoken;
//是否提升權限成功
BOOL fok = FALSE;
//打開行程令牌,提升除錯權限,
if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &htoken))
{
//權限
TOKEN_PRIVILEGES tp;
//設定默認權限
tp.PrivilegeCount = 1;
//遍歷權限
if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid))
{
}
//開啟
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
//判斷令牌是否生效
if (!AdjustTokenPrivileges(htoken, FALSE, &tp, sizeof(tp), NULL, NULL))
{
}
else
{
fok = TRUE;
}
CloseHandle(htoken);//關閉令牌
}
return fok;
}
//發現行程
DWORD findprocessid(char *name)
{
//使用快照,開啟準備
HANDLE hsnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(PROCESSENTRY32);
Process32First(hsnap, &pe32);//查找
do
{
if (_strcmpi(pe32.szExeFile, name) == 0)
{
puts("find it");
return pe32.th32ProcessID;//找到
}
} while (Process32Next(hsnap, &pe32));
CloseHandle(hsnap);//關閉
return 0;
}
//dll注入
int dllinject(HANDLE process, const char *dllname, const char *funname)
{
void(*pfun)() = NULL;//函式指標
//創建遠程執行緒
HANDLE hthread = NULL;
//獲取字串長度
int dllnamelength = strlen(dllname) + 1;
//在別人的行程分配記憶體
LPVOID paddr = VirtualAllocEx(process, NULL, dllnamelength, MEM_COMMIT, PAGE_READWRITE);
//判斷記憶體是否分配成功
if (paddr == NULL)
{
printf("行程記憶體分配失敗");
}
else
{
//寫入行程
WriteProcessMemory(process, paddr, (void*)dllname, dllnamelength, 0);
printf("\n行程記憶體分配成功并且拷貝成功");
//開啟內核
HMODULE hmode = GetModuleHandleA("Kernel32.dll");
//獲取內核地址
LPTHREAD_START_ROUTINE funstart = (LPTHREAD_START_ROUTINE)GetProcAddress(hmode, "LoadLibraryA");
//開啟遠程執行緒
hthread = CreateRemoteThread(process, NULL, 0, funstart, paddr, 0, 0);
//只能呼叫開始的那個函式
if (hthread == NULL)
{
puts("\n開啟執行緒失敗");
}
//等待執行緒開啟
WaitForSingleObject(hthread, INFINITE);
printf("\n遠程執行緒結束");
}
return 0;
}
// 行程名 模塊名 模塊的函式名
int insertdll(char *exename, const char *dllname, const char *funname)
{
//開啟權限
opendebug();
//尋找執行緒id
DWORD processid = findprocessid(exename);
if (processid != 0)
{
//打開
HANDLE process = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_WRITE, FALSE, processid);
if (process != NULL)
{
//注入
dllinject(process, dllname, funname);
}
CloseHandle(process);
}
else
{
printf("行程查找失敗");
}
return 0;
}
//主函式
void main()
{
char *dllname = "C:\\Users\\Administrator\\Documents\\visual studio 2015\\Projects\\注入工具實作\\dll.dll";
insertdll("notepad.exe", dllname, "go");
system("pause");
}
uj5u.com熱心網友回復:
以管理員身份運行。uj5u.com熱心網友回復:
趙四老師,管理員身份運行也是在 hthread = CreateRemoteThread(process, NULL, 0, funstart, paddr, 0, 0);失敗。您能在幫我看一下嗎,哪里錯了
uj5u.com熱心網友回復:
https://msdn.microsoft.com/zh-cn/library/windows/desktop/ms682437(v=vs.85).aspx呼叫GetLastError獲得失敗原因,再作分析
uj5u.com熱心網友回復:
paschen老師,您好,我呼叫GetLastError,獲得6,為句柄無效,也就是說在 hthread = CreateRemoteThread(process, NULL, 0, funstart, paddr, 0, 0)處出錯,但我仔細檢查各項引數都沒有問題,但不知道為什么句柄無效uj5u.com熱心網友回復:
關閉UAC、防火墻、殺毒軟體重啟電腦并以管理員用戶登錄
以管理員身份運行
在dll對應的manifest檔案中標記需要管理員權限
……
uj5u.com熱心網友回復:
關閉UAC、防火墻、殺毒軟體重啟電腦并以管理員用戶登錄
以管理員身份運行
我都試過了,但是一樣出錯,不知道為什么
uj5u.com熱心網友回復:
求大佬指導啊uj5u.com熱心網友回復:
呃,32位注入32位行程,64位注入64位行程。
系統自帶的記事本是64位的,你如果想32位去注入64位行程,你這代碼,是不行的。
至于為什么不行,你可以百度,也可以再提問。
uj5u.com熱心網友回復:
WinAPIOverride http://jacquelin.potier.free.fr/winapioverride32/uj5u.com熱心網友回復:
策略組沒有權限uj5u.com熱心網友回復:
這是什么工具,感覺好牛逼,
不會用
uj5u.com熱心網友回復:
看自帶的幫助。轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/72178.html
標籤:進程/線程/DLL
