大事件,大事件,VB爱好者们都进来

chenhui530 2010-07-14 09:42:29
加精
今天突发奇想终于把VB下的“函数指针”实现了。
我先解释下VB下的“函数指针”是什么意思吧!相信大家都遇到这样一些尴尬的问题。
问题一:一个未到处的函数,知道声明在VB中怎么调用它能,相信有研究的人都会想些方法五外乎下面几种。(1)使用CreateRemoteThread建立一个线程来执行它,这里我们先别谈它的执行效率,都存在一个问题,参数只能是一个或者是没有参数的函数,如果这个未导出的函数参数有多个能,显然就不能使用这个函数来解决了。(2)CallWindowProc这个函数也能执行函数,但是显然还是存在参数问题。
问题二:自己写了段ShellCode怎么执行能?当然上面说的几种方法都行,但是还是脱离不了参数的困扰。
问题三:在VB下进行API Hook时的尴尬,现在很多代码都是当需要调用原函数前的时候先恢复原来hook的代码然后再调用,然后再hook,这里存在严重的效率和潜在问题。
等等还有些问题就不列举了。难道就没一种方法能象C等语言那样声明一个函数指针,然后让函数指针指向这个地址,然后CALL的方法了吗?我在这个问题上也想过,但是苦于没有找到好的方法解决一直,没有实质性的突破,今天终于突发奇想,实践证明了VB也是可以使用函数指针的。我的方法是利用API Hook技术来实现的,由于代码没有经过严格封装,所以暂时不贴全,贴点关键点的,大家一起来讨论。

我先说下我的思路,我一开始就留意到了msvbvm60的导出函数DllFunctionCall,没错就是它,它是我们在使用API函数时的一个封装体,在内部实现了GetProcAddress+GetModuleHandle来实现获取函数的地址,在这之前先进行了压栈操作,当函数地址获取完后就直接jmp过去了,具体自己可以使用OD或者IDA去察看。我现在把这个函数进行了hook,并且在内部维护;两张表,一张存放函数地址的一张存放函数名称的,并且这两张表是一一对应的,当检测到我需要调用的函数时,就把对应的函数地址返回给DllFunctionCall这样我们就实现了移花接木的功能。
请看下面声明Public Declare Function DeleteFileW Lib "msvbvm60.dll" (ByVal lpszFileName As Long) As Long
其实这个声明在msvbvm60是不存在的,但是没关系我们就是要这样做,当然函数名称你可以任意取但是别和msvbvm60到处的函数名字一样就行。这时DeleteFileW和就可以是我自己指定的地址了,当然这个地址的函数原型是要和上面声明的一样的才行。这样当在程序里调用DeleteFileW的时候其实已经跳转到了我想要跳转到的地址,这样就实现了VB下的“函数指针”的功能了。好大家看下面的关键代码。

Public Function InitHook() As Boolean
mszmsvbvm60 = StrConv("msvbvm60.dll", vbFromUnicode) '这里需要村Ansi字符串类型
'这里我最多维护1024个元素
glpdwFunAddresses = VirtualAlloc(ByVal 0&, 4 * 1024, MEM_COMMIT, PAGE_READWRITE) '地址表
glpdwFunNames = VirtualAlloc(ByVal 0&, CLng(128 * CLng(1024)), MEM_COMMIT, PAGE_READWRITE) '名称表

InitHook = glpdwFunAddresses <> glpdwFunNames <> 0
End Function

Public Function HookDllFunctionCall() As Boolean
Dim ShellCode(0 To &H1000) As Byte
Dim OldProtect As Long
Dim bytValue As Byte
Dim dwValue As Long
Dim wValue As Integer
Dim dwFunAddress As Long
Dim bytHookCode(0 To 4) As Byte

ShellCode(0) = &H55
wValue = &HEC8B
CopyMemory ByVal VarPtr(ShellCode(1)), ByVal VarPtr(wValue), 2
wValue = &HEC83
CopyMemory ByVal VarPtr(ShellCode(&H3)), ByVal VarPtr(wValue), 2
ShellCode(5) = &H8
wValue = &H458B
CopyMemory ByVal VarPtr(ShellCode(&H6)), ByVal VarPtr(wValue), 2
ShellCode(8) = &H8
ShellCode(9) = &H53
ShellCode(&HA) = &H56
wValue = &H358B
CopyMemory ByVal VarPtr(ShellCode(&HB)), ByVal VarPtr(wValue), 2
dwValue = VarPtr(glpdwFunNames)
CopyMemory ByVal VarPtr(ShellCode(&HD)), ByVal VarPtr(dwValue), 4
wValue = &H88B
CopyMemory ByVal VarPtr(ShellCode(&H11)), ByVal VarPtr(wValue), 2
wValue = &H408B
CopyMemory ByVal VarPtr(ShellCode(&H13)), ByVal VarPtr(wValue), 2
ShellCode(&H15) = &H4
ShellCode(&H16) = &H57
wValue = &H3D8B
CopyMemory ByVal VarPtr(ShellCode(&H17)), ByVal VarPtr(wValue), 2
dwValue = VarPtr(glpdwFunAddresses)
CopyMemory ByVal VarPtr(ShellCode(&H19)), ByVal VarPtr(dwValue), 4
ShellCode(&H1D) = &H68
dwValue = StrPtr(mszmsvbvm60)
CopyMemory ByVal VarPtr(ShellCode(&H1E)), ByVal VarPtr(dwValue), 4
ShellCode(&H22) = &H51
ShellCode(&H23) = &HC7
'....由于篇幅省略一长串
dwFunAddress = GetProcAddress(GetModuleHandle("msvbvm60.dll"), "DllFunctionCall")
...全文
8147 265 打赏 收藏 转发到动态 举报
写回复
用AI写文章
265 条回复
切换为时间正序
请发表友善的回复…
发表回复
xjman1234 2012-09-22
  • 打赏
  • 举报
