一.下载apktool(这个就去百度,Google吧,很多的)
二.使用apktool 反编译
三.修改反编译的工程
1>.修改包名(如果往GooglePlay上发布应用,会验证包名,如果有重复的包名,会上传失败)
(a).包名修改包含so文件下的包名修改和smali代码里包名的修改,还有res文件夹下资源下的一些引用包名的修改
(b).so文件下的包名修改:使用UtraEdit打开so文件,里面显示内容为16进制,但是英文字符串显示正常,一般包名就在英文字符串里,使用Ctrl+F;查找一下 ,然后替换成要修改的包名,比如美图秀秀的so,根据包名路径,搜索包名是一定要在前面加一个“/” , 找到包名之后,把已有包名改成自己想要的包名,一般修改最后一个字母即可。
(c)根据以上步骤把所有的so文件都查找修改一遍,不要遗漏;
(d)smali 代码中的包名修改:为了简单操作,使用工具JetBrains PyCharm Community Edition(http://www.jetbrains.com/pycharm/),这个工具好像是Python的,感觉很不错,有些像intellij idea;打开软件后,FileàOpenà你的工程目录;
打开之后如下图:
双击展开smalià右键单击àReplace in Path
填写完要替换的数据后点击Find,这样就能把要完成所有的替换了。
(c).替换res下的包名:跟步骤(b)类似,这里就不相信说了。
2>.修改Smali 代码:如果要修改Smali代码,就要稍微了解一下smali语法,这里就不细讲了,附上一个博客地址:http://www.cnblogs.com/lee0oo0/p/3728271.html,如要往一个Smali里文件里添加代码,那么也要使用smali语法,所以在最好先将自己写好的代码编译后,然后再反编译成smali,然后copy过去就好。这里主要讲讲如何在调试反编译后的Smali工程。
以下步骤参考:http://bbs.pediy.com/showthread.php?t=189610
(a) 首先要将apk反编译,还是使用apktool,命令如下:
java -jar apktool.jar d -d myapp.apk -o out (这里一定要用-d,否则得不到。Java的文件,另:out是一个路径,用来存放反编译后的工程)
(b) 找到反编译好的工程目录,设置调试标记,调试标记要在清单文件中设置,找到application节点,设置属性android:debuggable="true"
(c) 找到主Activity,即在清单文件中action为main,category 为Launcher的Activity,找到它的onCreate 方法,在第一行添加如下代码:(要带上前面的a=0//)
a=0;// invoke-static {}, Landroid/os/Debug;->waitForDebugger()V
(d) 保存文件后,然后将文件重新打包成apk,命令如下
java -jar apktool.jar b -d out -o debug.apk
(e) 将重新打包的Apk安装到手机或模拟器上,打开运行,会看到白屏,这是因为在刚执行onCreate()方法就添加了WAITFORDEBUGGER代码,所以为停到这里,会一直挂起,在这里不要退出。
(f) 这里就要开始设置调试环境:把反编译之前生成的工程删掉build文件夹。
(g) 打开eclipse,创建一个Java工程 File -> New -> Project -> Java Project ,Use default location选项去掉,Location选择out(你反编译的工程文件夹)文件夹,然后Next,
(h) 将smali文件夹设置为如下
(i) 在Eclipse中找到主Activity,然后找到onCreate方法,在
a=0;// invoke-static {}, Landroid/os/Debug;->waitForDebugger()V;找到一个你想调试的方法添加断点就可以了,
(j) 打开DDMS,如过按以上步骤做了的话,应该会找到调试程序,如下图所示,其中对应程序最后一栏为8601/8700,其中8601即为调试该程序的端口。
(k) 回到Eclipse,找到菜单Run -> Debug -> Debug Configurations
(l) 以上设置之后,就可以点击Debug,开始调试了,这时Eclipse会自动切换至DEBUG视图,并看到程序已经运行并中断在下一行可执行的代码了,相关的变量可以直接查看了。
注; 已经可以用eclipse调试smali了,上面的例子是从程序开头的地方开始调试,但要调试到自己所关心地方的代码处确实麻烦。建议先用jd-gui等软件直接查看反编译的java代码,确定要调试的位置后,再进入smali定位断点并实时调试,就可以事半功倍