能力值:
( LV9,RANK:610 )
|
-
-
2 楼
PEB+0x8处读一下吧~
|
能力值:
( LV13,RANK:260 )
|
-
-
3 楼
EnumProcessModule 后 用GetModuleFileNameEx 尝试性获取 各个基址 ,如果获取成功 就是主模块基址...
|
能力值:
( LV15,RANK:440 )
|
-
-
4 楼
直接读原始PE文件不行吗?
|
能力值:
( LV4,RANK:50 )
|
-
-
5 楼
win7下用od加载 发现 基地址是动态的
|
能力值:
( LV15,RANK:440 )
|
-
-
6 楼
看来lz调试的程序自带重定位节的。能否上传二进制文件看看?我还没见过这样的程序,有点好奇。
|
能力值:
( LV12,RANK:250 )
|
-
-
7 楼
GetModuleFileNameEx
GetModuleHandleEx
之类API
|
能力值:
( LV15,RANK:440 )
|
-
-
8 楼
这样做应该可以了吧。
1,EnumProcessModules
2,GetModuleInformation,遍历上边得到目标进程的模块列表,找到你要的模块(GetModuleFileNameEx).
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
fs->peb。achillis说的很清楚了
|
能力值:
( LV4,RANK:50 )
|
-
-
10 楼
汇编 fs:[30] 已经获得了 fs的值,怎么转化成 地址,为高级语言访问?
地址 fs+30 ?? fs*0xffffffff+30 ?
|
能力值:
( LV4,RANK:50 )
|
-
-
11 楼
有API不用 要自己去硬编码 真是蛋疼
|
能力值:
( LV4,RANK:50 )
|
-
-
12 楼
如果是当前进程,GetModuleHandle( NULL )返回的是什么?
如果有其它进程的handle,
HMODULE hMod;
DWORD cbNeeded;
HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID );
EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded);
hMod应该就是。
|
能力值:
( LV3,RANK:30 )
|
-
-
13 楼
EXE一般没有重定位信息, 就在PE头里找吧
|
能力值:
( LV4,RANK:50 )
|
-
-
14 楼
返回的是程序本身的,
想获得程序通过CreateProcess 启动后的程序的 基地址
|
能力值:
( LV4,RANK:50 )
|
-
-
15 楼
HMODULE hMod;
DWORD cbNeeded;
HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID );
EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded);
hMod应该就是。
|
能力值:
( LV15,RANK:440 )
|
-
-
16 楼
也可以写一段shellcode,远线程注入目标进程执行读取peb,将想要的数据存放在shellcode设置的变量里。最后用ReadProcessMemory读出来。
|
能力值:
( LV12,RANK:210 )
|
-
-
17 楼
MSDN:
http://msdn.microsoft.com/en-us/library/ms682621(v=vs.85).aspx
|
能力值:
( LV4,RANK:50 )
|
-
-
18 楼
ring3 下能实现吗?
|
能力值:
( LV12,RANK:360 )
|
-
-
19 楼
我告诉你吧~但这个方法在某些情况下不一定准确:
先用
CONTEXT ThreadCxt;
ThreadCxt.ContextFlags = CONTEXT_FULL;
GetThreadContext(pi.hThread,&ThreadCxt);
取出EIP,然后用
invoke VirtualQuery,lpControlFunc,addr mbi,sizeof MEMORY_BASIC_INFORMATION 不过这里你明显需要用VirtualQueryEX了
之后要用mbi.BaseAddress还是mbi.AllocationBase你自己决定喽! 上面说了某些情况下会不准确,什么情况下呢?就是如果当前EIP正运行在一个动态申请的内存上,一般高级语言写的程序不会这么做,壳才这么做.
上面achillis说的PEB我只知道在进程创建的时候可以获取到,不知道进程运行后怎么获取,如果能获取的话,建议还是用这个方法方便点!
AZMC的方法也行,如:
invoke GetModuleHandleExA,GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,@EIP,addr hModule
但可惜的是,好像只能用在自己身上...
|
能力值:
( LV12,RANK:360 )
|
-
-
20 楼
额,刚没仔细看你内容,你是想获取自己创建的进程基地址?那获取PEB的方法告诉你:(需要是暂停或者调试方式创建的进程才可以)
CONTEXT ThreadCxt;
ThreadCxt.ContextFlags = CONTEXT_FULL;
GetThreadContext(pi.hThread,&ThreadCxt);
printf("Target PEB Addr : 0x%08X.\n",ThreadCxt.Ebx);
还有,这时候EAX的地址是程序入口点!
可以参考类似的文章:http://hi.baidu.com/viruswizard/blog/item/466279123106db8a6538db9c.html
|
能力值:
( LV9,RANK:610 )
|
-
-
21 楼
可以啊,而且随时可以读……
|
能力值:
( LV4,RANK:50 )
|
-
-
22 楼
多谢按照这种方法实现了,
但是还是有点想不通,
在win7下写一个内存注册机,发现每次需要补丁的地址不一样,通过上面的方法 获得 基地址还是400000,
反正相对入口地址的偏移量是固定的 就直接用入口地址+偏移量作补丁地址了。
疑惑是win7加载应用程序为什么 peb中基地址命名是400000,但是每次程序的入口的地址还是动态的?
|
能力值:
( LV12,RANK:360 )
|
-
-
23 楼
有这么神奇的事?你确定是入口地址?
|
能力值:
( LV4,RANK:50 )
|
-
-
24 楼
通过peb 获得的 基地址 是 400000
但是win7不是按照这个基础地址 加载的,不知道为什么?
|
能力值:
( LV12,RANK:360 )
|
-
-
25 楼
如果不是入口地址,则有可能是后面动态申请的内存~
|
|
|