【安卓】拿注册码的两种方式
【安卓】拿注册码的两种方式
文章仅用于学习交流,请勿利用文章中的技术对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用者本人负责。首发吾爱:https://www.52pojie.cn/thread-1826802-1-1.html言归正传,前段时间和朋友聊到某项功能,他说他是之前买的一个手机设备,那个手机可以实现这个功能,我当时就来了兴致,做了底层修改这么牛?
后来拿来看了看,手机刷了第三方rom和Magisk,利用一个app实现了这个功能(虽然爱思助手就有这个功能),但是有现成的app就想着研究一番,结果好家伙要验证码?于是就有了下文(在安卓逆向中属于非常基础了)
微信公众号:小惜渗透,欢迎大佬一起交流进步
1. java理逻辑
打开软件,图片如下
随便填写点信息,然后点确定

查一下有没有壳

没有壳,直接拖进jadx,然后搜索关键字校验失败,发现两处,并且都在一个类中,先看第一处如下图所示,主要是有两个判断分支,首先我们要知道我们想要激活成功肯定是需要让代码不能走到else分支里
-
先看最外层
if语句判断了regCode的长度是否大于6,这个regCode看出是从控件中获得,也就是我们输入的注册码,所以这里得到信息,我们的注册码长度要大于6 -
紧接着看内层的
//可以看出它new了一个Date也就是当前的日期,然后判断finalDate是否大于当前的日期
//finalDate的值为aqnuzcxq.getFinalDate(date),这个date是我的当初输入的注册码字符串从下标为6(也就是第七个数)到最后的截断
//所以接下来我们需要跟进,看下getFinalDate函数
if (finalDate.compareTo(new Date()) > 0)

