首页
社区
课程
招聘
[求助]我发现pe 在内存中读取和文件读取不一样
发表于: 2015-2-5 22:13 12428

[求助]我发现pe 在内存中读取和文件读取不一样

2015-2-5 22:13
12428
我用loadPE 软件打开kernel32.dll  e_lfanew 这个值是e8

我写了段代码
在内存搜索 指定的函数,写了一般发现 在内存中读取的 e_lfanew值为 f0
数据的偏移绝对没问题的
导出表的值也变了,为什么呢。求高手指点
start:
      
assume fs:nothing
mov eax,fs:[30h]
mov eax,[eax+0ch]
mov esi,[eax+1ch]

lodsd

mov eax,[eax+8]
push eax                ;;;;     push eax      1
mov esi,eax
assume esi:ptr IMAGE_DOS_HEADER
mov ax, [esi].e_magic

.if ax != 5a4dh
        jmp EXT
.endif

add esi,[esi].e_lfanew
assume esi:ptr IMAGE_NT_HEADERS
mov eax, [esi].Signature

.if eax != 4550h
        jmp EXT
.endif

mov eax,[esi].OptionalHeader.DataDirectory.VirtualAddress

invoke wsprintf,addr szbuff,addr sztxt,eax
invoke MessageBox,NULL,addr szbuff,NULL,MB_OK

EXT:
ret

end start

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 36
活跃值: (45)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
这是我以前写的demo,因为现在的TEB结构里的格式不和以前一样了
.386
.model flat,stdcall
option casemap:none
include windows.inc
.code
start proc

            
         assume fs:nothing
         xor   ecx,ecx
     mov eax,fs:[30h]
     mov eax,[eax + 0ch]
     mov esi,[eax + 1ch]
next_module:
         mov   eax,[esi+08h]
         mov   edi,[esi+20h]
         mov   esi,[esi]
         cmp  [edi+12*2],cx
         jnz  next_module
;****************************************************************************************        
         mov edx,eax     ;eax保存着KERNEL32基址 ,xp  win7 64位通杀
    mov eax,(IMAGE_DOS_HEADER ptr [edx]).e_lfanew    ;得到IMAGE_NT_HEADERS地址
    mov eax,(IMAGE_NT_HEADERS ptr [edx + eax]).OptionalHeader.DataDirectory.VirtualAddress    ;得到导出表RVA
     add eax,edx                    ;导出表在内存的实际地址
    assume eax:ptr IMAGE_EXPORT_DIRECTORY
     mov esi,[eax].AddressOfNames
     add esi,edx
     push 00007373h    ;在堆栈中构造GetProcAddress
     push 65726464h
     push 41636F72h
     push 50746547h
     push esp
     xor ecx,ecx
     .repeat
         mov edi,[esi]
         add edi,edx
         push esi
         mov esi,[esp + 4]
         push ecx
         mov ecx,0fh ;GetProcAddress的长度,包括0
         repz cmpsb
         .break .if ZERO? ;找到跳出循环
        pop ecx
         pop esi
         add esi,4
         inc ecx
     .until ecx >= [eax].NumberOfNames
     pop ecx
     mov esi,[eax].AddressOfNameOrdinals
     add esi,edx
     movzx ecx,word ptr [esi + ecx*2] ;取出序数
    mov esi,[eax].AddressOfFunctions
     assume eax:nothing
     add esi,edx
     mov esi,[esi + ecx*4]
     add esi,edx ;得到GetProcAddress地址
    mov  edi,edx
         push 00000000
     push 41797261h ;在栈中构造LoadLibraryA
     push 7262694Ch
     push 64616F4Ch
     push esp
     push edx
     call esi ;调用GetProcAddress获取LoadLibraryc地址
    ;mov edx,ebx
         call _user32
         db 'user32',0
_user32:
         pop ebx
         push ebx
         call eax
     ;    mov edi,eax
         call _msg
        db 'MessageBoxA',0
   _msg:
         pop  ebx
         push ebx
         push eax
         call esi
         call _hello
         db 'hello',0
_hello:
         pop ebx
         push 0
         push 0
         push ebx
         push 0
         call eax
         call _exit

        db 'ExitProcess',0
_exit:         
        pop ebx
        push ebx
        push edi
        call esi
        push 0
        call eax

      
start endp
end start
2015-2-6 08:30
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
内存对齐啊!
2015-2-6 11:24
0
雪    币: 88
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
都在一个节内 对什么齐
2015-2-6 13:48
0
雪    币: 10
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我用LoadPE打开后e_lfanew的值为0xf0
用Winhex  查看0x3ch 处的值也为0xf0
搜索内存后在调试器里 e_lfanew的值也为0xf0
没发现你的问题
2015-2-6 14:31
0
雪    币: 88
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
难道版本不一样??
2015-2-6 16:03
0
雪    币: 36
活跃值: (45)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
你得到kernel32的基址就不对,把我给你的源码编译下OD里跟下就明白了,和对齐没关系
2015-2-6 16:11
0
雪    币: 88
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
为什么在OD 中 一个在cpu 查看 kernel32  的.e_lfanew

和在memory 里面查看 一个是 f0 一个是e8  我读取到的是f0

我知道了,一个是kernel.32  kernelbase
上传的附件:
2015-2-6 16:21
0
雪    币: 36
活跃值: (45)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
9
终于明白了!!!,想当初哥也卡壳到这
2015-2-6 18:02
0
雪    币: 88
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
多谢

[edi+12*2]  这个是什么意思啊,我没看懂 ,我也对照那个结构了
2015-2-6 22:06
0
雪    币: 36
活跃值: (45)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
11
kernel32.dll宽字符的大小是24个字节后面结尾的00第一个是ntdll。dll 第二个就是kernel32.dll
CMP WORD PTR DS:[EDI+18],CX
EDI 00251F98 UNICODE "kernel32.dll"
EDI+18 正好是字符串尾部
2015-2-6 23:13
0
雪    币: 88
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
[QUOTE=wjuid;1352307]kernel32.dll宽字符的大小是24个字节后面结尾的00第一个是ntdll。dll 第二个就是kernel32.dll
CMP WORD PTR DS:[EDI+18],CX
EDI 00251F98 UNICODE "kernel32.dll"
EDI+18 正好是...[/QUOTE]

  mov eax,fs:[30h]          ;_PEB 的地址
     mov eax,[eax + 0ch]  ;PEB->Ldr 地址              
     mov esi,[eax + 1ch]    ;PEB_LDR_DATA 中 InInitializationOrderModuleList的地址

该结构的后三个成员是指向LDR_MODULE链表结构中相应三条双向链表头的指针,分别是按照加载顺序、在内存中地址顺序和初始化顺序排列的模块信息结构的指针。LDR_MODULE结构,其实就是_LDR_DATA_TABLE_ENTRY结构

next_module:
         mov   eax,[esi+08h]  ;InMemoryOrderLinks ;上面是这个InInitializationOrderModuleList,为什么这里又用到InMemoryOrderLinks ,我找了写都没有说明白的
         mov   edi,[esi+20h]  ;SizeOfImage      
         mov   esi,[esi]          ;移动到下一个
         cmp  [edi+12*2],cx
         jnz  next_module

可能我还不太理解,我的注释有问题吗
2015-2-7 09:53
0
雪    币: 36
活跃值: (45)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
13
用windbg  !peb 好好看下 就知道了 明白原理自己也可以用自己的方法找
2015-2-7 18:43
0
游客
登录 | 注册 方可回帖
返回
//