首页
社区
课程
招聘
[Anti Virus专题]1.2 - 2.kernel32基地址获得
发表于: 2009-4-10 15:09 68262

[Anti Virus专题]1.2 - 2.kernel32基地址获得

2009-4-10 15:09
68262

1.2 2.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
  xchg  eax, edx   ; eax = kernel32 基地址

这里贴一个封装过的过程。

 ;++
 ;
 ; int
 ;   GetKrnlBase(
 ;      int KrnlApiAddress
 ;   )
 ;
 ; Routine Description:
 ;
 ;    获得kernel32基地址
 ;
 ; Arguments:
 ;
 ;    (esp)          - return address
 ;
 ;    Data   (esp+4) - KrnlApiAddress, ptr ApiAddress
 ;
 ;
 ; Return Value:
 ;
 ;    eax =  krnl32 base
 ;
 ;--

 GetKrnlBase:
   pop  eax
   pop  edx
   push  eax
   
 .Next:
   cmp  word [edx], 'MZ' 
   jz  .IsPe
  dec  edx
  xor  dx, dx
   jmp  .Next
 
 .IsPe:  
   mov  eax, [edx+3ch]
   cmp  word [eax+edx], 'PE'
   jnz  .Next
   xchg  eax, edx
   ret


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 7
支持
分享
最新回复 (86)
雪    币: 148
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
请问这是什么fasm?

注:我才是第一个顶的.别的都是假的.
2009-4-10 15:13
0
雪    币: 2362
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
支持一下。。
2009-4-10 15:14
0
雪    币: 370
活跃值: (52)
能力值: ( LV13,RANK:350 )
在线值:
发帖
回帖
粉丝
4
这么好的系列文章,我一定要顶啊
2009-4-10 15:15
0
雪    币: 315
活跃值: (23)
能力值: ( LV9,RANK:220 )
在线值:
发帖
回帖
粉丝
5
传统的fasm啊,写这个专题我基本上没有用宏。所以大家可以直接编译的。

这里下载。
http://flatassembler.net/download.php
2009-4-10 15:27
0
雪    币: 2362
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
#include "stdio.h"
void main()
{
        long addr;
       
        __asm
        {
                mov  eax, fs:[30h]
                mov  eax, [eax+0ch]
                mov  eax, [eax+1ch]
                mov  eax, [eax]
                mov  eax, [eax+8h]
                mov  addr,eax
        }
        printf("%lx\n",addr);
}

