如果你写ShellCode 那么必须从内存中寻找Kernel32的地址,然后才能通过PE结构找到LoadLibrary等函数地址
__declspec(naked) void* FindKernel32()
{
__asm
{
push edi;
push esi;
push ecx;
push ebx;
push 00000000h;//向堆栈压入字符串KERNEL32.dll
push 004C004Ch;
push 0044002Eh;
push 00320033h;
push 004C0045h;
push 004E0052h;
push 0045004Bh; //esp-> L"KERNEL32.DLL\0\0";
xor ecx, ecx;
mov esi, fs:[ecx + 30h];//fs:0 是TEB,+30h是PEB ,
mov esi, [esi + 0ch];// PPEB_LDR_DATA Ldr
mov esi, [esi + 1ch];// LIST_ENTRY InInitializationOrderModuleList
next_module:
cmp esi, 0; //判断next 是否存在
je no_next;
mov ecx, esp;
mov eax, [esi + 8h];//eax 是地址
mov edi, [esi + 20h]; //edi 指向内存中的模块地址 现在需要和ecx处比较
mov esi, [esi];//esi 指向下一个
remach:
mov ebx, [ecx];
cmp word ptr[edi], bx;//逐个字符比较(若觉得存在大小写问题 可以做不区分大小写的比较,这里没写)
jne next_module;
add ecx, 2; //下一个字符(Unicode字符用2个字节)
add edi, 2;
mov ebx, [ecx];
cmp bx, 0;
je match_OK;
jmp remach;
no_next:
mov eax, 0;
match_OK:
add esp, 28;
pop ebx;
pop ecx;
pop esi;
pop edi;
ret;
};
}
于是 通过shellcode进行dll注入的关键代码如下,此方法可以避免因为kernel32的加载地址不是默认的导致注入失败
static const unsigned char template_shell_loadlibrary[] =
{
0xE8, 0x0D, 0x02, 0x00, 0x00,
0xE9, 0xBB, 0x02, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x57, 0x56, 0x51, 0x53, 0x6A, 0x00, 0x68, 0x4C, 0x00, 0x4C, 0x00, 0x68, 0x2E, 0x00, 0x44, 0x00, 0x68, 0x33, 0x00, 0x32, 0x00,
0x68, 0x45, 0x00, 0x4C, 0x00, 0x68, 0x52, 0x00, 0x4E, 0x00, 0x68, 0x4B, 0x00, 0x45, 0x00, 0x33, 0xC9, 0x64, 0x8B, 0x71, 0x30,
0x8B, 0x76, 0x0C, 0x8B, 0x76, 0x1C, 0x83, 0xFE, 0x00, 0x74, 0x2A, 0x8B, 0xCC, 0x8B, 0x46, 0x08, 0x8B, 0x7E, 0x20, 0x8B, 0x36,
0x8B, 0x19, 0x53, 0x8B, 0x1F, 0x53, 0xE8, 0x22, 0x00, 0x00, 0x00, 0x83, 0xFB, 0x00, 0x75, 0xE1, 0x83, 0xC1, 0x02, 0x83, 0xC7,
0x02, 0x8B, 0x19, 0x66, 0x83, 0xFB, 0x00, 0x74, 0x07, 0xEB, 0xE0, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xC4, 0x1C, 0x5B, 0x59,
0x5E, 0x5F, 0xC3, 0x66, 0x83, 0x7C, 0x24, 0x04, 0x61, 0x7C, 0x0E, 0x66, 0x83, 0x7C, 0x24, 0x04, 0x7A, 0x7F, 0x06, 0x66, 0x83,
0x6C, 0x24, 0x04, 0x20, 0x66, 0x83, 0x7C, 0x24, 0x08, 0x61, 0x7C, 0x0E, 0x66, 0x83, 0x7C, 0x24, 0x08, 0x7A, 0x7F, 0x06, 0x66,
0x83, 0x6C, 0x24, 0x08, 0x20, 0x8B, 0x5C, 0x24, 0x04, 0x66, 0x3B, 0x5C, 0x24, 0x08, 0x75, 0x08, 0xBB, 0x00, 0x00, 0x00, 0x00,
0xC2, 0x08, 0x00, 0xBB, 0x01, 0x00, 0x00, 0x00, 0xC2, 0x08, 0x00,
0x05, 0x78, 0x56, 0x34, 0x12, //add eax,12345678h
0x68, 0x89, 0x67, 0x45, 0x23, //push 23456789h
0xFF, 0xD0, //call eax
0xC2, 0x04, 0x00,//ret4
};
LPVOID VirtualAlloc_LoadLibraryShellCode(HANDLE hProcess)
{
return ::VirtualAllocEx(hProcess, 0, sizeof(template_shell_loadlibrary), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
}
BOOL WriteProcessMemory_LoadLibraryShellCode(HANDLE hProcess, LPVOID lpAddr, LPCWSTR lpDllPath, DWORD LoadlibraryOffsetOffKernel32, SIZE_T* OUT szWrite)
{
BOOL br = FALSE;
if(lpDllPath && szWrite)
{
unsigned char shellcode[sizeof(template_shell_loadlibrary)] = {};
memcpy(shellcode, template_shell_loadlibrary, sizeof(template_shell_loadlibrary));
StringCchCopyW((WCHAR*)(shellcode + 10), 260, lpDllPath);
DWORD* pOffSet = (DWORD*)(shellcode + sizeof(shellcode) - 14);
DWORD* pPathAddr = (DWORD*)(shellcode + sizeof(shellcode) - 9);
*pPathAddr = (DWORD)(lpAddr)+ 10;
*pOffSet = LoadlibraryOffsetOffKernel32;
br =::WriteProcessMemory(hProcess, lpAddr, shellcode, sizeof(shellcode), szWrite);
}
return br;
}