回复
太长,有点晕....先顶后看..
piaoxie268 2012-07-19
  • 打赏
  • 举报
回复
看的有点晕!
但是碰到这一块的问题了.
༺彼岸花开༻ 2011-10-13
  • 打赏
  • 举报
回复
学习,功底太低,未能参透..........
ligyou01 2011-01-30
  • 打赏
  • 举报
回复
不知道行不?先顶吧
yldcb 2010-12-04
  • 打赏
  • 举报
回复
看不懂。。。最尴尬
woowtaotao 2010-08-01
  • 打赏
  • 举报
回复
顶~~~~~
ms1995 2010-07-29
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分
dt168 2010-07-28
  • 打赏
  • 举报
回复
顶起!
nitaiyoucala 2010-07-28
  • 打赏
  • 举报
回复
回帖加分,为这个而来。
xiaoquan1987 2010-07-26
  • 打赏
  • 举报
回复
顶礼膜拜…………
qq52016000 2010-07-25
  • 打赏
  • 举报
回复
努力学习!再努力。
yixlin 2010-07-25
  • 打赏
  • 举报
回复
顶个,加分
  • 打赏
  • 举报
回复
膜拜一下...
嗷嗷叫的老马 2010-07-24
  • 打赏
  • 举报
回复
251楼!
bott12 2010-07-24
  • 打赏
  • 举报
回复
顶一下再学习!
zhdgzhdg 2010-07-23
  • 打赏
  • 举报
回复
[Quote=引用 239 楼 unending 的回复:]
看到这么多正面评价,我想是不是应该给楼主泼泼冷水了,因为众口一词怕会导致心理膨胀和专政。
虽然没读过楼主的代码,但我想楼主所谓VB指针不外乎调用API实现内存的直接访问。
我个人印象中的指针应该是用一些简捷的汇编指令实现内存的高效存取,而调用系统API访问内存至少需要经过寄存器压栈出栈等复杂指令,其性能岂能与真正的指针同日而语。因此希望楼主不要钻牛角尖,VB实现不了的可以用VC做DLL或者CO……
[/Quote]

是调用API实现内存的直接访问,但楼主的设想值得称赞。
zhdgzhdg 2010-07-23
  • 打赏
  • 举报
回复
微软是不是应该将楼主的设想纳入vb中?值得推荐。
iritwq 2010-07-22
  • 打赏
  • 举报
回复
好东西,留名备用
Ilovexieyan 2010-07-22
  • 打赏
  • 举报
回复
顶,学习中
itfamily 2010-07-22
  • 打赏
  • 举报
