VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
楼主: reker

最简单的VB动态调用外部函数(附源代码)

[复制链接]
 楼主| 发表于 2008-5-8 14:13:03 | 显示全部楼层
原帖由 icesboy 于 2008-5-8 13:48 发表


刚看到 VirtualProtect 这个函数。。。


呵呵,VirtualProtect我注释掉了,WriteProcessMemory是无视代码段的,而且写外挂整天就和WriteProcessMemory打交道,用惯了
其实感觉是CopyMemory效率比WriteProcessMemory要高。
最快的方法就是自己在模块里面添加一个function mov(a as long,b as long)
然后用WriteProcessMemory覆盖掉,把mov a,b写进去,以后直接调用mov就快了。。。。

但是vb里面是不能直接使用a=Addressof b的,必须在函数中调用。那么我们就走个弯路:
a=Clng("&H" & Hex(Addressof b))
这个弯路太弯了。。。可以定义 f(x)=x 来解决。。


我是个懒人,习惯用一行代码解决问题。因为得到myFunc的地址只需要执行一次,后来不再需要,所以就用这个办法了,也没有效率问题。


直接改内存的问题则是 IDE 兼容性。


至于你说的兼容性问题,不会有任何问题的。
原理类似于api hook
api hook是修改了api的前5个字节,跳到自己的function,而我的动态调用就是修改自己function的前5个字节,跳到了api
调用的时候,原来是这样的:
vb压栈
call myFunc
myFunc:
xor eax,eax
ret

修改以后变成:
vb压栈
call myFunc
myFunc:
jmp api
api:
xxxxxxx
ret

相当于执行api之前多了个jmp。
没有兼容性问题,而且这样call api的速度非常快,比vb的常规call法要快很多,
动态call api的时间=vb call你的普通函数的时间+执行jmp的时间
这样调用api就相当于调用一个自己的函数,不用再在msvbvm60.dll里面跳来跳去了
回复 支持 反对

使用道具 举报

发表于 2008-5-8 15:05:56 | 显示全部楼层
呵呵,方法是很奇特

但实用性和效率就不知了

我总感觉,直接声明调用会效率高
回复 支持 反对

使用道具 举报

发表于 2008-5-8 15:12:50 | 显示全部楼层
就代码来看调用一个api需要用6个api来实现,代价是不是太高了点
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-5-8 15:32:34 | 显示全部楼层
原帖由 startbin321 于 2008-5-8 15:12 发表
就代码来看调用一个api需要用6个api来实现,代价是不是太高了点

比如你的程序最常用到的api有4个,那么你就写4个myFunc,每个对应一个api
只要在第一次运行的时候,写入内存,以后调用api的时候,速度就非常快了,
因为是直接call过去的,速度和call自己的funciton一样快。
vb原来的方法是把api名字压栈,然后跳2次,进入msvbvm60.dll,参数检查、转换,然后由它来call最终的api。
回复 支持 反对

使用道具 举报

发表于 2008-5-8 16:14:31 | 显示全部楼层
呵呵,如果是循环中调用api那可能会比较快

单单调用一个,代价比较大,嗯还是有实用价值的
回复 支持 反对

使用道具 举报

发表于 2008-5-8 20:15:54 | 显示全部楼层
原帖由 hwbwsb 于 2008-5-8 19:44 发表
LZ的源码你们楼上的都能运行吗?为什么我不行?我这边函数的返回值全部是零.没一个调用成功的.XP+sp3

要编译运行的吧,我Windows xp SP3+SP1

[ 本帖最后由 dolphins 于 2008-5-8 20:33 编辑 ]
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-5-8 20:26:47 | 显示全部楼层
我正在研究怎么在ide里面运行。。。。
ide里面得到的myFunc函数地址居然是假的。。,我在那里用od下断点居然没反应。。。汗死
回复 支持 反对

使用道具 举报

发表于 2008-5-9 12:59:36 | 显示全部楼层
原帖由 reker 于 2008-5-8 09:55 发表

同志,虽然你是高手,本人也很佩服你,
但是,请看完帖子再做评论,谢谢。
同样两个人,个人就比较欣赏icesboy同志。

我的这个方法参数可以达到n个,而不会有任何效率问题产生,速度和你用vb调用自己的函 ...

很遗憾,你错了,我不是高手。高手从来都是不看帖就评论。
说的倒是没错,效率是高些,但通用性也是问题。像我的工程 API 调用近 100 个,这种方法显然还需要改进。:)
回复 支持 反对

使用道具 举报

发表于 2008-5-19 00:38:14 | 显示全部楼层
原帖由 icesboy 于 2008-5-8 13:48 发表


刚看到 VirtualProtect 这个函数。。。


呵呵,之前我就请教过楼主这方面的问题...高手呀.
回复 支持 反对

使用道具 举报

发表于 2008-5-19 00:45:24 | 显示全部楼层
原帖由 reker 于 2008-5-8 14:13 发表


呵呵,VirtualProtect我注释掉了,WriteProcessMemory是无视代码段的,而且写外挂整天就和WriteProcessMemory打交道,用惯了
其实感觉是CopyMemory效率比WriteProcessMemory要高。
最快的方法就是自己在模 ...



说到 API HOOK, 我现在就为了 WriteProcessMemory / ReadProcessMemory 被反外挂程序 HOOK 了而头痛,不知何时能看到楼主关于如何恢复这些被 HOOK 的 API 方面的例子..

强烈关注中....
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2022-6-29 21:27

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表