怎样获得一个DLL中未导出函数的地址

reggiekiller 2010-10-11 08:10:41
不知道有没有发错地方。。。
现在我自己编写了一个简单的DLL,导出了一个函数f1,另一个函数f2未导出
怎样实现获得这个DLL的f2函数的地址呢?
我看了一些inline hook的知识,不知道行不行
...全文
871 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
wonsea 2010-10-25
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 x396448534 的回复:]

引用 15 楼 xrongfu 的回复:
写个提供那个函数地址的函数,或者算相对于基址的函数偏移

这是如何做到的
[/Quote]

做插件架构时经常用到这方法


你的函数里面必须导出一个工厂接口:

DWORD_PTR CreateInterface(DWORD dwParam)
{
DWORD_PTR dwInterface = 0;
switch (dwParam)
{
//
// 根据你的需要传出函数地址或者对象地址
}

return dwInterface; // 既然是你自己设计的插件,这个dwInterface是什么都无所谓,你自己定义;但是要注意一点:这个函数最好可扩展,并且通用,并且长时间使用不做修改
}
x396448534 2010-10-24
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 xrongfu 的回复:]
写个提供那个函数地址的函数,或者算相对于基址的函数偏移
[/Quote]
这是如何做到的
YFLK 2010-10-19
  • 打赏
  • 举报
回复
可以的,把地址封装到一个可导出的函数中,类似回调函数的方法
Rainqin123 2010-10-17
  • 打赏
  • 举报
回复
导出都没到处,怎么可能获取撒??
做鸡真好吃 2010-10-15
  • 打赏
  • 举报
回复
就喜欢看时间充裕的人。
xrongfu 2010-10-15
  • 打赏
  • 举报
回复
写个提供那个函数地址的函数,或者算相对于基址的函数偏移
「已注销」 2010-10-14
  • 打赏
  • 举报
回复
当然可以,写个提供那个函数地址的函数就可以了。
  • 打赏
  • 举报
回复
PE格式文件
zhaohongbo83 2010-10-13
  • 打赏
  • 举报
回复
未导出的函数,怎么获得函数地址?
不可能吧!
aj3423 2010-10-13
  • 打赏
  • 举报
回复
比如函数起始几个字节是
55 8b ec 6a ff 68 xx
就在dll模块搜索这个这几个字符,就是函数地址
aj3423 2010-10-13
  • 打赏
  • 举报
回复
当然也可以通过动态的特征码搜索来定位这个函数
信阳毛尖 2010-10-13
  • 打赏
  • 举报
回复
lz干嘛不导出来呢,不导出来函数地址是获取不到的
aj3423 2010-10-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lisunlin0 的回复:]

要么导出,要么使用一个辅助函数得到函数地址。

[/Quote]
顶,自己写的dll就可以这样
sunlin7 2010-10-12
  • 打赏
  • 举报
回复
没有什么特别好的办法。每次编译DLL都可能使函数的地址变化,每次加载DLL,都可能在不同的地址上面。

要么导出,要么使用一个辅助函数得到函数地址。

不然的话,对于编译后的dll文件,通过编译时的map文件或者手工反汇编,得到固定的相对于基址的函数偏移,使用时通过基址+偏移来得到函数地址。
reggiekiller 2010-10-11
  • 打赏
  • 举报
回复
这是dll的源码
// Name.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
CHAR Name[50] = {0};
PCHAR GetName(void)
{
return Name;
}
extern "C" __declspec(dllexport) BOOL WINAPI SetName(PCHAR NewName)
{
PCHAR OldName = GetName();
if (strcmp (OldName, NewName) == 0) // invalid name
{
return FALSE;
}
else if (strlen (NewName) >= 256) // invalid len
{
return FALSE;
}
strcpy (Name, NewName); // set name

return TRUE;
}
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{

case DLL_PROCESS_ATTACH:
{
OutputDebugString("NameDll: dll attach");
SetName("aaaa");
}
}
return TRUE;
}
ayw215 2010-10-11
  • 打赏
  • 举报
回复
no way。。。
reggiekiller 2010-10-11
  • 打赏
  • 举报
回复
no。。。。
傻X 2010-10-11
  • 打赏
  • 举报
回复
应该是不行的,楼主可以用depends查看DLL地址,没有的就没办法了
killbug2004 2010-10-11
  • 打赏
  • 举报
回复
没有导出 貌似无法利用PE格式文件 
找到函数特征 二进制匹配搜索定位
visualwind 2010-10-11
  • 打赏
  • 举报
回复
无法获得未导出的函数地址
本工具可以列出所有指定DLL文件中的所有导出函数和他们的虚拟内存地址。你可以很方便地复制所需函数的内存地址,粘贴到你的调试器中,并在这个内存地址中设置断点。当这个函数被调用时,调试器将会在函数开始时中断。例如:如果你想在每次显示信息对话框时进行中断,只需把断点设置在信息对话框函数的内存上:MessageBoxA, MessageBoxExA, 和MessageBoxIndirectA (对于Unicode程序则是 MessageBoxW, MessageBoxExW, 和MessageBoxIndirectW)。当其中一个信息对话框函数被调用时,你的调试器会在函数入口处中断,这样你就可以查看调用堆栈和倒退到初始化这个API函数的代码中。 DLL Export Viewer不需要任何安装过程或额外的DLL,为了开始使用它,只需运行可执行文件 - dllexp.exe DLL Export Viewer加载时,你要选择下列一个选项: *载入标准系统DLL(user32,kernel32等)中的所有函数:这是默认选项。如果你选择它,会导出Windows标准DLL(kernel32.dll,user32.dll,等等...)中的API函数。 *从指定的DLL文件中加载函数:如果您选择此选项时,您必须在下面的文本框中指定DLL。您也可以使用通配符指定多个DLL文件。如果你要查看你系统所有的API函数,您可以指定类似'c:\windows\system32\*.dll'的表达式 -但我必须提醒你...你会得到一个非常长的列表函数,可能超过五万个函数! *载入以下文本文档(回车分隔)中指定DLL中的函数:如果您选择此选项,指定文本文件应包含一个DLL文件列表中,回车字符(CR-LF)分隔。全部指定的DLL中的导出函数将被加载。 *载入与所选进程关联的全部 DLL 中的函数:这是本程序最有用的工具调试选项。选择你正在调试的进程,之后所以与选定的进程相关的DLL导出函数都会被显示。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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