逆向一款收费版的开发工具,精选Android面试真题集锦

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移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
[外链图片转存中…(img-Wgzme30b-1711030175850)]

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值