没加壳,又是c++写的,看来这软件是个可以捏的软柿子。
起初,我只是想修改总积分,所以尝试用Cheat Engine搜索并修改总积分,居然还真改成功了:
但是通过CE找到的总积分往往都在NWT的消息循环内(响应OnCopy消息时,总积分地址包含在消息体中),虽然可以修改,但有一半的概率会修改失败,所以我放弃了这种方式,转而根据错误提示来定位和分析NWT产生验证码的代码:
起初我怀疑NWT弹出”试试手气”对话框前会生成并发送验证码给服务器,然而,我抓包后并没有什么收获。看来没有什么取巧的办法了,我只能把NWT拖进IDA进行分析。当IDA加载完毕后,在Functions window中看到NWT导出了一堆函数名:
百度一下这些函数名发现,原来NWT用了ShinUI框架实现UI部分。ShinUI的设计者本着方便切换各种资源的目的,将对话框布局做成xml文件,xml文件中规定了创建对话框时需要加载哪些字符串/图片,而”试试手气”对话框的xml文件位于安装目录resShiYeLinelayoutScanCodeDialog.xml中:
xml中
前面我也说过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进行处理,非常感谢!