kernel32基地址获得
kernel32基地址的获得也是病毒中必不可少的技术,因为在win32环境中一般初始化PE文件的时候,我们的ntdll.dll, kernel32.dll是随进程以及线程初始化时候加载的。所以即使程
序中我们不引入任何输入表结构,这两个DLL在我们程序进程以及线程初始化时也必须加载。所以我们今天这篇文章的目的就是在我们的进程内存空间中来获得加载kernel32.dll的基地址。因为我们获得
kernel32.dll的基地址后,就可以获得LoadLibray函数来继续加载其他的动态链接库,然后再通过我们的GetProcAdress函数来获得相应需要的api函数地址,这样也就做到了可移植性的要求,所有的函数
均是自己动态获取并填充。
今天我给大家介绍三种获取kernel32.dll基地址的技术,其实还有部分方法也可以获得,只是这3种比较通用,也是病毒中经常用到的。它们分别是
1. 通过线程初始化时, 获得esp堆栈指针中的ExitThread函数的地址,然后通过搜索获得kernel32.dll的基地址。
2. 遍历seh异常链,然后获得EXCEPTION_REGISTRATION结构prev为-1的异常处理过程地址,这个异常处理过程地址是位于kernel32.dll,通过它搜索得到kernel32.dll的基地址。
3. 通过TEB获得PEB结构地址,然后再获得PEB_LDR_DATA结构地址,然后遍历模块列表,查找kernel32.dll模块的基地址。
1.
第一种方法:
我们上面介绍了线程在被初始化的时,其堆栈指针指向ExitThread函数的地址,windows这样做是为了通过ret返回时来调用ExitThread地址。所以一般我们可以在我们主线程的起始位置(也就是
程序入口点处)通过获得堆栈指针中ExitThread函数(当然你要想创建一个线程时候获得也可以o(∩_∩)o...哈哈)。
我们直接通过
mov edx, [esp] ;获得堆栈指针中ExitThread地址到edx寄存器。因为ExitThread地址在kernel32.dll空间中,所以我们可以通过它往上搜索来获得基地址。
分析过kernel32.dll的朋友应该都知道kernel32.dll的块对齐值是00001000h, 并且一般DLL以1M为边界,所以我们可以通过10000h (64k) 作为跨度,这样可以增加搜索速度。我们如何确定这个
地址是基地址,我们都知道我们判断这个地址的前两个字节是否是"MZ",然后定位到PE头结构,然后判断是否是"PE",如果这两个都符合的话则表示我们的地址则是基地址了。。
有了以上的了解我们就可以来写代码了。
mov edx, [esp]
.Next:
dec edx ;
xor dx, dx ; 减去跨度
cmp word [edx], "MZ"
jz .IsPe
jmp .Next
.IsPe:
mov eax, [edx+3ch]
cmp word [eax+edx], 'PE'
jnz .Next
kernel32基地址获得
最新推荐文章于 2023-10-16 10:21:52 发布
本文介绍了在Windows环境下,病毒常用的技术之一——如何在进程中获取kernel32.dll的基地址。通过线程初始化时的堆栈指针、遍历SEH异常链、以及通过TEB和PEB_LDR_DATA结构,详细讲解了三种获取kernel32.dll基地址的方法,以便动态加载库和API函数。
摘要由CSDN通过智能技术生成