我喜欢将安全性作为一种爱好,因此我并不经常阅读和玩一些简单的KeyGen游戏,而是喜欢它。可能非常愚蠢,但是如果您能帮助我,我将非常感谢。

直到我使用如下技术反转简单的keygen应用程序之时:


看有关字符串文本的参考信息,以找到有趣的代码区域。
进行键gen钓鱼。
并绕过IsDebuggerPresent检查。

是的,我知道,这确实是基本内容。这是一个与我通常的工作类似的视频:


http://www.youtube.com/watch?v=tJY_Tv7o5bE

仅供学习有时我会尝试撤消我在Windows上购买的一些中小型应用程序,看起来像没有很多保护的简单产品。

这是我两个月前购买的软件,整个安装过程约为50MB 。在这里尝试应用我的基本知识的动机之一是因为我想看看我在keygen中学习的内容是否真的可以在现实生活中工作,我的经验是,由于keygen很小并且很容易找到例程,因此中等软件要难得多你要。 :)

**为了明确起见,我已经获得了该程序的许可,我的目的只是学习和增加我的知识。由于我没有破坏它的商业意图或造成任何损害,因此我不会透露该申请-希望您理解。 **

好,走吧。该应用程序包含一个主要的可执行文件(〜33MB),6个DLL(非常小的DLL,其中一些是libeay32.dll等)和大约90个.xsd文件(XML格式)。我的第一步是尝试确定所使用的编程语言,如果有包装工具,请查看以下屏幕截图:





它确实似乎是在Delphi中开发的,我证实了CFF。另外,没有一节指向包装员查看CFF信息和EXE信息,RDG也说这很干净。但是,RDG发现了IsDebuggerPresent,并指出您可能会看到一种保护软件。但是,我不确定它是否为假阳性。

在我的应用程序中,序列是在这样的字段中输入的:



一旦输入了错误的序列号(长度为30个字符),我会收到如下消息:



我猜这不是MessageBox,或者至少是非常定制的。对于这种消息,我应该在MessageBoxA等处保留断点吗?还是有不同的API?

当我附加到正在运行的应用程序后,以下是屏幕截图:



当我按下“运行”时在OllyDbg上,我得到的是:



这里是SEH链的列表:



这里是可用的“ Windows”,包括我想拆卸,检查并放置断点的Windows:



但是调试失败,请参见下文,请:



是某种保护吗?如何禁用这部分代码,放置断点等?

查看“文本字符串引用”,我只能看到部分消息,而看不到自定义“ MessageBox”上显示的消息。 br />


此外,有很多部分看起来像一条消息,它们会即时完成,例如“ A chave informationata esta”,意思是“他们输入的密钥是”或“查韦不正确n”,表示“键输入错误”。

[img] http://img5.imageshack.us/img5/3382/11ionlyseetextstringsre.png [/ img]

此外,当某些文本未存储为“ TextString”时,我注意到这是应用程序的一部分,相反,我在OllyDbg上依次看到“ char by char”创建了一些字符串(对我来说也不太有用) )。

如果我在这些TextString中的任何一个处定义了断点,则会发生-例外:知道如何绕过它吗?

