逆向分析一款国外Blackjack Card Counter软件并附上License生成脚本
没有学过逆向,一时兴起,搞了一下这个小软件,名为“逆向分析”,其实过程非常简单,难登大雅之堂,就当段子看吧。
首先介绍一下背景吧。
这是一款国外的Blackjack也就是21点算牌软件,我从来不玩牌的,机缘巧合看到了这个软件搞着玩一下。
21点算牌需要用到Strategy也就是策略,说白了就是算法,从20世纪50年代60年代一直发展到现在,国外的算法大神们研究出了很多厉害的Strategy
这款软件,本身是可以免费使用的,默认免费情况下提供了2个Strategy
在这之外,有两项增值服务,
一是在默认的两个Strategy之外又提供了几十种Strategy
二是可以编辑自定义的Strategy
想要使用这两项增值服务的话,需要向开发商支付$7.99获取License
背景介绍到这里,下面开始演示分析过程。
打开软件,点击“Strategy”可以看到列出了两个免费的Strategy可供选择。

点击“Help”,“Enter License Key”

弹出一个注册框,“Serial Number”标签后有个数字,这里是“61684”
经过测试,当软件在不同的电脑上打开时,这个数字是不同的,在相同的电脑不同的时间打开时是相同的。
因此,我猜测可能是软件读取了某些硬件信息生成了这个数字,并且是与当前时间戳无关的?这个不深究了。

我在“License Key”标签后面随便输入一组数字“12345”试试看,弹出个提示框显示“Invalid Key!”
这个字符串是个典型的标志,等一下会用到。

先用Detect It Easy查一下文件,显示是VB.NET写的。

再用dnSpy载入目标软件。


“编辑”,“搜索程序集”

搜索注册失败时弹出的那个提示字符串“Invalid Key!”,显示它在“btnRegister_Click”里面。

点击“btnRegister_Click”,跳转到目标字符串位置。第457行到480行是这个函数的完整代码,“Invalid Key!”字符串在第478行。

分析一下以上代码,整个函数的执行流程是比较简单的。
第459行对“Me.txtActivationKey.Text”变量的值进行一个判断,如果它是数字形态并且长度大于0就继续向下执行,否则经过一系列跳转最终提示注册失败。
那么这个“Me.txtActivationKey.Text”应该就是由用户输入的License Key了,我们下个断点动态调试来看一下。


没错,结果符合预期。
接下来重点在第462行和第463行
取“Me.txtActivationKey.Text”这个字符串变量的值作为参数,调用Conversions.ToLong()函数将其转换为整型,再将结果作为参数调用Me.CheckKey()函数,
Me.CheckKey()函数会返回一个Boolean值,传递给flag3变量,如果flag3结果为True就提示注册成功,否则就失败。
这样来说,决定成功还是失败的算法,就应该是在Me.CheckKey()函数里面定义的了,点击“CheckKey”跳转到函数定义处。

这个函数更简单了,形式参数“key”是函数调用时传递进来的那个用户输入的值,
紧接着定义了一个变量“num”,应该就是那个“Serial Number”了。
第291行,以“Serial Number”为核心,经过一系列计算得出一个结果值。
第292行,将这个值与用户输入的值“key”进行比对,将Boolean结果返回给调用函数。
总结一下,该函数取随机器而异的一个整数值“Serial Number”经过计算得出另一个整数值“License Key”,如果用户输入的值与函数计算结果相同,即注册成功。
第291行,就是“License Key”的核心算法。
这里,我用Python3以这个小算法写了一个计算函数。
#!/usr/bin/env python3
# -*- coding: utf-8 -*- Serial_Number = float(61684)
License_Key = int(round(Serial_Number * Serial_Number + 134.0 / Serial_Number + 233.0 * Serial_Number / 4.0)) print("Serial Number:\t%s" % int(Serial_Number))
print("License Key:\t%s" % License_Key)
执行

测试一下

注册成功了

