dismiss();
}
}
ad.b(this.e, c.code_length_tip, Integer.valueOf(9)); //提示激活码不能小于9位
}
}
}
如果本地简单的验证成功会把字符串发往服务器,网络请求是这个类。看里面的网络成功的回调,这个回调匿名对象对应的Smali 文件为.class Ld/b/a/c/h/a$1;

找到 Smali对应的文件,先反转这个if(找到 Smali里面的代码 把if-eqz改成if-nez),我们试试能不能破解。测试发现反转了if就能破解了、然后就没有必要再分析其他代码的含义了。重新打包签名就可以使用了。
注意:apktool重打包会失败。解决方法看后面
处理到这一步,其实已经算是破解了收费功能,但是他里面还有个激活码长度限制,那么这里购买一个真正的激活码看看,发现他是32个字符。哈哈32个字符~恩 md5。那这里其实自己随机生成一个字符串,md5一下就可以,然后把我们的代码插入到 d.b.a.c.h.a(String,String,b)
方法开始的时候,修改第二个参数。就可以了。
然后我们破解这个10的限制,基本流程如下:
- 这个10 (Smali 里面搜索 0xa) 有两个地方验证到了、一个是:图形化界面 d.b.a.c.h.b.a 一个是网络请求类 d.b.a.c.h.a
- 我们把验证长度都改成1(也就是0x1),这样只要随便输入一个字符串就能验证成功了
- 但是好像这样有bug,也就是本地还有地方用到了这个激活码,并且对长度有限制
- 那也好说,我们发送的时候,把用户输入的激活码md5一下。
- 然后就可以啦
上面的难点是如何修改原来的代码,把拦截用户输入的激活码,修改后再发送给服务器。
我们在AndroidStudio中创建一个工具类,把包名改成上面和上面的类同一个包名
package d.b.a.c.h;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
- Author: liuqiang
- Date: 2018-11-03
- Time: 13:42
- Description:获取一个字符串的md5的字符串的表现形式类似于:
- 914674d1b303467d54c0673893a19ab3 个形式
*/
public class bbch {
public static String getHash(String s) {
try {
MessageDigest md5 = MessageDigest.getInstance(“MD5”);
md5.update(s.getBytes(“UTF-8”));
byte[] md5Array = md5.digest();
//byte[]通常我们会转化为十六进制的32位长度的字符串
return new BigInteger(1, md5Array).toString(16);
} catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {
return “1234567890”;
}
}
}
我们把这个类通过as编译成Smali文件,然后在d/b/a/c/h/a
类的a方法的开头处引用如下代码:
#d.b.a.c.h.a 类里面的方法
.method public a(Ljava/lang/String;Ljava/lang/String;Ld/b/a/c/b;)V
.locals 8
const/4 v0, 0x0
#在这里引用我们自定义的工具类
invoke-static {p2}, Ld/b/a/c/h/bbch;->getHash(Ljava/lang/String;)Ljava/lang/String;
#从而修改第二个参数的值
move-result-object p2
.line 57
#…省略其他代码
.end method
如果翻译成java代码如下图所示
然后再重新打包签名,运行app。选择 使用支付宝购买–>填写任意激活码—>点击激活按钮。就能使用啦~~~
3、 遇到的几个错误
重打包失败。这个我还真的不知道啥原因,不过猜测是因为这个app的资源混淆的问题。即使 使用apktool d -r xxx.apk
命令不反编译资源文件重打包运行之后也是出错,那么只好去用Smali/baksmali 去搞了。
具体步骤如下:
//前提条件 会 baksmali/smali 的基本操作
//用zip的方式解压apk
//把 classes.dex 单独 搞出来
//然后运行 baksmali d classes.dex -o out
//然后classes.dex 会被反编译成 Smali文件存放到 -o 指定的目录
//修改 out 中的对应文件
//然后把Smali编译成dex 运行: smali a out/ -o ./out/classes.dex
//然后把out 文件夹中的 classes.dex 覆盖上面解压的apk中的dex
//然后删除原来的签名文件
//然后用zip压缩这些文件,重命名apk
//然后签名这个apk
4、学到了一个混淆操作
我们知道一般情况下Activity的子类是不能混淆的,但是呢这句话说的不完全。确切的说应该是在Manifest文件中注册的Activity是不能混淆的。因为Manifest文件中要写一个Activity的class的路径的字符串。如果原始的类被混淆了,而字符串没有修改,那么Android系统在做安全验证的时候就会找不到Activity,那么就没办法通过安全验证。但是设想一下如果我们的继承关系是这个样子的:
MainActivity—>BaseActivity ---->Activity
那么试问,这个BaseActivity是不是可以混淆,经过验证这个是可以混淆的。因为BaseActivity 不需要在Manifest文件中注册,而MainActivity需要。那么我们变通一下。把这个继承链加长
a—>MainActivity—>BaseActivity ---->Activity
由于篇幅原因,这份面试宝典已经被整理成了PDF文档,有需要Android面试宝典全套完整文档的麻烦点赞+点击GitHub即可获取资料免费领取方式!
本文在开源项目:GitHub中已收录,里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
)]
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
[外链图片转存中…(img-Wgzme30b-1711030175850)]