为了注释方便,我将看下getFinalDate函数直接粘贴到下方
public static Date getFinalDate(String num) {//声明一个calendar对象Calendar c = Calendar.getInstance();//设定其日期为2019/12/1c.setTime(new Date("2019/12/1"));//调用add函数增加日期,其中6代表增加数字代表的是天数(依据如下图),增加的值为hexDecode(num),也就是对num进行16进制转10进制后得到的数字c.add(6, hexDecode(num));//返回日期return c.getTime();}

至此,整理得到逻辑,当我们输入注册码的时候,软件会截取从第7个起到末尾的字符串,然后利用hexDecode函数对其解码得到一个数字,计算2019年12月1日加上这个数字并到的新的日期,用这个新的日期去对比今天的日期,判断是否过期。
hexDecode和hexEncode在代码中都有,比如我这里想让其增加9999天,那么解码前的原字符串应该为多少呢,我这里写了个demo,字符串为38259

加完之后,日期是多少呢?2047年,可以够用了,所以这里我们得出我们激活码的第后半部分可以写个38259

既然后半部分有了,就差前半部分了,前办部分的逻辑如下
可以看到代码正常走的话,又会触发校验失败的提示,所以我们要让其走到前面的if分支即可,因为前面的if分支有return关键字,我们看一下这个if分支,它获取了tvMachineCode这个控件的值作为第一个参数,这个控件为前面图中的机器码字段,并调用getFingerPrint函数,将返回值于regCode进行比对
regCode从前面的代码中声明了(在第一张代码图中),它是我们注册码的前6位

我们跟进一下getFingerPrint函数,如下很简单,它就是将传入的两个参数想加然后进行md5加密,然后获取前6位,看上图,第一个参数我们知道了是机器码,第二个参数是keyCode

接下来找这个keyCode,从下向上看,最后追溯到show函数的第三个参数,这里我们只需找到哪里调用了show函数即可,在show函数上按x,找到调用

只找到一处调用,就是它了,看第三个参数123456(脱敏了)

ok,既然如此我们前6位字符串也知道了,将机器码和123456拼接,然后进行md5加密,然后取前6位,最后拼接上我们之前逆出来的38259得到的字符串拿去激活

2. 改smali代码的判断分支
打开dex,搜索校验失败,翻到第一个判断分支如下,这里v7是6,应该是判断长度大于6那个位置,if-le表示a小于等于b则调,所以我们默认长度大于6这里不跳,接着往下看下一个判断分支出现

这里的if-gtz表示如果v9大于0则跳,所以我们这里需要将其改成反过来小于等于0则跳,所以这里改成if-ltz

第一个判断分支解决,继续向下找第二个,如图这个位置正对代码中的equals比较处,这里if-eqz表示a等于0则跳,那我们改成a不等于0,也就是if-nez

然后胡乱输入即可

这种方法不推荐,因为每次进应用会有检验是否过期函数,当然也可以对这个函数进行修改或置空,当然还有其它方式例如用frida进行hook,这里由于时间关系就不多做赘述了。
相关文章:
【安卓】拿注册码的两种方式
【安卓】拿注册码的两种方式 文章仅用于学习交流,请勿利用文章中的技术对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用者本人负责。首发吾爱:https://www.52pojie.cn/thread-1826802-1-1.html言归…...
【C++】—— 异常处理
前言: 本期,我将给大家讲解的是有关 异常处理 的相关知识! 目录 (一)C语言传统的处理错误的方式 (二)C异常概念 (三)异常的使用 1、异常的抛出和捕获 1️⃣ 异常的…...
cookie和session是什么,区别是什么?
cookie HTTP 协议中的 Cookie 包括 Web Cookie 和浏览器 Cookie,它是服务器发送到 Web 浏览器的⼀ ⼩块数据。服务器发送到浏览器的 Cookie,浏览器会进⾏存储,并与下⼀个请求⼀起发送到服务器。通 常,它⽤于判断两个请求是否来⾃…...
linux的mmc子系统与块设备关联
1.前言 本文主要block组件的主要流程,在介绍的过程中,将详细说明和block相关的流程,涉及到其它组件的详细流程再在相关文章中说明。 2.主要数据结构和API 2.1 struct mmc_card Elemete Namestruct mmc_cardPathinclude/linux/mmc/card.hRe…...
【Spring MVC】
目录 🍮1 什么是 MVC ? 🎁2 Spring MVC 的连接 🍘2.1 RequestMapping 实现 POST 和 GET 请求 🥣2.2 GetMapping 只支持 GET 请求 🫖2.3 PostMapping 只支持 POST 请求 🍬3 Spring MVC 获取参数的…...
【ES】笔记-生成器函数与调用
function* function* 这种声明方式 (function关键字后跟一个星号)会定义一个生成器函数 (generator function),它返回一个 Generator 对象。 function * gen(){console.log("heloo generator")}如何调用呢?先看下里面的内容 返回…...
将Spring Boot与Redis集成
一、引言 1、SpringBoot: Spring Boot是一个用于创建独立且可执行的Spring应用程序的框架。它简化了基于Spring框架的应用程序的开发过程,并提供了一种快速和简便的方式来构建Java应用程序。 Spring Boot提供了自动配置机制,通过引入适当的…...
vue echarts
安装 npm i -D echarts使用 <script setup lang"ts"> import * as echarts from echarts import { onMounted } from vueonMounted(() > {interface DataItem {value: [string, number]}let myChart echarts.init(document.getElementById(main))let dat…...
idea上利用JDBC连接MySQL数据库(8.1.0版)
1.了解jdbc概念 JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种 关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建 更高级的工具和接口&#…...
【100天精通python】Day47:python网络编程_Web编程基础
目录 1 网络编程与web编程 1.1 网络编程 1.2 web编程 2 Web开发概述 3 Web开发基础 3.1 HTTP协议 3.2 Web服务器 3.3 前端基础 3.4 静态服务器 3.5 前后端交互的基本原理 4 WSGI接口 4.1 CGI 简介 4.2 WSGI 简介 4.3 定义 WSGI 接口 4.4 运行 WSGI 服务 4.5…...
DockerCompose介绍与使用
DockerCompose介绍与使用 1、DockerCompose介绍 DockerCompose用于定义和运行多容器 Docker 应用程序的工具。 通过 Compose可以使用 YAML 文件来配置应用程序需要的所有服务。一个使用Docker容器的应用,通常由多个容器组成,使用Docker Compose不再需要…...
Windows Qt 5.12.10下载与安装
Qt 入门实战教程(目录) C自学精简实践教程 目录(必读) 1 Qt5.12.10下载 qt-opensource-windows-x86-5.12.10.exe 官方离线安装包 Download Source Package Offline Installers | Qt 下载巨慢(也可能很快) 只能下载到最新的&…...
RustDesk最新版本编译与打包
本文环境 主要参考: https://www.yuque.com/shikangsi/efy0cp/wei3g1?https://blog.csdn.net/hualuohuakai2014/article/details/121605631 问题 flutter 生成 bridge 文件。 先安装工具,再生成ffi文件。 PS C:\Users\Administrator> cargo ins…...
Gin 框架入门实战系列(一)
GIN介绍 Gin是一个golang的微框架,封装比较优雅,API友好,源码注释比较明确,具有快速灵活,容错方便等特点 对于golang而言,web框架的依赖要远比Python,Java之类的要小。自身的net/http足够简单,性能也非常不错 借助框架开发,不仅可以省去很多常用的封装带来的时间,…...
【测试】pywinauto的简单使用(安装、常用对象、元素控件、鼠标操作、键盘操作)
1.说明 pywinauto是一个用于自动化Python 模块,适合Windows系统的软件(GUI),可以通过Pywinauto遍历窗口(对话框)和窗口里的控件,也可以控制鼠标和键盘输入,所以它能做的事情比之前介…...
Java基础十八(正则表达式 + 日期时间)
1. 正则表达式 1.1 普通字符 字符描述示例[abc]匹配 […] 中所有字符[hlo] 匹配字符串 "hello world" 中所有的 h l o 字母[^ABC]匹配除了 […] 中所有字符[hlo] 匹配字符串 "hello world" 中除了 h l o 的所有字母[^a-z]匹配除了 […] 中所有字符[hlo] 匹…...
Linux C 多进程编程(面试考点)
嵌入式开发为什么要移植操作系统? 1.减小软硬件的耦合度,提高软件的移植性 2. 操作系统提供很多库和工具(QT Open CV),提高开发效率 3.操作系统提供多任务机制,______________________? (提高C…...
c++一级
与7无关的数 #include<iostream> #include<iomanip> using namespace std; int main() { int n,a,sum0,c0; cin>>n; for(int i1;i<n;i){ if(i%7!0){ ai; c0; …...
Code Lab - 34
GAT里面有一些地方看的不是太懂(GAT里Multi Attention的具体做法),暂时找了参考代码,留一个疑问 1. 一个通用的GNN Stack import torch_geometric import torch import torch_scatter import torch.nn as nn import torch.nn.fun…...
后端返回文件流,前端怎么导出、下载(8种方法可实现)
在前端导出和下载后端返回的文件流时,可以使用以下几种方法: 使用window.open()方法: 在前端使用window.open()方法打开一个新的窗口或标签页,并将后端返回的文件流作为URL传递给该方法。浏览器会自动下载该文件。例如:…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
二维FDTD算法仿真
二维FDTD算法仿真,并带完全匹配层,输入波形为高斯波、平面波 FDTD_二维/FDTD.zip , 6075 FDTD_二维/FDTD_31.m , 1029 FDTD_二维/FDTD_32.m , 2806 FDTD_二维/FDTD_33.m , 3782 FDTD_二维/FDTD_34.m , 4182 FDTD_二维/FDTD_35.m , 4793...
