APK反编译实录

今天我要开发一个新功能,需要反编译一个APK,所以特地写下此文记录相关研究过程。
1、准备工具:
APKtools 两个版本2.0.0rc_4和2.2.0;
jd-gui
Eclipse(Android Studio和IntelliJ Idea都目前对samli的支持不是很好,听说2.2是比较支持的,但是现在已经是正式版本,可以考虑尝试)。
2、破解方法
打开cmd,然后切换到apktools所在的目录,接着使用下面的命令:
java -jar apktool_2.0.0rc4.jar d -d AliCraceme_1.apk -o out
然后修改AndroidManifest.xml文件,添加android:debuggable=”true”属性
再MainActivity或者设置的主Activity的继承Activity找到onCreate方法,一般为:
这里写图片描述
加上一个smali语句:
invoke-static {}, Landroid/os/Debug;->waitForDebugger()V(我这里已经加了)
其实对应的Java代码就是:android.os.Debug.waitForDebugger();
接下来就是调试了。
重新打包
java -jar apktool_2.0.0rc4.jar b -d out -o debug.apk
报错,是因为反编译的时候使用了一个谷歌隐藏的样式,而反编译的时候却显示成公开的样式。
这里写图片描述
解决方法是在@和android之间加上*。
这里写图片描述
然后签名安装。
这里写图片描述
接着打开Eclipse,导入之前反编译好的文件,将samli文件放在src里面,而其他的目录对应放置。
调试设置:
这里写图片描述
然后是启动调试
这里写图片描述
于是我们来到了debug视图。
这里写图片描述
希望我能调试出所需要的功能。
今天的内容是寻找相关功能,一般而言菜单的复制粘贴等命令为copy cut paste等,所以以这些为关键字搜索。copy都比较常见,所以使用menu_copy做为关键字。
检索一番找到了在public.xml下的对应16进制id。
这里写图片描述
再用0x7f0e006检索
这里写图片描述
这里对应的是switch语句,再找到
sswitch6和sswitch7的中间代码,发现有一个函数为:
这里写图片描述
invoke-virtual {v0}, Lfm/clean/storage/IFile;->k()Z
找到IFile,通过检索发现这是abstract方法,然后只好选择找到LocalFile,果真找到了:

