大事件,大事件,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")
...全文
8153 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,486

社区成员

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

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