我使用Madshi的madCodeHook组件在进程中注入DLL,然后挂钩一个过程/函数。问题是每次出现新版本的EXE时,功能的地址都可能发生变化。目前我的方式是使用Ollydbg,然后硬编码我注入到进程中的DLL中的地址,这是非常难看和不安全的。只是想知道如果我能动态地知道程序的定义,是否有办法。
请注意,这不是出于恶意,我只是在目标EXE中挂了几个程序用于记录目的。
答案 0 :(得分:4)
如果函数本身没有改变(很多)你可以搜索你需要的代码(搜索操作码或十六进制字节)或者使用Madshi的disasm单元用于相同的目的。
答案 1 :(得分:3)
如果你没有合作,那么就没有简单的方法可以做你需要的了。
通常,这种合作以模块的导出表的形式出现,但它也可能来自提供API的程序,用于询问其功能的地址。
即使您为钩子程序的每个版本更新DLL,仍然无法保证您的代码能够正常工作。你所做的正是address space layout randomization应该防范的那种事情。每次运行程序时,程序都可能会加载到不同的地址。
我认为你最好的选择是,如果你能以某种方式自动化你用来在Ollydbg中找到函数的任何进程。然后,您可以将其合并到您的DLL中,以便它可以搜索函数本身。
答案 2 :(得分:0)
这取决于。默认情况下,Delphi编译为本机机器代码。在大多数情况下,没有像这样的元数据。 (很多人认为这是一个安全功能;它使人们无法完成你在这里尝试做的事情,这可以用于恶意目的。)但是任何有RTTI的方法都会在RTTI表中有它的地址。这包括所有已发布的方法,以及D2010和Delphi XE中的所有公共方法(默认情况下,至少)。可以读取这些RTTI表,但需要很多低级知识才能找到它们。
此外,某些程序在安装文件夹中附带了各种各样的映射文件,或作为资源嵌入,以便在出现问题时进行错误报告。如果这个程序有一个,你可以找出它的格式,你可以从那里获得方法地址。
答案 3 :(得分:0)
如果您使用的是dll,可以在dll中使用getprocaddress来检索函数的地址