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

article/2025/9/14 20:38:40

    公司内部通讯使用内网通(以下简称NWT),他有个好玩的功能:登陆积分可以兑换姓名后的皇冠等。在版本3.4.3035更新前,他的兑换机制还算合理,5000积分可以换个铜冠,所以内网通聊天列表里很多人名字后面顶着皇冠。(强制)升级到3.4.3035后,需要用以前10倍的积分才能兑换东西(恩,物价飞涨!)。更重要的,以前的刷积分外挂失效了。上帝关上一堵门,必然会为你打开一扇窗,内网通的作者可能也想到要够到铜冠太难了,于是,他提供了RMB玩家解决方案----你可以购买积分,如下图:

    另外,作者还开了网店,通过扫二维码,进入作者网店消费。通过这种方式,可以获得可怜兮兮的若干积分。 看着软件作者手头比较紧,需要摇钱树功能的软件...

    本着不断人财路的初衷,本文只提供逆向思路,并不会公开逆向的方法(这也是大多数逆向论坛的一贯作风),下面开始正文。先查壳,diewin显示NWT的主程序ShiYeLine.exe(事业线?作者想表达什么含义?)并没有加壳,并且由vs2008编译生成:

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

    NWT本身有很多窗口,而且又由vs2008生成,我决定先用spy++收集窗口和控件信息,毕竟能收集到控件信息可以节省很多分析的时间。但是很可惜,spy++只能捕获到对话框信息,而对话框上的控件它一概无法捕捉,换句话说,作者并没有使用标准控件,可能是将Button,Edit等控件绘制在对话框上。

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

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

 NWT添加积分的规则为:点击试试手气,弹出"试试手气"对话框。对话框中含有二维码,手机扫码后,会进入作者的网店;同时,手机上出现4位验证码,将这串验证码输入"试试手气"的Edit框,验证正确NWT会随机地添加少的可怜的若干积分;验证失败提示无效的验证码。

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

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

<SkinDialog DefaultWidth="375" DefaultHeight="520" Caption="IDS_SCAN_CODE" Animation="SizeChange" Icon="128" SysButton="CLOSE"><SkinTextView Id="101" LayoutHeight="28" AlignParentLeft="25" AlignParentRight="25" AlignParentTop="50" Text="IDS_SCAN_CODE_TIPS1" FontStyle="ID_FONT_BOLD_BIG"/><SkinRelativeLayout Id="106" LayoutWidth="300" LayoutHeight="300" AlignParentHorizontalCenter="0" BkgColor="ID_COLOR_WHITE" ToBottomOf="101,17"><SkinImageView Id="102" LayoutWidth="WrapContent" LayoutHeight="WrapContent" AlignParentHorizontalCenter="0" AlignParentVerticalCenter="0" /></SkinRelativeLayout><SkinTextView Id="103" LayoutHeight="28" AlignParentLeft="25" AlignParentRight="25" ToBottomOf="106,17"Text="IDS_SCAN_CODE_TIPS2" FontStyle="ID_FONT_BOLD_BIG"/><SkinEditView Id="104" LayoutHeight="28" AlignParentLeft="75" AlignParentRight="75" ToBottomOf="103,10" Limit="4" Image="Edit.png"/><SkinTextView Id="105" LayoutHeight="28" AlignParentLeft="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的第二个参数是字符串参数,如果我设置条件断点,比较字符串参数的内容是否为指定字符串,如果是就中断到调试器再参看调用堆栈,那么一定能定位到比对字符串的代码的附近。

