首页
社区
课程
招聘
[已解决]怎样编程得到主动调用进程的地址?
发表于: 2009-4-24 11:51 7699

[已解决]怎样编程得到主动调用进程的地址?

2009-4-24 11:51
7699
怎样编程得到主动调用模块的地址?
比如主程序A.exe调用B.DLL, 然后B调用C.DLL的 x函数,那么怎么在x函数里得到B.dll的模块名和内存地址

好像有点搞,不知道我说的意思是否清楚。

谢谢高人的指点了。

补充:这里的B.dll是一个dll的集合,就是说有n多dll调用C.DLL的 x函数,B.dll的名字是不知道的,如果知道的话,那我就不在这里问了。

[注意]APP应用上架合规检测服务,协助应用顺利上架!

收藏
免费 0
支持
分享
最新回复 (18)
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
2
楼主应该看一看什么叫做“栈回溯”。当然栈回溯的结果也不一定准确。
2009-4-24 22:15
0
雪    币: 129
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
b.dll的进程名不就是A.exe吗,什么意思得到B的进程名没听明白.
得A的进程名就用GetModuleFileName
得到B的地址也是GetModuleHandle
2009-4-24 23:01
0
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
4
我估计楼主的意思是得到B.dll的“模块名”和内存地址。
如果只是要知道自身进程名,那的确一个GetModuleFileName就搞定了,我只能理解为楼主不是这个意思。
至于b.dll的内存地址,楼主的意思应该是事先不知道b.dll的文件名,所以不能直接用GetModuleHandle

虽然楼主表述得很不规范,不过就我理解,楼主想要知道“是哪个dll里的函数调用了x函数”,事先不知道该dll的名字。
所以我建议他去看与“栈回溯”有关的内容。
2009-4-24 23:06
0
雪    币: 476
活跃值: (307)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
感觉亮了点!!
2009-4-25 14:29
0
雪    币: 2134
活跃值: (14)
能力值: (RANK:170 )
在线值:
发帖
回帖
粉丝
6
http://www.google.com/search?hl=en&q=RtlWalkFrameChain&aq=f&oq=
google下RtlWalkFrameChain,可能会有不少收获
2009-4-26 14:35
0
雪    币: 107
活跃值: (200)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
谢谢!!是我没有说清楚,我想得到模块名和调用的地址。因为事先并不知道那个模块调用了那个函数
2009-4-28 09:07
0
雪    币: 107
活跃值: (200)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
哈,还是轩辕小聪的领悟力高啊,是我没表述清楚,说进程名有误,应该是模块名。
2009-4-28 09:10
0
雪    币: 603
活跃值: (40)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
9
偶没看明白,汗死
2009-4-28 10:48
0
雪    币: 189
活跃值: (56)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
10
一般是用CALL调用的话,看看堆栈的返回地址,然后根据返回地址往上找pe文件头,估计能找到.
2009-4-28 20:56
0
雪    币: 256
活跃值: (788)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
HMODULE WINAPI ModuleFromAddress(PVOID pv)
{
//pv---是栈地址
    MEMORY_BASIC_INFORMATION mbi;
    if(::VirtualQuery(pv, &mbi, sizeof(mbi)) != 0)
    {
        return (HMODULE)mbi.AllocationBase;
    }
    else
    {
        return NULL;
    }
}
2009-4-29 14:55
0
雪    币: 107
活跃值: (200)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
谢谢!!
你这个pv栈地址怎么取出来?

这样行吗?
PVOID addrs;
BOOL x(....)
{
      __asm POP addrs;
      __asm PUSH addrs;
      
      HMODULE hMod=ModuleFromAddress(addrs);
      ...........................
      ...........................
}

这样可以吗?
2009-4-30 09:21
0
雪    币: 256
活跃值: (788)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
13
DWORD addrs;
        __asm{
                push dword ptr [ebp+8]     //调试一下
                pop  dword ptr [addrs]
        }

        HMODULE hint1=ModuleFromAddress((PVOID)addrs);
2009-5-1 09:09
0
雪    币: 107
活跃值: (200)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
[QUOTE=wyqzm;614938]DWORD addrs;
        __asm{
                push dword ptr [ebp+8]     //调试一下
                pop  dword ptr [addrs]
        }

        HMODULE hint1=ModuleFromAddress((PVOID)addrs);[/QUOTE]

试了一下,不行
2009-5-1 13:29
0
雪    币: 605
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cfz
15
我也进来学习下,,,分享下
2009-5-1 13:30
0
雪    币: 256
活跃值: (788)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
1,你不要照搬
2,你的想法我用过,上面的代码不一定一样,只是我测试成功.
2009-5-1 21:01
0
雪    币: 152
活跃值: (106)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
17
真是无聊的问题。不外湖就是create process或者LoadLibrary的级别挂接问题。
2009-5-1 23:30
0
雪    币: 107
活跃值: (200)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
真是无聊吗?你真是奇怪啊,晕死了,你很牛啊,不给出指导就罢了,何必。。。。。。

我是菜鸟,目前的问题只有这样的解决办法,所以请大家指教了
2009-5-2 11:11
0
雪    币: 107
活跃值: (200)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
DWORD addrs;
BOOL x(....)
{
      __asm POP addrs;
      __asm PUSH addrs;
      
      HMODULE hMod=ModuleFromAddress((PVOID)addrs);
      ...........................
      ...........................
}


我终于用这个调试成功!!
2009-5-2 17:04
0
游客
登录 | 注册 方可回帖
返回
//