以buu-findit这道简单的安卓逆向题为例。我们的目标是修改apk并重新打包+签名,让它能在安卓模拟器上正常运行,且无论输入什么字符串都可以输出flag。
作者:hans774882968以及hans774882968
工具
- apktool:下载指导。只是一个jar包而已。
- 安卓模拟器Genymotion3.2.1,有免费版的,但要在他的网站注册账号。
配置Genymotion还有点麻烦……网上有的教程都是很老的了,我可能以后会写个详细的。就记一下我遇到的问题:
- 拖拽的时候鼠标显示禁止,即无法拖拽:设置兼容性,Windows8,并且不要以管理员权限运行。二者似乎是缺一不可的。
- Genymotion-ARM-Translation安装失败:不要选新的,Android10的会失败(准确来说,是Genymotion-ARM-Translation版本和你的模拟器支持的安卓版本要匹配)。
- 不过后来发现www.jianshu.com/p/1db4cb031… 这个链接提供的百度网盘提供了支持Android9的Genymotion-ARM-Translation。
- 拖拽安装app能正常安装并打开即可。
寻找关键代码
JEB查看不再赘述。我们找到这段smali
.method public onClick(View)V
.registers 14
00000000 const/16 v11, 17
00000004 const/16 v10, 0x007A
00000008 const/16 v9, 90
0000000C const/16 v8, 65
00000010 const/16 v7, 97
00000014 new-array v3, v11, [C
00000018 const/16 v5, 38
0000001C new-array v4, v5, [C
00000020 const/4 v0, 0
:22
00000022 if-lt v0, v11, :70
:26
00000026 const/4 v1, 0
00000028 invoke-static String->valueOf([C)String, v3
0000002E move-result-object v1
00000030 iget-object v5, p0, MainActivity$1->val$edit:EditText
00000034 invoke-virtual EditText->getText()Editable, v5
0000003A move-result-object v5
0000003C invoke-interface Editable->toString()String, v5
00000042 move-result-object v5
00000044 invoke-virtual String->equals(Object)Z, v1, v5
0000004A move-result v5
0000004C if-eqz v5, :190
复制代码
对照反编译后的代码,我们可以知道,:190
标签后面就是失败的语句。因此我们只需要移除这条if-eqz
指令。
修改smali
下载apktool(只是一个jar包而已)。并执行java -jar apktool.jar d 1.apk
,即可生成同名的反编译后的文件夹。我们找到MainActivity$1.smali
,把以上语句删除即可。
不过我怎么可能满足于此?我们不妨让它输出些更有意思的内容。
# 首先要把寄存器个数改多一点
.locals 15
# 然后在下面添加一些代码
.line 69
iget-object v5, p0, Lcom/example/findit/MainActivity$1;->val$text:Landroid/widget/TextView;
# 自己的代码start
new-instance v12, Ljava/lang/StringBuilder;
# 调用构造函数
invoke-direct {v12}, Ljava/lang/StringBuilder;-><init>()V
const-string v13, "信息:I am an great acmer!"
invoke-virtual {v12, v13}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v12, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v12, v13}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v12}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v2
# 自己的代码end
invoke-virtual {v5, v2}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
.line 74
.end local v2 # "n":Ljava/lang/String;
:goto_2
return-void
复制代码
这个smali语法我现学的,invoke-virtual
用来调用方法,move-result-object
把方法的返回值赋给寄存器。
期间我扔模拟器,发现它老崩溃,debug了许久才发现我的v12
忘记调用构造函数了。
重新打包+签名
用apktool打包,用Java自带工具签名apk。
打包命令:java -jar apktool.jar b 1 -o 1-out.apk
签名apk:
- 到Java安装目录(即bin文件夹,有
java.exe
的文件夹)下,运行命令.\keytool -genkeypair -alias demo.keystore -keyalg RSA -validity 500000 -keystore demo.keystore
。然后他会问你几个问题,就是姓名、地址之类的。其他的都随便填,只有密码要注意。只有第一次需要生成这个,以后可以复用的。 - jarsigner需要用到上面的keystore文件。命令:
.\jarsigner -keystore D:\xxx\demo.keystore -signedjar D:\xxx\1-signed.apk D:\xxx\1-out.apk demo.keystore
。这里有4个参数,分别为keystore文件、输出文件路径、输入文件路径和keystore别名。然后它会让你输keystore的密码的。
把所得apk直接拖进模拟器即可。
效果
如图
参考链接
- 安卓逆向流程:www.52pojie.cn/thread-8224…
- smali怎么拼接字符串:blog.csdn.net/sumsear/art…
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END