前面我也说过ShinUI设计为方便开发者替换各种资源,包括字符串资源。在调试过程使用中文字符串往往会出错,所以,我定位到安装目录下res\ShiYeLine\value\string.xml(这是ShinUI规定的字符串表)中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=+0x4080
01 00d5e864 014211e3 75012494 00d5e8c0 04519e38 ShiYeLine!CPaintHelper::DrawTextW+0x9c
02 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+0x1312
05 00d5eae4 0142720b 0000040b 00000068 08521048 ShiYeLine!CSkinWndHost::WindowProc+0x165
06 00d5eb00 74bebe6b 00140d1e 0000040b 00000068 ShiYeLine!CPaintHelper::operator=+0x56b
07 00d5eb2c 74be833a 014271e0 00140d1e 0000040b USER32!AddClipboardFormatListener+0x49b
08 00d5ec14 74be7bee 014271e0 00000000 0000040b USER32!DispatchMessageW+0x97a
09 00d5ec90 74be79d0 d558274a 00d5ecdc 013ff241 USER32!DispatchMessageW+0x22e
0a 00d5ec9c 013ff241 00d5ecbc 04523920 00d5ed30 USER32!DispatchMessageW+0x10
0b 00d5ecdc 01344c2c 0027065c 022096d1 036fbcc0 ShiYeLine!CSkinDialog::DoModal+0xe1
0c 00d5f580 0140faf9 00000193 044fa1f0 00000111 ShiYeLine!CSkinView::GetClientRect+0x4b0c
0d 00d5f5b4 0142720b 00000111 00000193 044fa1f0 ShiYeLine!CSkinWndHost::WindowProc+0x49
0e 00d5f5d0 74bebe6b 0027065c 00000111 00000193 ShiYeLine!CPaintHelper::operator=+0x56b
0f 00d5f5fc 74be833a 014271e0 0027065c 00000111 USER32!AddClipboardFormatListener+0x49b
10 00d5f6e4 74be7bee 014271e0 00000000 00000111 USER32!DispatchMessageW+0x97a
11 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产生积分的代码。当然,怎么做我就不公布了,我输不起官司~

 


http://chatgpt.dhexx.cn/article/C3crMKVE.shtml

相关文章

内网通无限积分-------------

在打开内网通的前提下 运行文件后重新打开内网通即可 百度网盘下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1kUSFEAV 密码&#xff1a;gfmw

内网通刷积分/去除广告

输入内网通ID生成积分码 链接&#xff1a;https://pan.baidu.com/s/1xDcPIFQSYEWv4-85FG7u1g?pwd5u0m 提取码&#xff1a;5u0m

内网通怎么获得无限积分

内网通是一款局域网资源共享软件&#xff0c;集成文件共享、聊天、远程协助等非常实用的功能。内网通可以课飞鸽、飞秋互传文件&#xff0c;而且所有传输全部在局域网中&#xff0c;不受外部服务器的监视。 下面介绍如何增长内网通的无限积分&#xff1a; 1.下载软件&#xf…

内网通3.4.3045版本 免广告码 积分码 算法

大家工作都会用到局域网内部的传递信息的工具 目前飞秋已经没有内网通好用&#xff0c;但内网通无耻到没法关闭广告&#xff0c;经我到处搜所找到小程序 下载地址&#xff1a; https://download.csdn.net/download/kristoff891/21056147 食用步骤&#xff1a; 1、获取自己的I…

Navicat for MySQL 10.1.7 注册码

打开navicat for mysql接着打开帮助&#xff0c;选中注册&#xff0c; 把下面的复制上去就可以了 NAVH-WK6A-DMVK-DKW3 点击确定&#xff0c;帮助>关于 可查看Navicat for MySQL 版本信息。

navicat for mysql 注册码,简简单单,一个搞定

打开navicat for mysql接着打开帮助&#xff0c;选中注册&#xff0c; 把下面的复制上去就可以了 NAVH-WK6A-DMVK-DKW3

下载Navicat的详细步骤

前言必读 读者手册&#xff08;必读&#xff09;_云边的快乐猫的博客-CSDN博客 1.浏览器搜索navicat&#xff0c;点击这个进去 2.点击这个产品 3.点击免费使用 4. 点击这个64位&#xff0c;下载到本地 5.安装步骤一直下一步就好了 ​​​​​​​

Navicat使用教程

Navicat使用教程目录 一、 连接使用 1.1 连接数据库1.2 操作数据库 二、 导入备份三、 查询数据四、 修改用户信息五、 其他操作 5.1 查看数据库版本 5.1.1 终端查看5.1.2 sql语句查看 5.2 查看sql执行计划 一、 连接使用 1.1 连接数据库 打开 navicat &#xff0c;点击 连…

最新Navicat Premium 16 激活中文版 适用于win和mac版

Navicat Premium 16这是十分知名且专业的数据库开发管理工具&#xff0c;利用它不仅为用户提供完善的工具&#xff0c;可以轻松完美的帮助用户构建、管理和维护您的数据库&#xff0c;还与市面上主流的云数据库兼容&#xff0c;从而可以很好的满足不同用户们的各种使用需求。同…

