由于评论历史太长,因此将其作为答案。
有问题的类的源代码似乎有一个函数void GenerateKey(BigTwistedEdwards *math, IRandom *prng, Leg *key)
可以在Leg
类中创建密钥。我认为这是用 key=new Leg 在某处创建的,所以它不会是一个单一的地址。(实际上,Leg
可能是 auint32
或 a uint64
,并且Leg *key
是指向这些整数值数组的指针)。
也许,如果您GenerateKey
在二进制文件中找到该函数,您可以添加一些对CreateFile
,WriteFile
并CloseFile
在其末尾的调用以获取密钥,并且可执行文件检测是否存在调试器,但不检测可执行文件本身是否存在被修改。
似乎KeyAgreement.cpp
是保存该GenerateKey
功能的文件。它会生成一个密钥,直到do .. while
循环找到可接受的密钥,因此该do .. while
循环的结尾是您想要放置断点的位置(如果您可以调试可执行文件)或添加对将密钥写入文件的函数的调用。
现在,我们需要GenerateKey
在可执行文件或其 DLL 之一中找到该函数。您可以使用任何列出 DLL 导出的工具,希望其中一个 DLL 可以导出KeyAgreementCommon::GenerateKey
. 如果幸运的话,您会在那里找到它,然后就大功告成了。Dependeny Walker是一个很好的工具。
假设该函数被编译到主 .exe 或 .dll 中但未导出,则有点困难。幸运的是,它KeyAgreement.cpp
保存了一堆带有非常不同签名的漂亮字符数组,它们应该是唯一的并且很容易找到。您可以尝试以下方法之一:
接下来,您想知道这些字节的使用位置。最简单的方法是将您认为正确的文件加载到Ida Pro 中,在那里找到您的字符数组,然后检查 XREF。应该只有其中之一,来自KeyAgreementCommon::InstantiateMath
. KeyAgreementCommon::GenerateKey
如果您的开发人员没有更改源代码,则此后的功能应该是。
如果他们确实更改了源代码,也许他们会稍微调整一下功能。(也许他们决定除了 384 位版本之外不想使用任何东西,所以他们丢弃了 256 位和 512 位数组。这就是我说搜索所有 3 个数组的原因。)现在我们想要找到GenerateKey
当我们只知道函数时InstantiateMath
函数。
幸运的是,它们都在.hpp文件中被声明为公开的。这意味着它们应该出现在类 vtable 中的某个地方。检查 Ida 以获取对该InstatiateMath
函数的数据 x 引用。这应该是 vtable 条目。同一个 vtable 应该保存Initialize
和GenerateKey
函数的地址,所以检查引用旁边的函数InstantiateMath
。