首页
社区
课程
招聘
[求助]获取函数句柄
发表于: 2010-5-5 13:00 9740

[求助]获取函数句柄

2010-5-5 13:00
9740
在网上找了很久,都是获取窗口和控件句柄的帖子,一搜一罗筐!
大家都知道DLL中的函数句柄(或者称其为指针)的方法是通过
  FunHandle =  LoadLibary(DLL_Handle , '函数名')   的方法获取。
  我的问题是如何用类似的方法获取主程序上的函数句柄,或者有这样的API、方法等。
希望大家能提供思路、方法或者是API,最好有原码。要求真是越来越多了

由于匆忙上面的问题写差了,始得大家一头雾水。
  还是这个问题!下面重来
  由 Hinstance = LoadLibrary("文件名")返回得到的模块句柄
  再由FunHandle =GetProcAddress(Hinstance, '函数名')用来获取指定的动态连接库函数的地址
  我的问题是如何用类似的方法获取主程序上的函数地址(不是DLL的函数地址),或者有这样的API、方法等。
  请大家能提供思路、方法或者是API,最好有原码。
   希望这回家大家能看懂。  先谢谢各位!

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (27)
雪    币: 284
活跃值: (106)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
2
晕,这个能叫“句柄”?!狂汗…………呵呵,想法倒是不错……不过没得这样的事情
2010-5-5 13:08
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
3
楼主去上大学吧~~
2010-5-5 13:23
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
LPTHREAD_START_ROUTINE entrypoint;

   __asm

   {

       push eax;

       lea eax,yourfunction;

       mov entrypoint,eax;

       pop eax

   }
2010-5-5 16:11
0
雪    币: 10
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
楼上写的什么?
2010-5-5 20:34
0
雪    币: 253
活跃值: (89)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
楼上各位可能没有看懂我的意思,
我重新做了说明,请大家再看看!
2010-5-6 08:40
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
7
还是一头雾水~~~
2010-5-6 09:41
0
雪    币: 253
活跃值: (89)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
我的问题是如何用“类似的方法”获取主程序中的函数地址(不是DLL的函数地址),或者有这样的API、方法等
2010-5-6 11:56
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
9
GetProcAddress就是遍历导出表匹配函数名而已嘛,EXE也可以有导出函数的,如果导出了是可以这样的,不过一般情况下EXE是不导出函数的。。。
2010-5-6 12:03
0
雪    币: 253
活跃值: (89)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
我的想法就是要导出在EXE中的函数。
注意,有些EXE与DLL类似,可用GetProcAddress导出内部函数,Windows中有些API就是放在这样的EXE中。
    但是我们用的EXE大多数是不能用GetProcAddress导出内部函数,如何导出EXE内部函数,就靠大家了!
2010-5-6 12:18
0
雪    币: 75
活跃值: (718)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
11
看看这样做可行否

扫描代码段,找出所有的call 指令,把call指令后的操作数转换成函数地址(排除其中IAT中的项,也就是导入函数),剩下的就是内部函数的地址了.要导出内部函数名...没有符号文件是办不到的.若有了符号文件,额,内部函数直接从符号文件输出就得了
2010-5-6 13:08
0
雪    币: 458
活跃值: (421)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
12
扫描代码段,找出所有的call 指令
这红字的工作难道不需要一个反汇编引擎吗?
2010-5-6 13:10
0
雪    币: 75
活跃值: (718)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
13
赞同楼上的看法,感觉能用反汇编引擎来做这个就万无一失了.若是自己仅仅用call指令的几个机器码来匹配,很有可能会误判
2010-5-6 13:21
0
雪    币: 253
活跃值: (89)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
先要感谢楼上几位的参与

楼上几位说的是在静态的情况下做这样的工作,动态时如何做?

就是在DLL中取主程序的函数地址,这个难度是相当大的
2010-5-7 11:57
0
雪    币: 636
活跃值: (174)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
15
没导出获取什么,特征码搜索吧。
2010-5-7 13:03
0
雪    币: 253
活跃值: (89)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
在DLL中可以通过回调函数的方法运行主控程序中的函数,这个回调函数地址是EXE通过指针传给DLL的 ,这可以理解为函数的导出。这个功能的实现是在静态设计时做好的。EXE中的函数地址地其运行过程中很容易获得,但这要经过编程实现。比如在EXE中做一个函数专用于获取所在主EXE中和所有函数地址。
如果EXE没有原码或者是别人提供的EXE它的函数地址就不能用上面说的方法了。
2010-5-7 13:33
0
雪    币: 253
活跃值: (89)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
DLL可以通过回调函数的方法来调用EXE中的特定函数,但这个功能必须在设计中制定好才可使用,而且这类回调函数功能视设计要求而相对简单、固定。回调函数地址可以看做是EXE中某个函数导出到DLL的地址,也就是EXE中一个导出函数,供DLL使用。
实际上EXE中的所有函数都可获得,但要通过程序设计时增加一个获取函数地址的功能来实现,并传给DLL。但是大多数EXE是没有源代码的,如何在DLL中获取EXE中的函数地址这是我所期待的
2010-5-7 17:02
0
雪    币: 114
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
.....使用 GetProcAddress 获取 dll 的中函数  是因为函数存在于dll文件的导出表中.  
dll也分导出函数 和 内部使用的函数   ..  不存在导出表的函数是无法获得的
同理...  你的问题是无解的..  我是这么认为的

;补充一点....主程序调用的api函数 是可以获取的..   我指的是软件作者自己写的函数
2010-5-8 18:30
0
雪    币: 97
活跃值: (43)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
19
感觉好像很高深,我知道DLL有相关函数句柄,其实那只是函数指针。其实看你怎么理解句柄这个东西。一般的普通函数(导出函数),都没有句柄的概念,就是一个函数地址啊。不懂楼主需要干什么坏事
2010-5-9 16:28
0
雪    币: 1594
活跃值: (113)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
看了半天终于理解了,就是想调用函数CALL嘛,写那么复杂。想做挂么?
2010-5-9 23:13
0
雪    币: 253
活跃值: (89)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
通过大家的讨论,我好象搞清楚一了点,就是要获得函数地址就一定要有导出表!!
那么EXE中是否有导出表?据我的了解,Windows中有一些EXE中的函数是可以做API使用的,那么能提供API的EXE就一定有导出表?它是如何实现的?
2010-5-10 08:52
0
雪    币: 636
活跃值: (174)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
22
当然有导出表,都是PE结构。声明成导出函数就可以了。

获取个地址而已,特征码搜索不就完了……
2010-5-10 09:03
0
雪    币: 253
活跃值: (89)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
“声明成导出函数就可以了”
那如何在做EXE时声明“导出函数表”的节。使EXE的函数可以导出?
2010-5-10 11:39
0
雪    币: 636
活跃值: (174)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
24


extern "C" __declspec(dllexport) xxx() {
        xxx;
}
2010-5-10 13:50
0
雪    币: 253
活跃值: (89)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
To Fypher  首先感谢你对本问题的参与。
24楼的回复使小虾米看到了曙光。
能否给一个可放在EXE中用的完成代码?
2010-5-11 08:01
0
游客
登录 | 注册 方可回帖
返回
//