Navicat 12 for MySQL最新版激活(注册机)

整个过程在断网环境下 安装包也用刚下载的 转 https://blog.csdn.net/zhangli0910/article/details/83785147 最新版注册机Navicat下载&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1TpJV9mWPXNm0AmNgd6dLAQ 提取码&#xff1a;urgd 首先下载安装Navicat 在Navicat关…

Navicat Premiumx64 使用注册机激活

以管理员身份运行此注册机&#xff1a; 打开注册机后&#xff0c;1) Patch勾选Backup、Host和Navicat v12&#xff0c;然后点击Patch按钮&#xff1a; 默认勾选 找到Navicat Premium 12安装路径下的navicat.exe&#xff0c;选中并点击打开&#xff1a; navicat.exe 此时出现如…

navicat for mysql注册码,各种版本都有

对于广大程序猿来说&#xff0c;拥有一个正确的navicat for mysql注册码是尤为的重要&#xff0c;试用版的只有14天的试用期&#xff0c;并且受到功能限制&#xff0c;破解版功能不全&#xff0c;并且有中毒的危险&#xff1b;正版注册码便可以享受到navicat for mysql中文读物…

Navicat Premium 安装 注册

Navicat Premium 一.Navicat Premium的安装 1.暂时关闭windows的病毒与威胁防护弄完再开&#xff0c;之后安装打开过程中弹窗所有警告全部允许,不然会被拦住 2.下载安装包&#xff0c;解压 链接&#xff1a;https://pan.baidu.com/s/1X24VPC4xq586YdsnasE5JA?pwdu4vi 提取码…

navicat12注册机生成相应注册码

navicat注册机 是针对nacicat公司开发的软件而制作的一款激活工具&#xff0c;能够生成相对应的注册码和激活码&#xff0c;不仅能够支持激活nacicat 11系列软件&#xff0c;同时可以激活nacicat 12系列软件&#xff0c;具体可以激活navicat 12 for mysql、navicat 12 for orac…

最新Navicat Premium 16下载-安装-注册教程

1、下载Navicat Premium 16 进入 Navicat Premium官网&#xff0c;选择对应版本下载。 2、Navicat Premium 16安装 双击 navicat161_premium_cs_x64.exe 文件&#xff0c;开始安装。 3、Navicat Premium 16注册 点击下载&#xff1a;NavicatCracker.exe 文件 注意&…

Navicat Premium 中文版注册码

NAVN-U6QE-6PX7-44K5 NAVI-WVK6-ZYW4-LQYU NAVJ-5DOO-FCAA-PHMZ 经测试&#xff0c;Nacicat版本是10.0.11&#xff08;黄色版本&#xff09;可以使用第一个注册码 关注我的技术公众号&#xff0c;每天都有优质技术文章推送。微信扫一扫下方二维码即可关注&#xff1a;

Navicat获取注册码

产品适用&#xff1a;Navcat产品中文版64位注册机百度网盘链接: https://pan.baidu.com/s/1H49nNga9h0WHWKGWAGy18g 提取码: ri5d 1、cmd进入注册机目录执行命令navicat-patcher.exe "D:\Program Files\PremiumSoft\Navicat Premium 12"&#xff08;navicate的目录&a…

Linux中关闭SELinux的方法

1、临时关闭&#xff1a;输入命令setenforce 0&#xff0c;重启系统后还会开启。 2、永久关闭&#xff1a;输入命令vi /etc/selinux/config&#xff0c;将SELINUXenforcing改为SELINUXdisabled&#xff0c;然后保存退出。

开机自动关闭SELinux权限

init进程是Android内核启动的第一个用户进程&#xff0c;其中的SELinux也是在init进程中启动的&#xff0c;代码位置在system/core/init/init.cpp中。 通过代码我们可以看出&#xff0c;初始化时会通过security_getenforce()和selinux_is_enforcing()的值是否一致来判断是否开启…

[013操作系统原理系列] | SELinux关闭的两种方法

背景 SELinux是Security-Enhanced Linux的简称&#xff0c;一种内核强制访问控制(MAC)安全系统&#xff0c;目前SELinux已经集成到了Linux2.6内核的主线和大多数Linux发行版上。这里不做多介绍&#xff0c;下面直接进入正题&#xff1a; SELinux有三种状态&#xff1a; Enforc…