现在的位置: 首页 > 综合 > 正文

没有头文件怎么用别人的dll

2018年07月08日 ⁄ 综合 ⁄ 共 3422字 ⁄ 字号 评论关闭

最近搞个程序,用到md5加密,结果看了几个md5加密后,相同的数据结果不同,郁闷了!后面找到一个别人的加密程序算的结果一样,还好它里面算法是用dll实现的,呵呵!借来用了!
     先用od把它载入,然后查看可执行模块,选择我们的程序,右键查看名称,找到里面MD.dll导入的几个函数的地方,里面支持md2,md4,md5.我只要md5了,右键在每个参考上设置断点,运行,找到计算md5的地方,让它调用md5函数,od断下

 断到这里
004520CF   .  68 6ED94500   push    0045D96E                         ;  ASCII "sfddfdsfsdf"
004520D4   .  50            push    eax
004520D5   .  68 6EF14500   push    0045F16E
004520DA   .  E8 D34E0000   call    <jmp.&MD.MD5>

从call 的地方看.前面3个push是参数了.
函数的基本原型应该可以这样定义 int md5(参数1,参数2,参数3)  (一般dll的导出函数都遵循从右到左压参)
现在就是来查清楚每个参数对应的是甚么了.
004520CF   .  68 6ED94500   push    0045D96E                         ;  ASCII "sfddfdsfsdf"
从od给的提示看,很明显参数3对应的是 原字符串的地址
004520D4   .  50            push    eax
我们看eax 寄存器存的是甚么?  其内容是 0000000B (正好是原字符串长度),基本确定参数2就是参数3的长度了
004520D5   .  68 6EF14500   push    0045F16E
这个是个内存地址,在od的数据窗口里面,选中这个地址段,看到的数据是乱码.(怀疑应该是返回值)
0045F16E  C6 B9 90 85 27 A3 D3 74 45 8A 9C 3F 2B 07 B4 C1  乒悈'StE姕?+戳
F8单步跟踪,同时查看 0045F16E  地址的内存数据变化
0045F16E  4E BC CE 0B F5 73 0E E0 53 68 91 A3 47 3A A5 06  N嘉 鮯郤h懀G:?
看内容变化,基本确定是返回值了!
现在函数原型我们就基本确定了!
int md5(char* reback,int len,char* input);
 基本来说这边的事情已经就完成了.
现在可以搞程序了
在程序里面先定义函数指针类型
typedef int (_stdcall *MYMD5)(char* reback,int len,char* input);
开始调用dll
HMODULE hDll = NULL;
MYMD5 md5 = NULL;
hDll = ::LoadLibrary("md.dll"); //载入dll
if (hDll)
{
   md5 = (MYMD5)::GetProcAddress(hDll,(LPCSTR)4);//载入函数
                          //在md.dll里面md5函数的编号是4,用工具DEPENDS.EXE可以查看dll的导出函数名和编号
   if (md5 == NULL)
   {
       return FALSE;
   }
  }
//................
//这里中间就可以使用 函数md5了
//....................
if (hDll)
    ::FreeLibrary(hDll);//最后释放dll

记录:

我只有一个dll文件,请问怎么样才能得到这个dll文件所对应的lib文件?用工具也行。

如题

有难度
up~一下吧!

很抱歉,您的要求不能实现。

是根本实现不了吗?这是不可能的吗???

强烈关注中!

绝对可以实现
首先用 dumobin.exe 文件分析出你这个 .dll的输出文件,形成文件 .def
然后用lib.exe命令就可以了。

http://support.microsoft.com/default.aspx?scid=KB;en-us;q131313

别人告诉我的一个网址,还没有看懂呢

错,是dumpbin.exe
为什么能实现呢?因为原理很简单,.def文件通过 lib.exe 命令能够形成 .lib文件。
而 .def文件的形成是不需要函数参数的,它只需要函数名就可以了
而 .dll的输出函数名是可以通过 dumpbin.exe文件分析出来的。

lib文件是在把源代码编译成.dll的同时产生的。
如果你只有.dll没有源代码,等于就是没戏了。
不过这是对传统的dll而言。
假如你手上的是一个 ATL COM 组件 DLL 的话,情况就不同了,
你把它导入VC,你就明明白白了。

dumpbin.exe是VC自带的工具吗?如果不是的话我到那里去找?

http://www.chinaok.com/share/showarticle.php?articleid=1608

to every_one(真菜鸟) :
我说的那两个文件只要你是完全安装的 visual studio就一定存在。默认是在下面的目录里面
"C:\Program Files\Microsoft Visual Studio\VC98\Bin\LIB.EXE"
"C:\Program Files\Microsoft Visual Studio\VC98\Bin\DUMPBIN.EXE"

没有用过
up

to:StdAfx(任杰) 
文件我已经找到了,正在研究,这个分给定你了

这个程序绝对值得认真研究的。
很多的大型商业软件的基本架构就是这个程序。

我上面那个发错了。
还以为是我回复的关于怎么写一个类VB界面的那个问题呢。
你仔细研究吧。如果有什么问题,只管问。

to StdAfx(任杰) 
 你说的那两个文件怎么用啊

去这个网页看看:

http://www.chinaok.com/share/showarticle.php?articleid=1608

dumpbin /exports nomal.dll > nomal.def
生成的def文件里面怎么什么都没有呀
Microsoft (R) COFF Binary File Dumper Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
Dump of file nomal.dll
DUMPBIN : fatal error LNK1181: cannot open input file "nomal.dll"
to: StdAfx(任杰) 这是为什么?

DUMPBIN : fatal error LNK1181: cannot open input file "nomal.dll"
上面的提示很清楚了,你在那个目录根本就没有 normal.dll文件的嘛。
请拷贝到那个目录或者指明路径(绝对或者相对路径都行)

UP it

C:\Program Files\Microsoft Visual Studio\VC98\Bin>lib /def: nomal.def
Microsoft (R) Library Manager Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
nomal.def : fatal error LNK1136: invalid or corrupt file
提示这个呀,我按照every_one 提供的地址看得那篇文章做的,可是老是出错。

normal.def文件里面只能保留输出函数的函数名
别的通通删除。
明白了没有?

dumppe -disasm %1.dll > disasm.txt
可以看到代码的。(asm 的哈)

收藏下次再看.

我还想问问,如果没有头文件我可以调用里面的函数吗?

to iris_zhu(个个) :
如果没有头文件的话,那么我们面临的最大难题是如果函数的参数或者返回值是一个很复杂的结构(就是说不是简单的数据类型),那么我们很难分析出来。而且即使是简单的数据类型,如果我们没有他们的说明的话,我们也很难知道每个参数究竟代表什么意思。
所以如果没有头文件的话,我们得在汇编级上去进行分析,这个难度实现很大,很不容易成功。

抱歉!评论已关闭.