动态方式破解apk前奏篇学习笔记

来源:互联网 发布:地图龟淘宝哪家的好 编辑:程序博客网 时间:2024/06/05 12:50

一、下关键断点

1.使用自带的View分析工具找到BUtton的ResId
这里写图片描述
可以看到控件的属性值。

2.1在smali工程中全局搜索这个值,就可以定位到这个button的定义的地方。

这里写图片描述

2.2也可以在反编译之后的values/public.xml文件中找到,这个文件很有用的,他是整个apk中所有资源文件定义的映射内容:
这里写图片描述
这个文件很重要,是我们在寻找突破口的重要关键,比如我们有时候需要通过字符串内容来定位到关键点,这里就可以通过string的定义来找到对应的整型值即可。

  1. 1当我们找到了button对应的id值了之后,我们就可以用这个id值在一次全局搜索一下,因为我们知道,Android中编译之后的apk,在代码中用到的resId都是用一个整型值代替的,这个整型值就是在R文件中做了定义,将资源的id和一个值对应起来,然后代码里面一般使用R.id.button这样的值,在编译出apk的时候,这个值就会被替换成对应的整型值,所以在全局搜索0x7F05003E:
    这里写图片描述

3.2 看到了,这里就定位到了代码中用到的这个button,我们进入代码看看:
这里写图片描述

4.在这里,看到了,使用了findViewById的方式定义Button,我们在往下面简单分析一下smali语法,下面是给button添加一个按钮事件,这里用的是内部类MainActivity1OnClickListenerMainActivity1直接搜onClick方法:
这里写图片描述

在这里我们就可以下个断点了,这里就是触发密码校验过程。

二、动态调试

三、开始调试程序

看到使用v3变量保存了我们输入的内容;

这里有重点了:getTableFromPic,getTableFromPic获取一个字符串,我们看到内容是256个字符:
invoke-virtual {v6},Lcom/example/simpleencryption/MainActivity;->getTableFromPic()Ljava/lang/String;

这里通过getPwdFromPic方法获取需要验证的正确密码值:
invoke-virtual {v6},Lcom/example/simpleencryption/MainActivity;->getPwdFromPic()Ljava/lang/String;

查看一下密码的内容,貌似也是一个不规则的字符串,但是我们可以看到和上面获取的table字符串内容格式很像,接着往下走:

这里还看到一个重点就是有log打印,tag是lil:
const-string v6,’lil’
。。。
invoke-static {v6,v7},Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/Strinh;)I

在这里,把我们输入的密码获取utf-8的字节码数组,然后调用access()方法,获取加密之后的内容:
const-string v6,”utf-8”
invoke-virtual {v3,v6}, Ljava/lang/String;->getBytes(Ljava/lang/String;)[B
mov-result-object v6
invoke-virtual {v5,v6},Lcom/example/simpleencryption/MainActivity;->access$0(Ljava/lang/String;[B)Ljava/lang/String;
moveeresult-object v2

这时候,我们看到v3是保存的我们输入的密码内容,这里使用utf-8获取他的字节数组,然后传递给access$0方法,我们使用F5进入这个方法:
这里写图片描述
在这个方法中,还有一个bytesToAliSmsCode方法,使用F5进入:
这里写图片描述

这里写图片描述

那么这个方法其实看上去还是很简单的,就是把传递进来的字节数组,循环遍历,取出字节值,然后转化成int类型,然后在调用上面获取到的table字符串的chatAt来获取指定的字符,使用StringBuilder进行拼接,然后返回即可:
这里写图片描述
按F7跳出,查看,我们返回来加密的内容是:日日日日,也就是说gggg=>日日日日
这里写图片描述
最后再往下走,可以看到是进行代码比对的工作了。

阅读全文
0 0