找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 10985|回复: 8

[开源] 取dll所有输出函数名

 火.. [复制链接]

1214

主题

352

回帖

11

精华

管理员

菜鸟

积分
93755

贡献奖关注奖人气王精英奖乐于助人勋章

发表于 2011-7-31 02:03:19 | 显示全部楼层 |阅读模式
取得某一dll所有输出函数名来源:考试大
  在uses里加上ImageHlp

  1. procedure ListDLLFunctions(DLLName: string; List: TStrings);
  2. type
  3.   chararr = array[0..$FFFFFF] of Char;
  4. var
  5.   H: THandle;
  6.   I,
  7.     fc: integer;
  8.   st: string;
  9.   arr: Pointer;
  10.   ImageDebugInformation: PImageDebugInformation;
  11. begin
  12.   List.Clear;
  13.   DLLName := ExpandFileName(DLLName);
  14.   if FileExists(DLLName) then
  15.   begin
  16.     H := CreateFile(PChar(DLLName), GENERIC_READ, FILE_SHARE_READ or
  17.       FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  18.     if H <> INVALID_HANDLE_VALUE then
  19.     try
  20.       ImageDebugInformation := MapDebugInformation(H, PChar(DLLName), nil, 0);
  21.       if ImageDebugInformation <> nil then
  22.       try
  23.         arr := ImageDebugInformation^.ExportedNames;
  24.         fc := 0;
  25.         for I := 0 to ImageDebugInformation^.ExportedNamesSize - 1 do
  26.           if chararr(arr^)[I] = #0 then
  27.           begin
  28.             st := PChar(@chararr(arr^)[fc]);
  29.             if Length(st) > 0 then
  30.               List.Add(st);
  31.             if (I > 0) and (chararr(arr^)[I - 1] = #0) then
  32.               Break;
  33.             fc := I + 1
  34.           end
  35.       finally
  36.         UnmapDebugInformation(ImageDebugInformation)
  37.       end
  38.     finally
  39.       CloseHandle(H)
  40.     end
  41.   end
  42. end;

  43. procedure TForm1.Button1Click(Sender: TObject);
  44. var
  45.   List: TStrings;
  46.   I: integer;
  47.   S: string;

  48. begin
  49.   List := TStringList.Create;

  50.   ListDLLFunctions(&#39; c: windowssystemAbcsda.dll&#39; , List);
  51.   showmessage(inttostr(list.count));
  52.   S := &#39; List of functions&#39; ;
  53.   for I := 0 to List.Count - 1 do
  54.     S := S + #13#10 + List[I];
  55.   ShowMessage(S);

  56.   List.Free
  57. end;

复制代码
  //rock
来源:http://www.examda.com/ncre2/Delphi/zonghe/20090914/081347578.html
【VB】QQ群:1422505加的请打上VB好友
【易语言】QQ群:9531809  或 177048
【FOXPRO】QQ群:6580324  或 33659603
【C/C++/VC】QQ群:3777552
【NiceBasic】QQ群:3703755

0

主题

29

回帖

0

精华

铜牌会员

积分
112
发表于 2011-7-31 16:57:17 | 显示全部楼层
你取到了DLL输出函数名了吗?

0

主题

29

回帖

0

精华

铜牌会员

积分
112
发表于 2011-7-31 16:59:22 | 显示全部楼层
\

感觉这份代码莫名其妙。

0

主题

29

回帖

0

精华

铜牌会员

积分
112
发表于 2011-7-31 17:02:22 | 显示全部楼层
有空我来传一份真正的取DLL输出函数名的delphi代码上来。

0

主题

29

回帖

0

精华

铜牌会员

积分
112
发表于 2011-7-31 17:03:46 | 显示全部楼层
我觉着在这个论坛,Delphi版块很不专业。

47

主题

265

回帖

8

精华

核心会员

积分
10349
发表于 2011-8-2 23:21:47 | 显示全部楼层
wofan 发表于 2011-7-31 17:03
我觉着在这个论坛,Delphi版块很不专业。

这于DELPHI关系不大吧,对PE结构的熟悉程序关系大点。

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2011-8-3 16:16:26 | 显示全部楼层

RE: 取dll所有输出函数名

naylon 发表于 2011-7-31 18:20
这个还是论坛比较冷清,多数人都集中在WIN32内核板块、VB板块。
另外取DLL导出函数的话有个简单的偏方: ...

好像不是【空格】。。。是NULL吧。。。

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2011-8-7 18:58:14 | 显示全部楼层
naylon 发表于 2011-8-7 13:07
好吧我写错了~记事本打开0x20和0x00没区别。。

用notepad++能看到区别。

30

主题

693

回帖

0

精华

钻石会员

积分
2815
发表于 2015-4-9 09:15:19 | 显示全部楼层
代码很不错哦
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表