首页
社区
课程
招聘
[旧帖] [求助]使用TEB中获取kernel地址的疑问? 0.00雪花
发表于: 2011-10-29 17:11 1360

[旧帖] [求助]使用TEB中获取kernel地址的疑问? 0.00雪花

2011-10-29 17:11
1360
push ebp
                       
                xor ecx,ecx
                       
                mov esi,fs:0x30                  ;PEB的地址
                mov esi, [esi + 0x0C] ;Ldr的地址
                mov esi, [esi + 0x1C] ;获取InLoadOrderModuleList.Flink
               
next_module:
               
                ;add esi, 0x08;
                mov ebp, [esi + 0x08]        ;获取kernel32.dll地址
                mov edi, [esi + 0x20]        ;获取kernel32.dll名称地址
                mov esi, [esi];
                cmp [edi + 12*2],cl                ;判断是否为kernel32.dll
                       
                jne next_module
                       
                mov edi,ebp                        ;BaseAddr of Kernel32.dll

                pop ebp
疑问1:mov edi, [esi + 0x20]这句是否是获取dll的名称的所在地址?
疑问2:
    mov ebp, [esi + 0x08]如果是获取dll的地址,那么esi是否是只向ininitializationOrderrMouldeList的呢?
如果上述2点都是正确的那么mov edi, [esi + 0x20]应该是mov edi, [esi + 0x14]才对吧?
   上述我使用工具调试果,esi+0x14就是不对,求解,

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 227
活跃值: (66)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
2
为啥是 + 0x08 和 + 0x20呢?
对照你的图片看也不符啊~(难道是我理解错了?
貌似很多处偏移都错了
    push ebp   
    xor ecx,ecx
      
    mov esi,fs:0x30      ;PEB的地址 
    mov esi, [esi + 0x0C] ;Ldr的地址
    mov esi, [esi + 0x10] ;获取InLoadOrderModuleList.Flink
    
next_module:
    ;add esi, 0x08;
    mov ebp, [esi + 0x18]  ;获取kernel32.dll地址
    mov edi, [esi + 0x30]  ;获取kernel32.dll名称地址
    mov esi, [esi + 4];
    cmp [edi + 12*2],cl    ;判断是否为kernel32.dll(这句我没看明白,edi + 12*2是什么?)
jne next_module

    mov edi,ebp      ;BaseAddr of Kernel32.dll
    pop ebp
2011-10-29 18:04
0
雪    币: 26
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
cmp [edi + 12*2],cl    ;判断是否为kernel32.dll(这句我没看明白,edi + 12*2是什么?)
这个地方我理解是edi是获取了kernel32.dll这个字符串的地址,然后[edi+12*2]测试这个串的末尾是否是空的,也就是长度是否是12字符,这里使用(unicode编码,2个字节表示1个字符)
对了楼上的
   +0x18是地址这个我理解
  但是+0x30是dll地址,这个我就不理解了,+0x24才对吧?fulldllname
2011-10-29 19:07
0
雪    币: 227
活跃值: (66)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
4
[QUOTE=lyletzzzw;1014571]cmp [edi + 12*2],cl    ;判断是否为kernel32.dll(这句我没看明白,edi + 12*2是什么?)
这个地方我理解是edi是获取了kernel32.dll这个字符串的地址,然后[edi+12*2]测试这个串的末尾是否是空的,也就是长度是否是12字符,这里使用(unic...[/QUOTE]

FullDllName(+0x24)是完整路径,BaseDllName(+0x2C)才是模块名
BaseDllName实际上是一个UNICODE_STRING结构
          typedef struct _UNICODE_STRING  // 3 elements, 0x8 bytes (sizeof)
          {
/*0x000*/     UINT16       Length;
/*0x002*/     UINT16       MaximumLength;
/*0x004*/     UINT16*      Buffer;
          }UNICODE_STRING, *PUNICODE_STRING;

所以BaseDllName.Buffer == 0x2C + 0x4 == 0x30
2011-10-29 19:36
0
雪    币: 26
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
哦,baseDllName还有一层结构的,所以才这样的,3Q
2011-10-29 19:46
0
雪    币: 26
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我来说下我的理解吧:
    push ebp   
    xor ecx,ecx
      
    mov esi,fs:0x30      ;PEB的地址
    mov esi, [esi + 0x0C] ;Ldr的地址
    mov esi, [esi + 0x10] ;获取InLoadOrderModuleList.Flink
   
next_module:
    ;add esi, 0x08;
    mov ebp, [esi + 0x08]  ;获取kernel32.dll地址
    mov edi, [esi + 0x20]  ;获取kernel32.dll名称地址
    mov esi, [esi + 4];
    cmp [edi + 12*2],cl    ;判断是否为kernel32.dll(这句我没看明白,edi + 12*2是什么?)
jne next_module

    mov edi,ebp      ;BaseAddr of Kernel32.dll
    pop ebp

mov esi, [esi + 0x10] 这句应该是直接指向了_LDR_MOUDLE这个结构的InLoadOrderModuleList
然后+0x8获取了baseAddress
接着使用mov edi, [esi + 0x20]这句,+0x20就是获取dll字符串的地址了,
12*2就获取了字符串的长度,是否和kernel32.dll的是否一样长

对了,还问一下,像这样定义的结构在,可以在哪里获取到这些结构的定义了???
如果可以的话,是否可以交换下

先吃个饭,等会聊
3Q
2011-10-29 19:52
0
雪    币: 227
活跃值: (66)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
7
[QUOTE=lyletzzzw;1014576]我来说下我的理解吧:
    push ebp   
    xor ecx,ecx
      
    mov esi,fs:0x30      ;PEB的地址
    mov esi, [esi + 0x0C] ;Ldr的地址
    mov esi, [esi + 0x10] ...[/QUOTE]

http://msdn.moonsols.com/msdn
这里有很多常用的
其它一些少见的可以查阅WRK(kernel only)、ReactOS(complete)、NT4Source/WIN2KSource(complete)、符号文件(not complete,windbg)
2011-10-29 20:12
0
游客
登录 | 注册 方可回帖
返回
//