从这里,我唯一能做的就是将控制权传递给应用程序,一切都结束了。 :(

此外,如果我拒绝将控制权传递给应用程序,而我继续使用F7 / F8,则会得到类似的信息:



它以OllyDbg无法识别的指令结尾。

我还尝试在user32.dll的名称中设置断点,例如GetDlgItemTextAGetDlgItemTextW,因为我认为它们是用于读取输入序列的API数字。奇怪的是它们是导出的,而不是导入,如下所示。这是正常的吗?



一旦我创建了断点并声明进入其中,就可以了再次出现异常,我被迫将控制权再次传递给应用程序和游戏。:(



我认为这可能是一些基本的反调试保护,所以我启用了具有许多选项的“ aadp4olly”和“ Olly Advanced”,但无法解决问题,因此,我不确定问题是什么。

所有帮助和答案都非常赞赏,但请e,请记住,我是一个初学者。

**已更新**

大家好,

感谢您的回答,但是它不能解决整个问题。请查看下面的详细信息。

首先,我通过以下链接更新了PEid数据库:

https://code.google.com/p/reverse-engineering-scripts/ downloads / detail?name = UserDB.TXT

以下屏幕截图演示了PE的详细信息:

http://img444.imageshack.us/img444/8295/16pedetails.png

以下是有关PE部分的详细信息:

对于未打包的二进制文件有些奇怪,对吗?但是我找不到正确的打包程序。

http://img5.imageshack.us/img5/5764/17pesections.png

熵和快速检查说“未打包”,但EP检查点已打包:

http://img571.imageshack.us/img571/6251/18epappearstobepacked.png

以下是找到的原始EP:

http://img12.imageshack.us/img12/990/19originalep.png

RDG Packer Detector指出存在黑曜石保护,但是我想这是一个误报。请参阅解压程序无法识别格式:

解压程序可在此处使用:http://down.52pojie.cn/Tools/Unpackers/

http:// img29 .imageshack.us / img29 / 7 / 20obsidiumunpackingfail.png

此外,用于OllyDB的出色的Ferrit反抗调试脚本还不足以允许我对其进行调试。请参见以下内容:

http://img836.imageshack.us/img836/4352/21ferritantiantidebugis.png

http://img42.imageshack.us/img42/ 8721 / 22ferritantiantidebugis.png

从这里开始,我被迫将控制权交给应用程序,并且失去了对if的控制,正如我在第一篇文章中所展示的。我试图冻结所有线程,仅使主线程保持运行状态,但仍继续失败。

Resource Hacker无法读取Delphi资源:

http:// img812。 imageshack.us/img812/9861/23resourcehackerfailsto.png

即使Resource Hacker FX失败,因为它说使用新版本的Delphi进行编译。

http:// img560。 imageshack.us/img560/7538/24resourcehackerfxfails.png

Delphi反编译器也失败了。首先,我尝试附加到目标:

http://img11.imageshack.us/img11/89/25dedeattachingtotarget.png

分析完成后便找到了类信息:

http://img600.imageshack.us/img600/5935/26dedeloadedtarget.png

但是重要的是“表单”和“过程”,什么都没有找到:

http://img600.imageshack.us/img600/986/27dedeisunabletofindany.png

IDR(交互式Delphi重构器)似乎也没有用,因为目标应用程序是使用Delphi 2011或2012编译的,并且此版本没有定义文件。有建议吗?

再次感谢您的帮助和努力。

**更新**

评论

Delphi将自己的“消息框”实现为MessageDlg,这很可能是您所看到的。

这是一个很好的第一个问题。希望有人会给出更具体的答案,但是在那之前,您是否看过关于tuts4you的Lena教程?他们从基本开始,但很快就无法击败代码保护。

@amccormack:我很想投票关闭,但后来决定对其进行编辑。您仍然可以在修订历史记录中看到它的状态,真是令人遗憾。

您可以减少图像数量吗?只需链接到非必需的链接即可。加载需要很多时间。

真的很难告诉您这个问题的具体目标是什么,您应该在帖子末尾总结您的问题并删除一些图片。

#1 楼

看看R4ndom关于使用Delphi二进制文件并破解它们的教程#17:http://thelegendofrandom.com/blog/archives/1472

他描述了如何使用Resource Hacker(我更喜欢XN资源编辑器)以找到用于调用您要查找的对话框的表单的事件处理程序。

了解了您感兴趣的表单后,下载DeDe并将其加载到该应用程序中。 DeDe完成分析之后,单击“表单”选项卡,您将看到与该表单关联的所有事件处理程序(OnClick可能是您在此处查找的内容)。使用事件处理程序的名称,单击“过程”并找到事件,您将看到其地址。



从此处,在OllyDbg中加载应用程序,在您感兴趣的事件处理程序的地址上设置一个断点。这应该使您靠近注册对话框提示您的位置。 R4ndom教程可以从那里描述任何必要的后续步骤。

评论


嗨,米克·格罗夫,谢谢您的回答。有点复杂。请检查我对原始帖子的更新。再次感谢您的所有帮助和努力。最好的祝福。

– Araujo
13年5月9日在23:54

#2 楼

我不确定您的情况是否如此,但是一个常见的反密钥生成/调试技巧是压缩要断点的代码部分,并在运行时覆盖它们。这样,如果在初始加载时修补了int3,则重新加载将重新初始化文本部分并删除断点。

它具有更广泛的应用,但这将是一个简单的应用。

评论


解决此问题的方法当然是使用硬件断点。

– amccormack
13年5月6日19:32

如果存在aslr或其他随机技术,则不会

–RobotHumans
2013年5月6日23:26

好点子。我没想到。

– amccormack
13年5月9日在4:48

大家好,谢谢回答。那么这种情况下的解决方案是什么?根据我更新的原始帖子,您认为这可能适用于我的目标?谢谢。

– Araujo
2013年5月9日23:57

您可以通过更新与keygenme的链接来获得更好的响应。如果我忽略了它,那就说...

–RobotHumans
13年5月10日在0:09



#3 楼

您可以使用IDR(交互式Delphi Reconstractor)在delphi代码RE流程中协助您。

这是一个很棒的工具。

评论


请说明为什么它是一个很棒的工具。答案不仅是为OP写的,而且是为将来可能遇到此问题的所有其他人写的。因此,合理性也将使其对其他所有人也有用。

–asheeshr
13年5月9日在1:59

嗨,Hanan N.,我尝试过,但是由于它是用Delphi 2011或2012编译的,因此对我来说是没有用的。请检查我更新的帖子。非常感谢。最好的祝福。

– Araujo
13年5月9日23:58



自2012年12月29日起,IDR支持Delphi 2011和2012

–user1974
13年5月11日在17:09

@crypto因为在此答案中已经提到IDR,所以最好对其进行注释,然后将信息编辑到该信息中,而不是编写另一个多余的答案。由于您都还没有声誉,我建议您环顾四周,看看是否有什么可以回答的,或者问几个问题。获得50个代表后,您就可以进行编辑和评论。

–asheeshr
13年5月12日在2:04