增值功能可以正常使用了。
逆向分析一款国外Blackjack Card Counter软件并附上License生成脚本的更多相关文章
- SG Input 软件安全分析之逆向分析
前言 通过本文介绍怎么对一个 windows 程序进行安全分析.分析的软件版本为 2018-10-9 , 所有相关文件的链接 链接:https://pan.baidu.com/s/1l6BuuL-HP ...
- 一文了解安卓APP逆向分析与保护机制
"知物由学"是网易云易盾打造的一个品牌栏目,词语出自汉·王充<论衡·实知>.人,能力有高下之分,学习才知道事物的道理,而后才有智慧,不去求问就不会知道."知物 ...
- [工控安全]西门子S7-400 PLC固件逆向分析(一)
不算前言的前言:拖了这么久,才发现这个专题没有想象中的简单,学习的路径大致是Step7->S7comm->MC7 code->firmware,我会用尽量简短的语言把前两部分讲清楚, ...
- Android逆向分析工具表
逆向分析工具表 工具 描述 网址 androidterm Android Terminal Emulator http://code.google.com/p/androidterm/ droidbo ...
- DuiLib逆向分析の按钮事件定位
目录 DuiLib逆向分析の按钮事件定位 0x00 前言 DuiLib介绍 DuiLib安装 DuiLib Hello,World! Duilib逆向分析之定位按钮事件 碎碎念 第一步:获取xml布局 ...
- 【C++】从零开始的CS:GO逆向分析2——配置GLFW+IMGUI环境并创建透明窗口
[C++]从零开始的CS:GO逆向分析2--配置GLFW+IMGUI环境并创建透明窗口 使用的环境:Visual Studio 2017,创建一个控制台程序作为工程文件 1.配置glfw 在git ...
- IM通信协议逆向分析、Wireshark自定义数据包格式解析插件编程学习
相关学习资料 http://hi.baidu.com/hucyuansheng/item/bf2bfddefd1ee70ad68ed04d http://en.wikipedia.org/wiki/I ...
- 技术分享:逆向分析ATM分离器
文章内容仅供技术交流,请勿模仿操作! 背景(作者) 每一次外出时, Elizabeth和我总是格外的小心,同时把我们身上的钱藏在特殊的皮带上面,这样还不够,我们还采取了“狡兔三窟”的方式来藏身上带的银 ...
- C++反汇编与逆向分析技术揭秘
C++反汇编-继承和多重继承 学无止尽,积土成山,积水成渊-<C++反汇编与逆向分析技术揭秘> 读书笔记 一.单类继承 在父类中声明为私有的成员,子类对象无法直接访问,但是在子类对象的 ...
随机推荐
- 《JAVA并发编程实战》示例程序第一、二章
第一章:简介 程序清单1-1非线程安全的数值序列生成器 import net.jcip.annotations.NotThreadSafe; @NotThreadSafe public class U ...
- PMP知识点(五)——配置管理
配置控制重点关注可交付成果及各个过程的技术规范,而变更控制则着眼于识别.记录.批准或否决对项目文件,可交付成果或基准的变更. 包括在实施整体变更控制过程中的部分配置管理活动有: 1.配置识别. 识别与 ...
- [译]Async/Await - Best Practices in Asynchronous Programming
原文 避免async void async void异步方法只有一个目的:使得event handler异步可行,也就是说async void只能用于event handler. async void ...
- 【SQL学习笔记】一、select语句
SQL有别于其他的编程语言的一点在于首先处理的并不是写在第一行的语句(select),而是from字句. 为了更详细的了解select语句的每个部分,举例如下: 该语句返回的结果是下订单超过4次的女顾 ...
- 文件共享服务器share
文件共享服务器:(类似于FTP服务器) 1.创建共享:文件夹右键属性--共享--开启共享--设置共享名--设置共享权限(建议设置为everyone完全控制,然后具体的权限需求在ntfs权限中设置即可) ...
- Exp2 后门原理与实践 20164314 郭浏聿
1.实践内容 (1)使用nc实现win,Linux间的后门连接. 热身 (2)使用netcat获取主机操作Shell,cron启动. (3)使用socat获取主机操作Shell, 任务计划启动. (4 ...
- centos 7.2 下 nginx 1.14.1 安装部署
Nginx1.14.1安装部署 1.环境: 所有源码在跳板机kx的/web/soft下 2.安装依赖: [root@bogon src]# yum install -y libxml2 openssl ...
- JavaScript的数组和循环
1. 数组: a) 声明数组:var 数组名 = new Array(数组大小); Var emp=new Array(“AA”,“BB”,“CC”): b) 添加 ...
- js原型杂谈
1.通俗点讲原型对象就是内存中为其他对象提供共享属性和方法的对象. 2.所有原型对象都具备一个constructor属性,这个属性是一个指向包含prototype属性函数的一个指针(敢不敢再绕点!). ...
- python pymysql.err.InternalError: (1366, "Incorrect string value: '\\xE9\\x9F\\xA9\\xE6\\xA2\\x85...
python3使用pymysql报错: image.png 代码: #插入数据 try: sql = 'INSERT INTO classb (a_id,name,age) VALUES (6,& ...