什么是动态加载?
简单的来说就是自己找到LoadLibary以及GetProcAddress函数来自行加载函数以及dll。通常在shellcode编写中使用。
前置知识了解
在RING3下FS寄存器指向TEB也就是线程结构体,大致结构如下:
在TEB+0x30处就是PEB也就是进程结构体,大致如下:
PEB+0xC的位置就是PEBLDR_DATA结构体,里面包含了dll加载链,结构体如下:
其中的 InInitializationOrderModuleList
这个链表第二个必定是kernel32.dll。
思路:
-
在
InInitializationOrderModuleList
找到kerbel32.dll基址
__asm{
mov eax, fs: [0x30] ; 获取PEB
mov eax, [eax + 0xc]; 获取_PEB_LDR_DATA
mov eax, [eax + 0x1c]; 获取LDR
mov eax, [eax]; 获取kernel32模块
mov eax, [eax + 0x8];kernel32模块
}
-
通过解析Kernel32模块获取名称表、地址表、序号表
mov KernelBase, eax;
mov edx, [eax + 0x3c]
add edx, eax
mov edx, [edx + 0x78]
add edx, eax //导出表
mov ebx, [edx + 0x1c]
add ebx, eax
mov AddressTab, ebx //地址表
mov ebx, [edx + 0x20]
add ebx, eax
mov NameTab, ebx //名称表
mov ebx, [edx + 0x24]
add ebx, eax
mov IdTab, ebx //序号表
xor ebx,ebx
-
获取对比函数名称HASH值:
next_function_loop:
inc edi
mov esi,NameTab
mov esi,[edi * 0x4 + esi]
add esi, KernelBase
cdq
hash_loop: //加密函数名
movsx eax,[esi]
cmp al,ah
jz compare_hash
ror edx,7
add edx,eax
inc esi
jmp hash_loop
-
通过序号返回目标函数地址:
compare_hash :
cmp edx, hash
jnz next_function_loop
xor ecx,ecx
mov esi, IdTab
mov cx,[edi * 2 + esi]
mov edx, AddressTab
mov esi,[edx+edi*4]
mov eax, KernelBase
lea eax,[esi+ eax]
mov FuncAddr,eax
完整函数如下:
DWORD GetFuncAddr(DWORD hash)
{
DWORD IdTab;
DWORD AddressTab;
DWORD NameTab;
DWORD KernelBase;
DWORD FuncAddr = 0;
__asm {
pushad
mov eax, fs: [0x30] ; 获取PEB
mov eax, [eax + 0xc]; 获取_PEB_LDR_DATA
mov eax, [eax + 0x1c]; 获取LDR
mov eax, [eax]; 指向第二个元素
mov eax, [eax + 0x8]; kernel32模块基址
mov KernelBase, eax;
mov edx, [eax + 0x3c]
add edx, eax
mov edx, [edx + 0x78]
add edx, eax //导出表
mov ebx, [edx + 0x1c]
add ebx, eax
mov AddressTab, ebx //地址表
mov ebx, [edx + 0x20]
add ebx, eax
mov NameTab, ebx //名称表
mov ebx, [edx + 0x24]
add ebx, eax
mov IdTab, ebx //序号表
xor ebx, ebx
xor edi, edi
next_function_loop:
inc edi
mov esi,NameTab
mov esi,[edi * 0x4 + esi]
add esi, KernelBase
cdq
hash_loop: //加密函数名
movsx eax,[esi]
cmp al,ah
jz compare_hash
ror edx,7
add edx,eax
inc esi
jmp hash_loop
compare_hash :
cmp edx, hash
jnz next_function_loop
xor ecx,ecx
mov esi, IdTab
mov cx,[edi * 2 + esi]
mov edx, AddressTab
mov esi,[edx+edi*4]
mov eax, KernelBase
lea eax,[esi+ eax]
mov FuncAddr,eax
}
return FuncAddr;
}
弹窗:
MYGetProcAddress my = (MYGetProcAddress)GetFuncAddr(GetHash("GetProcAddress"));
MyLoadLibrary myload = (MyLoadLibrary)GetFuncAddr(GetHash("LoadLibraryExA"));
HANDLE handle = myload("User32.dll", NULL, NULL);
MyMessageBox msg = (MyMessageBox)my(handle, "MessageBoxA");
msg(NULL, "123", "123", MB_OK);
return 0;
为防止恶意利用 部分代码存在BUG,自行修改即可
微信群:
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论