VBGood网站全文搜索 Google

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

VB爱好者乐园(VBGood)

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

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

[复制链接]
 楼主| 发表于 2008-5-20 08:52:57 | 显示全部楼层
帐号守护者用的人貌似还是挺多的…………等有空了完善一下,弄得智能一点,再申请个专利
回复 支持 反对

使用道具 举报

发表于 2008-8-1 21:15:45 | 显示全部楼层
发现没有,在IDE下一切失灵(虽然也不崩溃),如何解决IDE下的正确执行?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-8-1 21:26:58 | 显示全部楼层
原帖由 Jerry74 于 2008-8-1 21:15 发表
发现没有,在IDE下一切失灵(虽然也不崩溃),如何解决IDE下的正确执行?

IDE里面由于是靠vb的虚拟机dll解释执行代码的。。。所以。。。。。
就算用“全编译执行”也不起作用。。。。。
这个比较难解决。。。
回复 支持 反对

使用道具 举报

发表于 2008-8-7 02:05:11 | 显示全部楼层
偶然跳到这里看了一下,2下...3 下.. 5下,终于看懂什么意思了
依目前的代码状况来看,多用几次出现非法操作的错误机率将大大增加,特别是对msgbox这种
操作字符串的函数, 如果
push 10次
jmp api
ret ...
那么会怎样? 一部分栈堆内容被api给弹出去了,然后自己的函数又按照原函数参数个数继续弹,想到了吗... ... 被多弹了好几个... 栈内容不对称,对操作处理的正确性不能保证了..
其实vb调用api的速度也是非常快的,msdn说相对于直接调用会有1%~3%的效率问题,测试过确实如此..
ms确实有一套

...又看了看,貌似我还是没看明白, 所以以上内容仅供参考了......

或者说,后来说那个 10 个参数应付所有api的方法是不正确的...因为我没看到为调用api而正确压栈的内容...
以messagebox来说,调用他后,他取栈顶以下4个dword值,那这样的话.....

[ 本帖最后由 PctGL 于 2008-8-7 02:10 编辑 ]
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-8-7 08:39:09 | 显示全部楼层
原帖由 PctGL 于 2008-8-7 02:05 发表
偶然跳到这里看了一下,2下...3 下.. 5下,终于看懂什么意思了
依目前的代码状况来看,多用几次出现非法操作的错误机率将大大增加,特别是对msgbox这种
操作字符串的函数, 如果
push 10次
jmp api
ret ...
那 ...

堆栈问题将被错误处理机制自动搞定
副作用就是,如果你想用debugger调试。。那么。。嘿嘿嘿嘿
回复 支持 反对

使用道具 举报

发表于 2008-8-8 14:50:26 | 显示全部楼层
楼上的都是高手~~

我看得愣了好久.....
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-8-14 09:08:27 | 显示全部楼层
原帖由 PctGL 于 2008-8-7 02:05 发表
偶然跳到这里看了一下,2下...3 下.. 5下,终于看懂什么意思了
依目前的代码状况来看,多用几次出现非法操作的错误机率将大大增加,特别是对msgbox这种
操作字符串的函数, 如果
push 10次
jmp api
ret ...
那 ...

另外,不是多弹,而是少弹
回复 支持 反对

使用道具 举报

发表于 2008-8-14 09:19:22 | 显示全部楼层
怎么个少弹法? 另外栈错误的问题,错误捕捉没法处理
在栈乱了的情况下, 以msgbox为例,把一个任意的dword值当地址,读字串,如果值为0或其他不可读数据地址
那将是什么情况?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-8-14 14:30:24 | 显示全部楼层
原帖由 PctGL 于 2008-8-14 09:19 发表
怎么个少弹法? 另外栈错误的问题,错误捕捉没法处理
在栈乱了的情况下, 以msgbox为例,把一个任意的dword值当地址,读字串,如果值为0或其他不可读数据地址
那将是什么情况?

push 10次
call orgFunc

orgFunc:
jmp MessageBoxA

MessageBoxA:
jfasldfj;alsdjf
ret 0x10

于是就少弹了

我自己测试MessageBoxA,完全没有任何问题。如果堆栈有错误,立刻崩溃的。
堆栈少弹错误被seh处理掉了,所以我说你可以试试看用debugger对MessageBoxA下断点,
下断之后,debugger会用自己的seh替代默认的来处理int3(硬件断点也是一样)
所以就会导致程序崩溃

[ 本帖最后由 reker 于 2008-8-14 14:32 编辑 ]
回复 支持 反对

使用道具 举报

发表于 2008-8-14 14:49:43 | 显示全部楼层
是少弹了,开始我理解错了,我以为是 call api,原来是 jmp
但栈堆错误依旧存在,之所以没有发生问题,是因为栈一直在累加,最后调用的函数取栈顶的参数
就不会有问题

开始我的理解是
push 10次
call api
ret 10个

api:
...
ret 参数个数

这样肯定就会造成多弹, jmp 后,是少弹,新调用函数参数也保存在栈顶,于是不会产生任何错误
这也肯定没错误,于是 seh 也不会进行处理, 因为压栈数量多少和何时出栈完全由代码掌握,
seh 不可能知道到底该不该弹出去,听说过seh处理栈溢出,少弹参数seh也能知道?
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2022-7-3 01:37

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