一.下载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à你的工程目录;

打开之后如下图:

反编译so文件为Java文件 如何反编译so文件_java

双击展开smalià右键单击àReplace in Path

反编译so文件为Java文件 如何反编译so文件_java_02

填写完要替换的数据后点击Find,这样就能把要完成所有的替换了。

(c).替换res下的包名:跟步骤(b)类似,这里就不相信说了。

2>.修改Smali 代码:如果要修改Smali代码,就要稍微了解一下smali语法,这里就不细讲了,附上一个博客地址:,如要往一个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定位断点并实时调试,就可以事半功倍