首页 > 编程知识 正文

my crack,积分规则说明

时间:2023-05-06 13:05:39 阅读:174089 作者:4218

公司内部通信使用内部网(以下简称NWT ),具有可以在登录点交换名字后的皇冠等有趣的功能。 在3.4.3035版本更新之前,他的兑换机制还很合理,5000分就可以换铜冠,所以在网通聊天榜上很多人的名字后面都戴着皇冠。 (强制)升级到3.4.3035后,需要用前10倍的积分兑换) (嗯,物价暴涨! 请参阅。 更重要的是,以前的画笔点插件已失效。 上帝一关门,窗户一定会为你打开。 网通的作者可能也觉得到达铜冠太难了。 于是,他提供了RMB播放器的解决方案---你可以购买积分。 下图:

另外,作者还开设了网店,通过扫描二维码进入作者的网店消费。 这样可以得到一些可怜的积分。 看看软件的作者手头,有需要摇钱树功能的软件.

本着不断人财富的初衷,本文只提供逆向思维,不公开逆向方法。 这也是许多逆向论坛的一贯做法。 以下开始正文。 首先检查外壳,diewin使用NWT的主程序ShiYeLine.exe (营业线? 作者想表达什么意思? )没有添加shell,而是由vs2008编译生成。

不沾壶,又是用C写的,这个软件就像一个可以捏的软柿子。

NWT本身有很多窗口,都是在vs2008中生成的,所以我们决定先在spy中收集窗口和控件信息。 结果,通过可以收集控制信息,可以大幅节约分析的时间。 但是很遗憾,spy只能捕获对话框信息,无法捕获对话框上的任何控件。 这意味着作者可能没有使用标准控件,而是在对话框中呈现Button、Edit等控件。

最初,因为想修改总积分,所以在Cheat Engine上搜索试图修改总积分,但竟然成功了:

但是,在CE中找到的总点往往位于NWT的消息吉鲁中,响应OnCopy消息时,总点地址会包含在消息主体中。 可以修正,但有一半的概率修正失败。 因此,我放弃了这种方式,根据错误提示确定并分析NWT生成验证码的代码:

添加NWT点数的规则是,点击试试手气,弹出“试试手气”对话框。 对话框中包含二维码,用手机扫码,进入作者的网店; 另外,手机上显示4位验证码。 在“试试看”的Edit框中输入这一组验证码,验证正确的NWT会随机添加较少的可怜点。 验证失败了。 出示无效的认证码。

一开始,我怀疑NWT在打开“养成习惯”对话框之前会生成验证码并将其发送给服务器,但是抓住包没有任何成果。 好像没有顺利进行的方法。 我只能把NWT拖进dddcs进行分析。 dddcs加载完成后,在Functions window中看到NWT导出了很多函数名称。

在百度上调查这些函数名后,NWT使用xsdxy框架实现了UI部分。 xsdxy的设计者将对话框的布局设置为xml文件,以便可以轻松地在各种资源之间切换。 xml文件指定了创建对话框时要加载的字符串/图像。 “试用”对话框的xml文件位于安装目录RESshiye line _ layout _ scan code dialog.XML中。

sindialogdefaultwidth=' 375 ' default height=' 520 ' caption=' ids _ scan _ code ' animation=' sizechange ' icon=' ' alignparenttop=' 50 ' text=' ids _ scan _ code _ ttop skinrelativelayoutid=' 106 ' layout width=' 300 ' layout heighet ntalcenter 17 ' skinimageviewid=' 102 ' layout width=' wrap content ' layout height=' wrap content ' alignparenthorizontalcentalcent 103 ' layout height=' 28 ' alignparentleft=' 25 ' alignparentright=' 25 ' tobottomof 17 ' text=' ids _ scan _ code _ code skinedit viewid=' 104 ' layout height=' 28 ' alignparentleft=' 75 ' alignparentright=' 75 ' tobottomof=' 103,10 ' 10 ' 10 '

arentLeft="75" AlignParentRight="75" ToBottomOf="104,3" FontColor="ID_COLOR_RED"/></SkinDialog>

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

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

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

bp 0142ad20 "as /mu $ustr poi(@esp+4);.block {r @$t0=$scmp(@"$ustr",@"dbgstr");.if(@$t0==0){};.else{gc;}}"

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

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

00 00d5e834 01438d9c 75012494 04519e38 00d5e8a4 ShiYeLine!CPaintHelper::operator=+0x408001 00d5e864 014211e3 75012494 00d5e8c0 04519e38 ShiYeLine!CPaintHelper::DrawTextW+0x9c02 00d5e904 01419392 75012494 01a0865c 04519bf0 ShiYeLine!CSkinTextView::DrawForeground+0x10303 00d5e974 01341432 00000001 022093b9 036fb048 ShiYeLine!CSkinView::RedrawView+0x35204 00d5eaa8 0140fc15 0000040b 00000068 08521048 ShiYeLine!CSkinView::GetClientRect+0x131205 00d5eae4 0142720b 0000040b 00000068 08521048 ShiYeLine!CSkinWndHost::WindowProc+0x16506 00d5eb00 74bebe6b 00140d1e 0000040b 00000068 ShiYeLine!CPaintHelper::operator=+0x56b07 00d5eb2c 74be833a 014271e0 00140d1e 0000040b USER32!AddClipboardFormatListener+0x49b08 00d5ec14 74be7bee 014271e0 00000000 0000040b USER32!DispatchMessageW+0x97a09 00d5ec90 74be79d0 d558274a 00d5ecdc 013ff241 USER32!DispatchMessageW+0x22e0a 00d5ec9c 013ff241 00d5ecbc 04523920 00d5ed30 USER32!DispatchMessageW+0x100b 00d5ecdc 01344c2c 0027065c 022096d1 036fbcc0 ShiYeLine!CSkinDialog::DoModal+0xe10c 00d5f580 0140faf9 00000193 044fa1f0 00000111 ShiYeLine!CSkinView::GetClientRect+0x4b0c0d 00d5f5b4 0142720b 00000111 00000193 044fa1f0 ShiYeLine!CSkinWndHost::WindowProc+0x490e 00d5f5d0 74bebe6b 0027065c 00000111 00000193 ShiYeLine!CPaintHelper::operator=+0x56b0f 00d5f5fc 74be833a 014271e0 0027065c 00000111 USER32!AddClipboardFormatListener+0x49b10 00d5f6e4 74be7bee 014271e0 00000000 00000111 USER32!DispatchMessageW+0x97a11 00d5f760 74be79d0 d558274a 00d5f7a8 013ff241 USER32!DispatchMessageW+0x22e

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

 

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

.text:014BF6E0 sub_14BF6E0 proc near ; CODE XREF: sub_1341350+76↑p.text:014BF6E0 .......text:014BF6FA ; ---------------------------------------------------------------------------.text:014BF710.text:014BF710 loc_14BF710: ; CODE XREF: sub_14BF6E0+29↑j.text:014BF710 ; __unwind { // 14BF73C ; wchar_t *.text:014BF710 push eax.text:014BF711 push ecx ; wchar_t *.text:014BF712 call __wcsicmp.text:014BF717 add esp, 8.text:014BF71A test eax, eax.text:014BF71C jz short loc_14BF726.text:014BF71E xor al, al .......text:014BF726 ; ---------------------------------------------------------------------------.text:014BF726.text:014BF726 loc_14BF726: ; CODE XREF: sub_14BF6E0+3C↑j.text:014BF726 push 1.text:014BF728 mov eax, offset dword_19FFBA0.text:014BF72D call sub_14BEB80 ........text:014BF780 ; } // starts at 14BF770.text:014BF786 cmp dword_19FFD48, 0.text:014BF78D jbe short loc_14BF7BF.text:014BF78F call _rand.text:014BF794 cdq.text:014BF795 mov ecx, 32h.text:014BF79A idiv ecx

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

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。