我正在对C ++ dll进行一些逆向工程。 。

读取大多数功能的源代码是没有意义的,
因为原始算法是用C ++编写的,与收到的C代码相差太远了。
br />
即使我尝试通过C编译器编译接收到的C代码-
由于大量语法问题,缺少库等,它也无法运行。 >为简化操作,我现在要执行以下任务:
我只需要直接从dll调用一些必需的函数,
提供我选择的一些参数。

这种方法适用于导出的函数,我从反编译器代码中知道函数的名称
,并且它们的确在dll内有名称。

但是谈到内部(非dll中的函数-
它们在反编译代码中的名称是mo可能与
原始版本有所不同。
或者还有其他聪明的方法可以直接从原始dll直接调用这些函数吗?
如何做到这一点?

评论

您为什么要使用非导出功能?它们由于某种原因未导出。为什么导出的功能不足以满足您的目的?

@peterferrie这是ReverseEngineering.SE,而不是StackOverflow; “如果没有记录就不要这样做”或“因为<编码标准>而不要这样做”或“如果不希望被称为您不应该打电话”之类的东西不在这里,不要你不觉得吗如果我们要遵守规则,我们最好还是说“如果程序已打包,那么您就不应该对它进行反向工程”并拧紧它。

@AcidShout,您从我的要求中推论出太多,得出了完全错误的解释。我并不是说不应该使用它们。我只是问为什么导出的功能不足,因为不打算使用未导出的功能。

#1 楼

首先想到的是以下方法


使用您喜欢的调试器/反汇编器定位该函数并记下标识该函数的唯一字节模式(类似于IDA的Flirt签名的排序)
获取DLL的句柄(GetModuleHandleA)
获取图像大小(使用GetModuleInformation从MODULEINFO.SizeOfImage)
搜索您的唯一模式(句柄+ i memcmp)
将找到的地址分配给函数指针
调用函数


#2 楼

我认为修补导出表的最佳方法是将导出的名称指向所需的功能。 (甚至扩展所需功能的导出)。抱歉,我无法提供工具名称,这可以使此名称

#3 楼

如果您具有用于DLL的符号文件,或者该文件是使用调试信息构建的,则可以恢复未导出函数的原始名称。如果不是,那么可能不会。由于不导出未导出的函数,因此不需要保留原始函数名称。 DLL中的代码知道如何通过地址调用这些函数,因此它不需要更多信息。