逆向笔记

Publish by https://www.leachchen.com/

概念

反编译后生成smali格式的反编译代码,然后阅读smali文件的代码来理解程序的运行机制,找到突破口,进行修改,最后使用APKTool重新编译生成APK文件,并签名。

使用apktool反编译后所有的索引值保存在string.xml文件同目录下的public.xml文件中

Smali是Dalvik的寄存器语言

Java 虚拟机运行的是Java字节码,Dalvik虚拟机运行的是Dalvik字节码,传统java程序经过编译,生成java字节码保存在class文件中,java虚拟机通过解码class文件中的内容来运行程序,而Dalvik虚拟机运行的是Dalvik字节码,所有的Dalvik字节码由java字节码转换而来,被打包到一个Dex可执行文件中,Dalvik虚拟机通过解释DEX文件来执行这些字节码。

apktool-反编译

apktool 地址:https://ibotpeaches.github.io/Apktool/

apktool d -f apk路径 -o 输出路径

apktool d -f D:\test.apk -o D:\MyPart\nixiang\fanbianyi\test

apktool-回编

apktool b 反编译出来的包路径 -o 输出路径的apk路径

apktool b D:\MyPart\nixiang\fanbianyi\test -o D:\MyPart\nixiang\fanbianyi\a.apk

密钥库文件生成

keytool -genkey -alias test.keystore -keyalg RSA -validity 20000 -keystore  test.keystore

其中,-genkey表示生成密钥,-alias表示密钥别名,-keyalg表示密钥的算法,-validity表示有效期,-keystor表示生成文件的名字
之后会提示输入相应的信息,输入后按Y确认即可。

签名

jarsigner -verbose -keystore test.keystore -signedjar testapk_signed.apk testapk.apk  test.keystore的别名(alias)

jarsigner -verbose -keystore D:\test.key  -signedjar D:\testapk_signed.apk D:\MyPart\nixiang\fanbianyi\a.apk test

-verbose表示显示出签名详细信息
-keystore表示使用当前目录中的test.keystore签名证书文件。
-signedjar testapk_signed.apk表示签名后生成的APK名称

testapk.apk表示未签名 的APK

test..keystore表示密钥的别名

生成Dex

javac Hello.javac

dx --dex --output=Hello.dex Hello.class

这样很可能生成不出dex文件来

出现:
trouble processing:
bad class file magic (cafebabe) or version (0034.0000)
...while parsing D:/MyPart/NiXiang/other/Hello.class
...while processing D:/MyPart/NiXiang/other/Hello.class
1 warning
no classfiles specified

解决办法:javac -source 1.6 -target 1.6 Hello.java

出现:
trouble processing:
class name (Hello) does not match path (D:/MyPart/NiXiang/other/Hello.class)
...while parsing D:/MyPart/NiXiang/other/Hello.class
...while processing D:/MyPart/NiXiang/other/Hello.class
1 warning
no classfiles specified

解决办法:如果我们使用javac -source 1.6 -target 1.6 D:\Android\sdkme\build-tools\25.0.1\Hello.java生成class文件并且有警告未设置引导类路径时,生成dex时使用class的相对路径如果我们是用Javac Hello.java生成的class文件,用dx.dat时就要用绝对路径来生成dex文件

出现:
UNEXPECTED TOP-LEVEL EXCEPTION:
java.lang.RuntimeException: Hello.class: file not found
        at com.android.dx.util.FileUtils.readFile(FileUtils.java:55)
        at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.j
ava:134)
        at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java
:109)
        at com.android.dx.command.dexer.Main.processOne(Main.java:422)
        at com.android.dx.command.dexer.Main.processAllFiles(Main.java:333)
        at com.android.dx.command.dexer.Main.run(Main.java:209)
        at com.android.dx.command.dexer.Main.main(Main.java:174)
        at com.android.dx.command.Main.main(Main.java:91)
1 error; aborting

解决办法:指定dx.bat路径为指定的版本的


完整生成命令:
javac -source 1.6 -target 1.6 Hello.java

E:\AndroidStudio\sdk\build-tools\25.0.0\dx.bat --dex --output=D:\MyPart\NiXiang\other\Hello.dex Hello.class

反编译dex成smali

之前是用一直报错:java -jar baksmali.jar -o baksmali Hello.dex

Exception in thread "main" com.beust.jcommander.MissingCommandException: Expecte
d a command, got -o
        at com.beust.jcommander.JCommander.parseValues(JCommander.java:725)
        at com.beust.jcommander.JCommander.parse(JCommander.java:304)
        at com.beust.jcommander.JCommander.parse(JCommander.java:287)
        at org.jf.baksmali.Main.main(Main.java:90)

解决方案:baksmali.jar disassemble Hello.dex

Leach Chen

Leach Chen

I am an Android developer.I will add description latter.