回复
高手出没的地方,先顶后观。
加载更多回复(236)
里面所含的内容有: 1、vb6MDPlay重复播放.txt 2、vb6MsgBox消息窗口.txt 3、vb6text自动换行.txt 4、vb6保存(读取)数据到注册表里.txt 5、vb6背景色透明.txt 6、vb6打开任意类型的文件.txt 7、vb6打开网页.txt 8、vb6单击按钮复制文本框内的内容.txt 9、vb6单击按钮最小化窗体.txt 10、vb6点击最大化最小化和关闭(有上角的)触发什么事件.txt 11、vb6调用API函数模拟按下Alt键.txt 12、vb6读写txt内容.txt 13、vb6根据MDPlay设计进度框.txt 14、vb6后台发送邮件.txt 15、vb6获取鼠标当前位置.txt 16、vb6检测程序是否运行.txt 17、vb6检测键盘的输入.txt 18、vb6检测文件是否存在.txt 19、vb6进度条的使用A.txt 20、vb6进度条的使用B.txt 21、vb6禁止改变窗口大小(允许最大化和最小化).txt 22、vb6模拟按键.txt 23、vb6模拟键盘输入的N种方法.txt 24、vb6判断鼠标左键被按下.txt 25、vb6屏幕任意截图.txt 26、vb6全局键盘钩子.txt 27、Vb6如何注册OCX控件.txt 28、vb6什么是键盘虚拟键?.txt 29、vb6使控件大小随窗体的变化而变化.txt 30、vb6使用ShellExecute调用RAR进行解压.txt 31、vb6释放资源文件.txt 32、vb6提取包含特定字符的行的内容.txt 33、vb6托盘+气泡(不用模块).txt 34、vb6拖动text文本框.txt 35、vb6拖动没有标题栏的窗口.txt 36、vb6信息收发软件的制作.txt 37、vb6循环整数的运用.txt 38、vb6用MDPlay播放音乐.txt 39、vb6用代码解压缩rar文件.txt 40、vb6用代码添加资源文件.txt 41、vb6在程序中调用资源文件.txt 42、vb6在数据库中保存变量.txt 43、vb6怎么生成不带引号的字符.txt 44、vb6制作时钟(时针、分针、秒针).txt 45、vb6中的text中输入的内容存为txt文本.txt 46、vb6中多个简单的命令.txt 47、vb6中怎样加载背景图片,能随窗体大小变化? .txt 以上内容纯属作者本人整理,内容的可靠性也经本作者亲手证实,请放心使用,珍惜作者的劳动成果。
556,delay1.zip 源码设计中的延时功能(1KB)557,type_1.zip 趣味打字2.1(233KB)558,test1.zip asp编写动态网页计数器(1KB)559,hztosm.zip 汉字转声母完全源代码(90KB)560,formatfloppy.zip 格式化软盘源代码(13KB)561,freespace.zip 获取磁盘剩余空间(3KB)562,setscreen 设置屏幕分辨率(7KB)563,snapwindow.zip 一个抓图的小程序(14KB)564,hotrgn.zip 热区的应用(6KB)565,getserial.zip 读出驱动器序列号,可以制作加密安装盘(2KB)566,opencdrom.zip 可以程序控制打开或关闭CDROM,非常方便(2KB)567,getusername.zip 自动读取用户登陆名称,再进行密码验证(2KB)568,gethostname.zip 读取机器名称(2KB)569,printpic.zip 解决图形打印的问题(50KB)570,g029_pcl.zip拼图游戏(56KB)571,g028_octopus.zip一个简单的掌上游戏机的游戏,这个游戏机的内容是要逃过大章鱼的捕捉(408KB)572,g027_menace.zip仓库世家-推箱子的游戏(114KB)573,g026_breKthru.zip弹珠台游戏(41KB)574,g025_zhq.zip一个能考考你的智慧的智慧棋(17KB)575,g024_vb-sol.zipVB 的扑克牌游戏的源码(15KB)576,g023_picgame.zip一个好玩的拼图游戏(25KB)577,g021_zm015看着超级玛莉不停的追赶着你的鼠标,是不是很有意思呢?(25KB)578,g020_zm019一个拼图游戏,可以自己指定图片进行游戏(12KB)579,g019_zm011一个网络五子棋的源程序(并有聊天功能)(41KB)580,g018_zm010.zip中国象棋的源程序,支持网络作战(23KB)581,g0173维的breaKthrough游戏(8KB)582,g016.zip小蜜蜂射击游戏源程序, 不仅演示了 vb 的图形操作技巧,键盘操作,还演示了怎样使用 npmod32.dll(已包含,免费) 来播mod,s3m,mpp,med,xm,it,mdz,itz,xmz,s3z 等音乐格式文件(208KB)583,g015.zip旋转俄罗斯 1.0 demo 版的源程序,vb5 版存贮,稍加修改即适合于 vb4、vb3。里面有用 vb 处理俄罗斯方块的核心内容及简单注释(8KB)584,g014.zipbreakthrough游戏(保持小球在屏幕上跳动)源程序(50KB)585,g013.zip3维迷宫游戏的源程序(40KB)586,g012.zip射击(导弹)游戏的源程序(5KB)587,g011.zip生命游戏源程序(12KB)588,g010.zip一个精灵游戏源程序(33KB)589,g009.zip翻转棋游戏(64子, 每子正反面分别为黑白两色, 两人对弈)的源程序(29)590,g008.zip纸牌游戏源程序(45KB)591,g007.zip太空船游戏例子源程序(48KB)592,g006.zip用白雪做背面的俄罗斯方块(1.0版),自带EXE(224KB)593,g005.zip个人娱乐游戏,自带EXE(25KB)594,g004.zip个个人自娱乐的扑克牌游戏(57KB)595,g003.zip代表和平的娱乐游戏,自带EXE(12KB)596,g002.zip一个迷宫游戏,还有地图编辑器呢,完全源码(230KB)597,g001.zip模仿windows中的扫雷,自带EXE(38KB)

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