有一个程序,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?

解决方案 »

  1.   

    MSVBVM60.DLL把这个删了VB6就运行不了了。
    就像VC++的MSvcCtr.dll一样
      

  2.   

    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的直接调用,等待高手回复
      

  3.   

    用 peid 这个工具看一下。记得VB应该也会直接包含API的导入。还有种可能是,程序被加了壳。
      

  4.   

    如果用tlb导入API,就不用DllFunctionCall了
    你可以搜索win32.tlb
      

  5.   

    怎么不说一下 用汇编调用API
      

  6.   

    引用带api声明的 tlb 就行了; 编译之后就可以直接将api调用直接指向xxdll,前提是你得用tlb中的函数
      

  7.   

    看看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 LongPublic 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
      

  8.   

    7楼的虎兄,我其实照你的方法试过,无法得到你说的结果,照样只有一个MSVBVM60.DLL。另外,和奇怪的一点是,我将Public Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long) 这段话整个复制到VB6的时候,Alias "sleep" 这几个单词,竟然无法贴到VB6中,VB6好像自动删除了这两个单词,但是可以手动打进去。我看看TLB。
      

  9.   

    Sleep Lib "kernel32" Alias "Sleep"
    重复
      

  10.   


    我贴的API 来自API Viewer for Microsoft Visual Basic
    那个程序是按格式来合成代码字符串的,如果Sleep有SleepA 和 SleepW两个版本
    才是Alias既然大家那么热情我也逆向一下看看吧,大家学习学习!
      

  11.   

    同4,6楼。。用TLB声明API就行了。去下载一个WIN.tlb再引用,部分常用API都有声明了。
      

  12.   

    同意,内嵌汇编可以直接调用API
      

  13.   

    内嵌汇编,太高深了,没时间研究啊,
    现成的win.tlb,估计也用不上,因为我要把一些东西用VC 做成DLL, 所以现成的tlb里肯定没有我的API。看来还要去学习如何制作TLB,要学习的东西实在太多了。