.methodpublick(Landroid/content/Context;)Landroid/support/v4/provider/DocumentFile;
.locals8
.prologue
const/4v7,0x3
#v7=(PosByte);
const/4v6,0x2
#v6=(PosByte);
const/4v5,0x1
#v5=(One);
const/4v4,0x0
.line269
#v4=(Null);
invoke-virtual{p0,p1},Lfm/clean/storage/LocalFile;->l(Landroid/content/Context;)Ljava/lang/String;
move-result-objectv0
.line270
#v0=(Reference,Ljava/lang/String;);
invoke-static{v0,p1},Lfm/clean/storage/FileTools;->a(Ljava/lang/String;Landroid/content/Context;)Ljava/lang/String;
move-result-objectv1
.line271
#v1=(Reference,Ljava/lang/String;);
invoke-virtual{p0},Lfm/clean/storage/LocalFile;->n()Ljava/lang/String;
move-result-objectv2
#v2=(Reference,Ljava/lang/String;);
invoke-static{v0,v2},Landroid/text/TextUtils;->equals(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Z
move-resultv2
#v2=(Boolean);
if-eqzv2,:cond_0
.line273
invoke-static{v1},Landroid/net/Uri;->parse(Ljava/lang/String;)Landroid/net/Uri;
move-result-objectv0
invoke-static{p1,v0},Landroid/support/v4/provider/DocumentFile;->fromTreeUri(Landroid/content/Context;Landroid/net/Uri;)Landroid/support/v4/provider/DocumentFile;
move-result-objectv0
.line286
:goto_0
#v2=(Conflicted);v3=(Conflicted);
return-objectv0
.line276
:cond_0
#v2=(Boolean);v3=(Uninit);
invoke-virtual{p0},Lfm/clean/storage/LocalFile;->n()Ljava/lang/String;
move-result-objectv2
#v2=(Reference,Ljava/lang/String;);
invoke-virtual{v0},Ljava/lang/String;->length()I
move-resultv0
#v0=(Integer);
add-int/lit8v0,v0,0x1
invoke-virtual{v2,v0},Ljava/lang/String;->substring(I)Ljava/lang/String;
move-result-objectv0
.line278
#v0=(Reference,Ljava/lang/String;);
invoke-static{v1},Landroid/net/Uri;->parse(Ljava/lang/String;)Landroid/net/Uri;
move-result-objectv2
invoke-static{v2},Landroid/provider/DocumentsContract;->getTreeDocumentId(Landroid/net/Uri;)Ljava/lang/String;
move-result-objectv2
const-stringv3,":"
#v3=(Reference,Ljava/lang/String;);
invoke-virtual{v2,v3},Ljava/lang/String;->split(Ljava/lang/String;)[Ljava/lang/String;
move-result-objectv2
.line279
aget-objectv2,v2,v4
.line281
#v2=(Null);
new-instancev3,Ljava/lang/StringBuilder;
#v3=(UninitRef,Ljava/lang/StringBuilder;);
invoke-direct{v3},Ljava/lang/StringBuilder;-><init>()V
#v3=(Reference,Ljava/lang/StringBuilder;);
invoke-virtual{v3,v1},Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-objectv1
const-stringv3,"/document/"
invoke-virtual{v1,v3},Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-objectv1
invoke-virtual{v1,v2},Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-objectv1
sget-objectv2,Ljava/io/File;->pathSeparator:Ljava/lang/String;
#v2=(Reference,Ljava/lang/String;);
invoke-virtual{v1,v2},Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-objectv1
invoke-static{v0},Landroid/net/Uri;->encode(Ljava/lang/String;)Ljava/lang/String;
move-result-objectv0
invoke-virtual{v1,v0},Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
move-result-objectv0
invoke-virtual{v0},Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-objectv0
.line283
const-stringv1,"android.support.v4.provider.TreeDocumentFile"
invoke-static{v1},Ljava/lang/Class;->forName(Ljava/lang/String;)Ljava/lang/Class;
move-result-objectv1
.line284
new-arrayv2,v7,[Ljava/lang/Class;
const-classv3,Landroid/support/v4/provider/DocumentFile;
aput-objectv3,v2,v4
const-classv3,Landroid/content/Context;
aput-objectv3,v2,v5
const-classv3,Landroid/net/Uri;
aput-objectv3,v2,v6
invoke-virtual{v1,v2},Ljava/lang/Class;->getDeclaredConstructor([Ljava/lang/Class;)Ljava/lang/reflect/Constructor;
move-result-objectv1
.line285
invoke-virtual{v1,v5},Ljava/lang/reflect/Constructor;->setAccessible(Z)V
.line286
new-arrayv2,v7,[Ljava/lang/Object;
const/4v3,0x0
#v3=(Null);
aput-objectv3,v2,v4
aput-objectp1,v2,v5
invoke-static{v0},Landroid/net/Uri;->parse(Ljava/lang/String;)Landroid/net/Uri;
move-result-objectv0
aput-objectv0,v2,v6
invoke-virtual{v1,v2},Ljava/lang/reflect/Constructor;->newInstance([Ljava/lang/Object;)Ljava/lang/Object;
move-result-objectv0
check-castv0,Landroid/support/v4/provider/DocumentFile;
goto:goto_0
.endmethod

接下来就是翻译和打断点调试了。
很遗憾,这里打断点会提示崩溃,所以就通过自己对smali和Java的语法和一些API资料琢磨琢磨。
APK反编译到这里就已经结束了,两天的研究暂且到此。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值