vb调用DLL的问题,

sjlfs 2011-02-06 12:16:31
有一个程序,WDSM反编译后发现是VB编的,因为调用了MSVBVM60.DLL,但是同时也引用了windows的另外两个标准DLL:
+++++++++++++++++++ IMPORTED FUNCTIONS ++++++++++++++++++
Number of Imported Modules = 3 (decimal)

Import Module 001: KERNEL32.DLL
Import Module 002: ADVAPI32.DLL
Import Module 003: MSVBVM60.DLL

+++++++++++++++++++ IMPORT MODULE DETAILS +++++++++++++++

Import Module 001: KERNEL32.DLL

Addr:77E8399F hint(0000) Name: Sleep
Addr:77E8B6CE hint(0000) Name: CreateDirectoryA
Addr:77E9CB5F hint(0000) Name: GetComputerNameA

Import Module 002: ADVAPI32.DLL

Addr:77DB41D4 hint(0000) Name: RegCreateKeyExA
Addr:77DB213D hint(0000) Name: RegCloseKey
Addr:77DB523F hint(0000) Name: RegDeleteKeyA
Addr:77DB431F hint(0000) Name: RegSetValueExA
Addr:77DB3A3A hint(0000) Name: RegEnumKeyExA
Addr:77DB2276 hint(0000) Name: RegOpenKeyExA
Addr:77DB2A57 hint(0000) Name: RegQueryValueExA
Addr:77DB6835 hint(0000) Name: RegQueryInfoKeyA

Import Module 003: MSVBVM60.DLL
。。。。。。
我知道VB对DLL的调用通常都是 DllFunctionCall 实现的,那么另外两个DLL的直接调用是如何实现的? 


难道是VC编程调用的VB6的MSVBVM60.DLL?
...全文
144 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
sjlfs 2011-02-10
  • 打赏
  • 举报
回复
内嵌汇编,太高深了,没时间研究啊,
现成的win.tlb,估计也用不上,因为我要把一些东西用VC 做成DLL, 所以现成的tlb里肯定没有我的API。

看来还要去学习如何制作TLB,要学习的东西实在太多了。
东方之珠 2011-02-09
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 dianyancao 的回复:]
怎么不说一下 用汇编调用API
[/Quote]
同意,内嵌汇编可以直接调用API
嗷嗷叫的老马 2011-02-08
  • 打赏
  • 举报
回复
同4,6楼。。。。。

用TLB声明API就行了。

去下载一个WIN.tlb再引用,部分常用API都有声明了。
星江月 2011-02-08
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 dianyancao 的回复:]
Sleep Lib "kernel32" Alias "Sleep"
重复
[/Quote]

我贴的API 来自API Viewer for Microsoft Visual Basic
那个程序是按格式来合成代码字符串的,如果Sleep有SleepA 和 SleepW两个版本
才是Alias

既然大家那么热情我也逆向一下看看吧,大家学习学习!
dianyancao 2011-02-08
  • 打赏
  • 举报
回复
Sleep Lib "kernel32" Alias "Sleep"
重复
sjlfs 2011-02-07
  • 打赏
  • 举报
回复
7楼的虎兄,我其实照你的方法试过,无法得到你说的结果,照样只有一个MSVBVM60.DLL。

另外,和奇怪的一点是,我将Public Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long) 这段话整个复制到VB6的时候,Alias "sleep" 这几个单词,竟然无法贴到VB6中,VB6好像自动删除了这两个单词,但是可以手动打进去。

我看看TLB。

星江月 2011-02-07
  • 打赏
  • 举报
回复
看看4,5,6楼同志的回答,我也想废话几句
其实VB也没什么稀奇嘛,调用Windows API 只要用Declare声明,对COM对象(包括ActiveX DLL,也就是你说的OCX)只要CreateObject就可以,而且VB的集成开发界面也可以直接导入tlb(Type Library), Lib(Library) 甚至VC程序员熟悉的 .Res等等

其实我觉得反汇编 关键找到跳转点(函数调用位置) 和 关键的标识(字符串,Addr等等)
你可以尝试 用VB开发一个程序 用Declare声明三个API
Public Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)

Public Declare Function CreateDirectory Lib "kernel32" Alias "CreateDirectoryA" (ByVal lpPathName As String, lpSecurityAttributes As SECURITY_ATTRIBUTES) As Long

Public Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long

反汇编应该也能看到:
Import Module 001: KERNEL32.DLL

Addr:77E8399F hint(0000) Name: Sleep
Addr:77E8B6CE hint(0000) Name: CreateDirectoryA
Addr:77E9CB5F hint(0000) Name: GetComputerNameA
PctGL 2011-02-06
  • 打赏
  • 举报
回复
引用带api声明的 tlb 就行了; 编译之后就可以直接将api调用直接指向xxdll,前提是你得用tlb中的函数
dianyancao 2011-02-06
  • 打赏
  • 举报
回复
怎么不说一下 用汇编调用API
zzyong00 2011-02-06
  • 打赏
  • 举报
回复
如果用tlb导入API,就不用DllFunctionCall了
你可以搜索win32.tlb
threenewbee 2011-02-06
  • 打赏
  • 举报
回复
用 peid 这个工具看一下。

记得VB应该也会直接包含API的导入。还有种可能是,程序被加了壳。
sjlfs 2011-02-06
  • 打赏
  • 举报
回复
1楼的兄弟,我知道MSVBVM60.DLL删了就运行不了了。

我的问题是:通常,VB6编译出来的程序,如果你反编译,只能看到MSVBVM60.DLL一个动态链接库。

不管你实际调用多少个API函数,VB似乎都是通过DllFunctionCall 来实现的,你不可能看到反编译出来的程序中,有直接调用DLL的动作,所以VB的反编译很难看出源码。

但是我贴出的WDSM反编译的字段,竟然有对KERNEL32.DLL和ADVAPI32.DLL的直接调用,所以我觉得很奇怪,也许是VC和VB的混合编程。但是据我所知,VB和VC混编,通常是用VC将代码做成DLL,或者OCX,VB来调用,这样也不可能出现VB对DLL的直接调用。 

所以我怀疑是VC对VB的MSVBVM60.DLL的直接调用,等待高手回复
dianyancao 2011-02-06
  • 打赏
  • 举报
回复
MSVBVM60.DLL把这个删了VB6就运行不了了。
就像VC++的MSvcCtr.dll一样

1,486

社区成员

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

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