|
|
求助帖来源:https://bbs.binmt.cc/thread-133077-1-1.html
需要的工具:MT管理器,AIDE
测试:
安装打开App,点击使用App功能,获得关键词"注册"
开始教程……
如果使用的是原版Apk,请自行处理梆梆加固
1.去除签名校验(求助帖楼主发的软件链接不需要)
2.使用Dex++,搜索字符串"注册",可以获得以下结果
第一个虽然也可以分析,但是会麻烦一点,所以我们选择后面的"此功能只对注册用户开放"
我选的第一个,虽然没什么区别
Lcom/forace/BaZipp/BZActivity/k;
点击去,smali如图
smali关键代码如下
- iget-object v0, p0, Lcom/forace/BaZipp/BZActivity/k;->hT:Ljava/lang/Boolean;
- //获取hT的值并赋值给寄存器v0
- invoke-virtual {v0}, Ljava/lang/Boolean;->booleanValue()Z
- //将Boolean转为boolean并将结果赋值给v0
- move-result v0
- //如果v0不等于false,则跳转至cond_12
- if-nez v0, :cond_12
- //告知用户需要注册才能使用
- iget-object v0, p0, Lcom/forace/BaZipp/BZActivity/k;->gW:Lcom/forace/ad/dd/MyValue;
- const-string v1, "只对注册用户开放,请谅解!"
- const-string v2, "综合分析"
- invoke-virtual {v0, p0, v1, v2}, Lcom/forace/ad/dd/MyValue;->ShowMessage(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;)V
复制代码
可知v0的最初来源是Lcom/forace/BaZipp/BZActivity/k;->hT:Ljava/lang/Boolean;
我们需要对hT的赋值进行搜索
双击hT然后点击跳转,然后点击指南针图标,长按hT,会出现下面的图标
点击查找调用处,选择仅查找put调用
随便选一个结果,我选的最后一个结果,点击指南针,长按你当前的方法,点击转为Java
搜索hT
如图所示
关键Java代码
- //执行SQL指令,指令效果:查询config表中满足configid列的值为bz并且configvalue列的值为s()+getIMSI()的数据的数量并且将结果储存为名称为cc的变量中
- ContentValues GetSQLValue = this.gW.GetSQLValue(this.gW.MyDB, "select count(*) as cc from config where configid='bz' and configvalue='" + s() + getIMSI() + "'");
- bool.booleanValue();
- //获取cc变量并将其转为int,判断数量是否超过了0
- if (GetSQLValue.getAsInteger("cc").intValue() > 0) {
- try {
- Integer.parseInt(this.hO);
- //如果this.hO转为int后的数值不等于5时,hT为false,否则为true
- if (Integer.parseInt(this.hO) != 5) {
- this.hT = false;
- } else {
- this.hT = true;
- }
- } catch (Exception e8) {
- this.hT = false;
- }
- } else {
- this.hT = false;
- }
复制代码
总结信息,我们必须让hT为true,而为true需要SQL查询语句中configid含有bz和configvalue含有s()+imsi的数量大于0并且this.hO需要等于5
往上追溯,发现this.hO的值来自getkey
- this.hO = getkey(s(), readFileData("config1"));
复制代码
这个getkey是So方法,我懒得开电脑,UN管理器也不好分析,那么我们简单粗暴点,已知this.hO等于5时hT就为true了
那么直接改动getkey就可以了
因为存在大量同类方法,所以我们需要一个正则一键替换
Dex++搜索模式选择代码,勾选正则表达式以及区分大小写
- invoke.*->getkey\(.*\n\n.*object (.*)
复制代码
替换为
接下来让我们打开AIDE,新建一个Android项目,将此软件的classes.dex复制到项目文件夹的libs文件夹里,点击dex,使用MT的Dex2Jar也就是Dex转为Jar的功能
新建一个Java文件
我们虽然满足了this.hO等于5,但还需要SQL的查询数量大于0,既然如此,我们就借用这个App的SQL编辑功能,在最开始的Activity里直接对那个数据库进行SQL代码的写入,这样我们就一定会有一个bz并且值满足要求的数据了
关于此App的SQL结构,我使用了以下网站进行了在线浏览编辑
https://www.lzltool.com/sqlite-viewer
此App数据库所在绝对路径:
/data/user/0/com.forace.BaZipp.BZActivity/databases/bzpp.db
bzapp.db的来源可以通过分析这个App的SQL操作获得
比如MyValue类的onConnect方法里就有bzapp这个字符串
编写如下代码
- import com.forace.BaZipp.BZActivity.*;
- import com.forace.ad.dd.*;
- import android.database.sqlite.*;
- import android.widget.*;
- import android.util.*;
- import android.content.*;
- public class Crack
- {
- public static void FuckCheck(Context pz){
- MyValue fuck=new MyValue();
- fuck.onConnect(pz);
- SQLiteDatabase getAppDB=fuck.MyDB;
- String getIMEI=fuck.GetSQLValue(getAppDB, "select count(*) as cc from config where configid='imei' ").getAsInteger("cc").intValue() == 1 ? fuck.GetSQLValue(getAppDB, "select configvalue as cc from config where configid='imei' ").getAsString("cc") : "N";
- Log.e("CrackZ",getIMEI);
- //插入config表
- String A1="insert into config (configid, configvalue, other, flag) values ('bz','"+getIMEI+"', 'mmksa', '29');";
- //获取config表中configid为bz的数量
- String A2="select count(*) as mk from config where configid='bz';";
- //避免每次打开都添加,只有bz没有的时候才添加
- if(fuck.GetSQLValue(getAppDB,A2).getAsInteger("mk")<1){
- fuck.ExecuteSQL(getAppDB,A1);
- }
- fuck.onClose();
- Toast.makeText(pz,"破解插件执行完毕……",1).show();
- }
- }
复制代码
将编译好的Apk的关于这个类的smali代码提取出来
然后打开我们修改后的Apk,使用Dex++,随便选个类长按,点击新建,名称随便输入,进去后将smali粘贴
最后,我们前往Lcom/forace/BaZipp/BZActivity/BaZiPPActivity;
因为这个是第一个打开的Activity
加入我们的调用代码
- invoke-static {p0},你新建的那个类->FuckCheck(Landroid/content/Context;)
复制代码
接下来编译安装,打开App,测试之前要求注册的功能:档案,发现可以正常使用了
2024.5.8追加:
经过测试,可能会存在执行后依旧显示未注册,其原因经过验证为FuckCheck函数执行时期过早,插入的位置可以更改为Lcom/forace/BaZipp/BZActivity/j;
位置应该在软件插入imei之后
如果不想这么做,请先安装开启这个软件,然后按此教程破解后覆盖安装即可
教程结束
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
-
查看全部评分
总评分:好评 +2
金币 +1
|