一次猜谜的过程:在VB里调用没有接口说明的DLL函数
本文来自qingye2008所发的此帖的讨论,感谢陈辉、马云剑、qingye的耐心指点和分享。
1、引言
话说qingye同学得到了一个用于加解密的Dll(该动态库在这里下载),通过Dll Export Viewer看到dll有2个导出函数分别是Dll_EncIn和Dll_EncOut,qingye同学想在VB中使用这两个函数。因为搞不到接口说明,只好通过查看汇编代码来猜测参数数量和类型。通过同学们的一番摸索,大致的过程小结如下:
(1)先用IDA之类的静态反汇编工具看函数的参数有几个、有没有返回值;(确定是两个、没有返回值)
(2)再用OD之类的动态反汇编调试工具看寄存器里存的参数具体是啥,并根据函数的预定功能,来猜测参数应该声明成什么类型的、应该传什么内容。
a) 比如这个函数的功能是加密,那根据功能猜测要传进去的参数至少应该有明文、也可能还有长度。另外函数应该还有个办法来返回加密后的密文,既然函数没有返回值,那有可能还有个传地址的参数是密文。所以,初步猜测应该有两个参数,一个传明文字符串,一个用来接收密文字符串。
b) 用OD跟进去看寄存器里的内容,发现传字符串“123”,寄存器里写的是“03313233”;再传字符串“123123”,寄存器里写的是“06313233313233”。这就可以确定,这个参数是字符串,字符串的编码是ANSI的(因为&H31是数字1的ANSI编码),字符串缓冲区之前的首字节是这个ANSI字符串的字节长度。
c) 考虑到这是个用Delphi实现的动态库,所以查阅Delphi的相关文档,确认Delphi中有一种叫做Short String的字符串符合b)里描述的特征,所以印证了这种猜测。
d) 两个参数,是密文在前还是明文在前呢?根据OD观察的结果,并且记住第一个参数后入栈,可以确定是密文在前,明文在后。
(3)根据以上猜测构造在VB里的声明。这就要用到这篇博文和这篇博文里提到的知识了。
2、传结构指针
先来看陈辉写的代码,我觉得是最好最简捷的写法了。
Option Explicit
Private Declare Function Dll_EncIn Lib "d:\EncryptionA.dll" (ByVal lpstrOutput As Long, _
ByVal lpstrInput As Long) As Long
Private Declare Function Dll_EncOut Lib "d:\EncryptionA.dll" (ByVal lpstrOutput As Long, _
ByVal lpstrInput As Long) As Long
Private
相关文档:
VB中 Replace 函数
描述
返回字符串,其中指定数目的某子字符串被替换为另一个子字符串。
语法
Replace(expression, find, replacewith[, compare[, count[, start]]])
Replace 函数的语法有以下参数:
参数 描述
expression 必选。字符串表达式,包含要替换的子字符串。
find 必选。被搜索的子字符串。
......
这段时间在移植项目的过程中,起初我想判断一个字符串中是否存在某字符(串),直接的使用方法是用instr(start,string1,string2,VB compare),但经过分析在VB中可以只用一下方法来判断!
1.常用的INStr方法
Function InStr([Start], [String1], [String2], [Compare A ......
使用c#语言在.net平台生成的dll是基于MSIL的二进制代码,通常情况下是无法被native的语言和程序调用的(例如vb,vc,delphi)。但是一般来说windows上native的程序都是可以直接使用com对象的。通过.net平台提供的一些工具,可以为其伪造一个com接口并注册到系统中。此时,可以在native的程序里,通过这个伪com接口来实现此. ......
就这么一个函数就解决了那位仁兄3天多的工作
唉~!真被一个函数玩死了
这里顺便帖出来吧
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Microsoft.VisualBasic.Shell( ......
Private Declare Function InternetSetCookie Lib "wininet.dll" Alias "InternetSetCookieA" (ByVal lpszUrlName As String, ByVal lpszCookieName As String, ByVal lpszCookieData As String) As Boolean
Private Declare Function InternetGetCookie Lib "wininet.dll" Alias "InternetGetCookieA" (ByVal lpszUrlName ......