|
发表于
2022-11-26 21:05:55
来自手机
|
显示全部楼层
| 阅读模式
来自 甘肃兰州
本帖最后由 洛君一世 于 2022-11-27 14:02 编辑
这次帖子的目标App来源于正己大佬留下的一次动态调试作业,感觉很有意思,于是尝试了一下,以下是我的经验分享。
点我看原贴
软件是一个注册的形式,我们先看看用静态法可不可以弄。
1、随便输入一个账号和注册码,看到会提示无效。
2、以“无效”为关键词,在arsc中搜索,并复制id。
3、在dex++中以整数形式,十六进制搜索上一步复制好的id。
4、得到下图,我们来分析一下。显然,有一个判断句,只有v0=1时,才能注册成功,而v0是从413行的checksn方法中获得。
5、我们尝试在417行赋值v0=1,改变v0本来的值,看看能不能成功。
6、保存,签名安装后,测试结果如下图,可以看到,这种方法是可行的。
然而这种方法不符合正己大佬动态调试的原意,也达不到练习的效果,我们还是尝试一下动态调试的方法吧。
经过上面的静态分析,我们已经知道了要注册成功,得让v0=1,而v0是从checksn方法中获得,所以我们有必要跳转到checksn方法中去瞧一瞧。
1、跳转到checksn方法中。
2、我们将checksn方法转成java分析一下,这里我还是忍不住夸一下mt,转java功能确实牛逼,比jeb强!
3、以下是我画的一些重点。
username是我们输入的账号,sn是注册码,sn.length是我们输入的注册码的长度,要求是16位,我们在动态调试的时候记得输成16位。"MD5"是md5加密,程序往下运行,会对我们输入的用户名进行一个md5加密,然后对加密后的字符串通过循环进行一个增减操作。
if (sb.toString().equalsIgnoreCase(sn))
这串代码则是判断我们输入的注册码与我们的用户名经过md5加密、循环增减操作后生成的注册码是否相同。相同的话才能输出true,也就是v0=1。
经过上述静态分析后,我们已经理清了程序运行基本的逻辑,下一步我们就可以进行动态调试了。
我们使用的调试工具为jeb,下载、安装、使用方法,正己大佬都已经出了详细的教程,因此我就不再多说了,下面我们主要看看在哪下断点,看哪些数据。
动态调试
1、我们同样是进入checksn方法中,以上述注册码判断的关键词equalsIgnoreCase搜索,找到下图代码。我们发现用户名经过一系列操作后生成的注册码会保存到v6寄存器中,而p2存的是我们输入的注册码,v8储存的则是两个注册码比较后的结果,即0或1。那我们想的肯定就是如何查看v6寄存器里储存的字符串了,所以我们可以在move-result v8处下断点,使程序运行到该段代码处停止。
2、我们可以看到v6寄存器的储存的值为222275aa4840481c
将它复制下来,配合我们输入的admin使用即可
3、下图是使用效果,发现已经成功了。
这应该算是按照正己大佬要求完成作业了吧! |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
-
查看全部评分
总评分:好评 +2
金币 +2
|