获取Kernel32的shellcode

如果你写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;
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值