【安卓】拿注册码的两种方式
【安卓】拿注册码的两种方式
文章仅用于学习交流,请勿利用文章中的技术对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用者本人负责。首发吾爱: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传递给该方法。浏览器会自动下载该文件。例如:…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
