能力值:
( 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
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
内存对齐啊!
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
都在一个节内 对什么齐
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
我用LoadPE打开后e_lfanew的值为0xf0
用Winhex 查看0x3ch 处的值也为0xf0
搜索内存后在调试器里 e_lfanew的值也为0xf0
没发现你的问题
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
难道版本不一样??
|
能力值:
( LV3,RANK:30 )
|
-
-
7 楼
你得到kernel32的基址就不对,把我给你的源码编译下OD里跟下就明白了,和对齐没关系
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
为什么在OD 中 一个在cpu 查看 kernel32 的.e_lfanew
和在memory 里面查看 一个是 f0 一个是e8 我读取到的是f0
我知道了,一个是kernel.32 kernelbase
|
能力值:
( LV3,RANK:30 )
|
-
-
9 楼
终于明白了!!!,想当初哥也卡壳到这
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
多谢
[edi+12*2] 这个是什么意思啊,我没看懂 ,我也对照那个结构了
|
能力值:
( 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 正好是字符串尾部
|
能力值:
( 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
可能我还不太理解,我的注释有问题吗
|
能力值:
( LV3,RANK:30 )
|
-
-
13 楼
用windbg !peb 好好看下 就知道了 明白原理自己也可以用自己的方法找
|