Android逆向之旅

本文开始记录我学习android 逆向的全部过程 和参考文献.您需要有一定android开发经验在做逆向也不迟.我觉得如果一个不会android的学逆向 他只是一个略懂的人.

apk打包流程

我觉得很有必要了解,因为掌握这部分知识其实你可以自己做一些逆向工具,而不是有求于人.比如说你可以做java2smali或者smali2java

基本apk打包流程:
https://www.jianshu.com/p/7c288a17cda8


关于apk中META-INF:
https://blog.csdn.net/lewif/article/details/49154847


[可选,强烈建议]手动开始打包一次apk

https://juejin.im/entry/58c0ca14128fe100601dfc0e

smali语法

我们在学习javase的时候用的虚拟机(jvm)是hotpot(当然你不知道也没关系,可以顺带了解,想具体学习可以参考周志明老师的书籍).
hotpot它是Sun JDK和OpenJDK中所带的虚拟机,也是目前使用范围最广的Java虚拟机。
然而Android用的是自己研发的虚拟机Dalvik.所以运行字节码也有所不同现在我们来对比查看下.

先来看下java源文件

//Hello.java
public class Hello {


    public static void main(String[] argc){

        int i = 0;
        System.out.println("hello "+i);


    }
}

上面源码对应的Hotpot虚拟机字节码:

可以用javap -c XXX.class 查看对应字节码
Android逆向之旅_第1张图片

上面源码对应的Android虚拟机字节码:

.class public LHello;
.super Ljava/lang/Object;
.source "Hello.java"


# direct methods
.method public constructor ()V
    .registers 1

    .prologue
    .line 1
    invoke-direct {p0}, Ljava/lang/Object;->()V

    return-void
.end method

.method public static main([Ljava/lang/String;)V
    .registers 5

    .prologue
    .line 6
    const/4 v0, 0x0

    .line 7
    sget-object v1, Ljava/lang/System;->out:Ljava/io/PrintStream;

    new-instance v2, Ljava/lang/StringBuilder;

    invoke-direct {v2}, Ljava/lang/StringBuilder;->()V

    const-string v3, "hello "

    invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v2

    invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;

    move-result-object v0

    invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v0

    invoke-virtual {v1, v0}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V

    .line 10
    return-void
.end method

java直接翻译成smali工具大家可以自己利用qt或者MFC做一个(原理教程:java2smali原理),这里我直接推荐一个工具链接: https://pan.baidu.com/s/1EjbjMShxAGi5B5S-LZO49A 密码: 8w14

语法学习:
https://blog.csdn.net/lpohvbe/article/details/7981386
https://blog.csdn.net/woblog/article/details/52106571
语法手册
https://blog.csdn.net/qq373432361/article/details/49557579
看以上两篇其实也足够平常使用了

动态调试

旧版调试:
缺点速度慢,配置罗嗦了点.但是可以动态修改
https://blog.csdn.net/qfanmingyiq/article/details/81044013
新版调试:
https://blog.csdn.net/hanchaohao2012/article/details/63253725

调试技巧

可以用Traceview来进行查看哪个方法调用频率高

https://blog.csdn.net/innost/article/details/9008691

查看线程的调用栈

Thread.dumpStack();

IDA PRO 调试

So格式
https://www.jianshu.com/p/ef462437b999
https://bbs.pediy.com/thread-221821.htm

你可能感兴趣的:(安卓)