只用汇编还是不会写啥东西,学习
再支持一下
2009-4-10 15:29
0
雪    币: 315
活跃值: (23)
能力值: ( LV9,RANK:220 )
在线值:
发帖
回帖
粉丝
7
[QUOTE=zapline;604624]#include "stdio.h"
void main()
{
        long addr;
       
        __asm
        {
                mov  eax, fs:[30h]
                mov  eax, [eax+0ch]
                mov  eax, [eax+1ch]
                mov  eax, [eax]
...[/QUOTE]

代码最重要还是要理解。
如果仅写不理解的话就没什么意思了。
希望这个专题能让大家学到的是思路而并非是如何写。
2009-4-10 15:37
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
lz的文章很不错啊,希望能多看到这个系列的作品
2009-4-10 15:38
0
雪    币: 109
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
是不是从29a搞过来的。。。。老东西了
2009-4-10 16:12
0
雪    币: 315
活跃值: (23)
能力值: ( LV9,RANK:220 )
在线值:
发帖
回帖
粉丝
10
哎。
现在的人可悲的是连看都没有看就在那乱评论。
麻烦你去从29a一期杂志到八期杂志找找。
文章我力求从原理开始讲解,从文章也应该可以看到讲解更多的是原理以及思路。而且代码也更加短小精炼。每篇文章我花费不少心心思来想如何更全面更易懂的方式的来讲解,这年头鸟人就是多。
2009-4-10 16:24
0
雪    币: 148
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
好强大.顶!
2009-4-10 16:29
0
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
12
楼主给个系统的总结是很好的,而且写得比较详细。虽然这三种方法是很早就有人总结过了。
另外第一种方法因为依赖于主线程初始化时的堆栈地址,因此一般在PE感染型病毒里使用,基本不用在shellcode里。
2009-4-10 17:30
0
雪    币: 148
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
好多计算机语言都消亡了.
能读懂这些濒危语言的人都是国宝.
2009-4-10 17:34
0
雪    币: 47147
活跃值: (20470)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
14
感谢xfish的系列教学。
愿意将自己所掌握的知识拿出来与大家分享,就值得肯定。
有些知识点论坛也有,但整理梳理一下,对想学的人还是很有帮助的。
不足的地方,可以一起讨论,xfish再改进。
2009-4-10 17:48
0
雪    币: 315
活跃值: (23)
能力值: ( LV9,RANK:220 )
在线值:
发帖
回帖
粉丝
15
不仅仅是主线程,只要shellcode中能取得CreateThread函数地址,那么创建工作线程在工作线程中取得然后写入回来也可以。

而且其实还有很多其他的思路,例如通过异常然后通过异常环境此时的线程环境来取得Kernel32.dll的地址,然后进行搜索等。。
2009-4-10 17:54
0
雪    币: 423
活跃值: (11)
能力值: ( LV9,RANK:230 )
在线值:
发帖
回帖
粉丝
16
认真学习,好好领会。。。

支持楼主的系列。。。
2009-4-10 18:41
0
雪    币: 321
活跃值: (271)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
17
文章写的不错,比较喜欢。但有两处笔误,都是以下这句。

mov eax, [fs:0ch] ;Get _PEB_LDR_DATA
2009-4-10 18:49
0
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
18
能写汇编的都是高手
2009-4-10 19:50
0
雪    币: 315
活跃值: (23)
能力值: ( LV9,RANK:220 )
在线值:
发帖
回帖
粉丝
19
[QUOTE=combojiang;604742]文章写的不错,比较喜欢。但有两处笔误,都是以下这句。

mov eax, [fs:0ch] ;Get _PEB_LDR_DATA[/QUOTE]

感谢指出,的确笔误,已经修正。。
2009-4-10 20:25
0
雪    币: 379
活跃值: (40)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
20
支持楼主,顶!
2009-4-10 22:24
0
雪    币: 112
活跃值: (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
顶顶顶,,,,
2009-4-10 23:31
0
雪    币: 102
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
学习了,明天继续
2009-4-11 00:14
0
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
23
这就变成“先有蛋还是先有鸡”的问题了,你要取得CreateThread函数地址,用啥方法?还是先取kernel32.dll再得到CreateThread地址的。或者说,如果都有了CreateThread函数地址了,那直接用这函数地址去搜索kernel32.dll就行了。
2009-4-11 03:54
0
雪    币: 315
活跃值: (23)
能力值: ( LV9,RANK:220 )
在线值:
发帖
回帖
粉丝
24
刚起来..

  我在开头已经说了,线程在被初始化的时,其堆栈指针指向ExitThread函数的地址,一般我们在主线程初始化时来进行取得。这个方法的原理就是这样,而你在下面又叙述了遍而且说只能依赖主线程初始化时取得,这句话本来就是错的,任何线程都可以,我在文章早也已经说了原理。

  所以我才要反驳你,这的确是先有蛋还是先有鸡,其实这个本就没什么讨论的,我在文章中早已经说过了,而你非要提下只能依赖主线程初始化时来进行取得。这个本身在shellcode中,只要先拿到鸡,然后在去拿蛋也可以,难道不是吗。。获取kernel32基地址方法本就很多,看你如何运用思路了,如我前面所提的思路等。。

下了,周末出去放松去了。。周一见吧。。。
2009-4-11 14:51
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
支持下,希望楼主坚持把教学搞完,千万别夭折了.
2009-4-11 17:36
0
游客
登录 | 注册 方可回帖
返回
//