Crack内 通积分规则(基于版本3.4.3035)

没加壳,又是c++写的,看来这软件是个可以捏的软柿子。

起初,我只是想修改总积分,所以尝试用Cheat Engine搜索并修改总积分,居然还真改成功了:

但是通过CE找到的总积分往往都在NWT的消息循环内(响应OnCopy消息时,总积分地址包含在消息体中),虽然可以修改,但有一半的概率会修改失败,所以我放弃了这种方式,转而根据错误提示来定位和分析NWT产生验证码的代码:

    起初我怀疑NWT弹出”试试手气”对话框前会生成并发送验证码给服务器,然而,我抓包后并没有什么收获。看来没有什么取巧的办法了,我只能把NWT拖进IDA进行分析。当IDA加载完毕后,在Functions window中看到NWT导出了一堆函数名:

百度一下这些函数名发现,原来NWT用了ShinUI框架实现UI部分。ShinUI的设计者本着方便切换各种资源的目的,将对话框布局做成xml文件,xml文件中规定了创建对话框时需要加载哪些字符串/图片,而”试试手气”对话框的xml文件位于安装目录resShiYeLinelayoutScanCodeDialog.xml中:

xml中节点,对应了验证码出错时显示的”无效的验证码。”这句话。根据我反反复复调试NWT积累的失败经验,我确定NWT为了显示这句话,必须调用CSkinTextView::DrawForeground在对话框上绘制字符串。而CSkinTextView::DrawForeground又会依次调用CPaintHelper::DrawTextW和User32!DrawTextW进行绘制。切入点出现了!DrawTextW的第二个参数是字符串参数,如果我设置条件断点,比较字符串参数的内容是否为指定字符串,如果是就中断到调试器再参看调用堆栈,那么一定能定位到比对字符串的代码的附近。

前面我也说过ShinUI设计为方便开发者替换各种资源,包括字符串资源。在调试过程使用中文字符串往往会出错,所以,我定位到安装目录下resShiYeLinevaluestring.xml(这是ShinUI规定的字符串表)中IDS_SCORE_CODE_INVALID的值,将其从”无效的验证码。”替换为”dbgstr”。再次启动NWT,并输入错误的验证码,就会提示dbgstr字样:

现在可以附加windbg并添加条件断点了:

附注:地址0142ad20是NWT内部函数sub_142AC30调用DrawTextW的地址,关于条件断点的设置,可以参考我博客中的相关文章。

    再次输入错误的验证码,程序中断后得到下列调用堆栈:

借助调用栈中的返回地址(第3列),依次查看该地址所在的函数,终于在frame 3#中找到加载字符串”IDS_SCORE_CODE_INVALID”的线索

这段代码中我圈了3个call指令:第1个call,比较输入的字符串长度是否为4;第2个call,比较输入的字符串是否是NWT生成的目标字符串;第3个call,前一次比较失败时,加载字符串”IDS_SCORE_CODE_INVALID”。由此可知,第二个call是关键所在,进入该函数会看到它前后调用了__wcsicmp用于比较输入和_rand用于产生积分:

根据这段代码,我们还能顺藤摸瓜,找到NWT产生的验证码,不过对于Cracker来说这已经不重要,完全可以patch产生积分的代码。当然,怎么做我就不公布了,我输不起官司~

 

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2019年1月6日
下一篇 2019年1月6日

相关推荐