引言
该出版物旨在研究一些逆向工程技术。 所有材料仅供参考,不得用于任何个人利益。
研究课题
作为示例,我们将研究Atomineer Pro文档代码(以下称为APD)。 这是Visual Studio的插件,旨在自动在源代码中生成注释。 首先,安装此插件并检查其操作。 免费版具有试用期,并且在此期间有许多使用限制。 因此,在向文件添加注释时,会向用户显示一条消息,指出您在一天中只能处理10个文件
当您尝试处理整个项目时,该实用程序将显示一个对话框,警告该命令不可用。
让我们开始吧
首先,在已安装扩展的目录中查找,只有一个动态库。 我们需要它。 我们要做的第一件事是将其从JetBrains上传到dotPeek反编译器。
正如您在屏幕上看到的那样,该库经过混淆器,变量和方法已重命名,并具有诸如a,b,c,d之类的名称……这就是我们所需要的。 我们只是在寻找。 让我们看看可以做什么。
第一部分
首先想到的是找到该行,但是由于搜索功能不在dotPeek中,因此我们采取另一种方式。 我们使用来自Microsoft SDK的标准
ildasm.exe反编译该库。 输出将仅接收一个文本文件。 在其中,我们寻找“
试用模式 ”消息的文本
。 请注意,您的... “
找到了方法
.method家庭hidebysig静态布尔e()文件管理
属于类CmdDocThisScope。 现在回到dotPeek。
所以我们有。 我们发现了一种显示APD试用消息并根据条件返回true或false的方法。 我们找到所有调用此方法的地方
仅找到2个呼叫点,这些是方法CmdDocThisFile :: c和CmdDocThisScope :: c。
通过类的名称和构造函数代码,很明显,这些类负责菜单项,并且“ c”方法的虚拟性表明这是用户选择相应菜单项的事件处理程序(此信息将进一步对我们有用)。 很容易猜到,如果该方法返回true,则即使该命令显示带有警告的对话框,该命令也将被执行。
在CmdDocThisScope :: e方法的开头,变量f递增。 打开“ IL View”窗口,找到命令代码:
维基百科上有一篇
描述这些说明的文章。
接下来,在APD库文件中找到此方法。 我们将使用IDA工具进行此操作。 在带有函数的窗口中,我们将找到我们的方法,并且我们将看到已经熟悉的代码。
选择了ldsfld指令后,我们在Hex View窗口中找到了它的二进制表示形式。
团队的说明确认我们找到了正确的地方。
对该方法的代码和后续步骤的进一步分析不在本文的讨论范围之内。
第二部分
现在,作为已经经验丰富的研究人员,我们找到了一个调用对话框,消息为“
'文档中的所有文档'命令仅在完整版本中可用... ”。此方法为CmdDocThisProject :: c
CmdDocThisProject类负责“处理项目”命令,“ c”方法是虚拟的。 它只包含一件事-它是一个带有消息的对话的调用。 没有条件,没有检查。 搜索源代码会将我们引向CmdDocThisProject :: i方法,该方法具有CmdDocThisProject :: c中的期望值。 现在,在IDA中,我们可以轻松找到必要的方法并可以学习CIL指令
结论
值得一提的是,这篇文章故意留白点供他们独立研究。