Android逆向-Android逆向基础10(so⽂件分析⼤合集)0x00 前⾔
导航
博客导航
练习资源
说明
在so⽂件的分析上,我们需要对⼀些ARM汇编的逻辑实现。
在代码逻辑上,只对if,switch,还有循环进⾏⼀个demo分析和创建。可能会篇幅⽐较⼤。
内容
1.if逻辑NDK编程
2.if逻辑ARM分析
3.switch逻辑NDK编程
4.switch逻辑ARM分析
5.循环逻辑NDK编程
6.循环逻辑ARM分析
0x01 if逻辑NDK编程
demo使⽤之前的demo,如果有兴趣,可以去看看
博客导航
说明
demo主要实现⼀个输⼊,然后根据输⼊的内容返回不同的内容。在Native层进⾏实现。
第⼀步函数书写
⾸先添加⼀个函数,然后使⽤ ALT+Enter进⾏⾃动创建
第⼆步⾃动⽣成
在.cpp⽂件⾥会⾃动⽣成⼀个函数
JNIEXPORT jstring JNICALL
Java_com_example_hanlei_myapplication_MainActivity_panduan(JNIEnv *env, j object instance, jint i) {
// TODO
return env->NewStringUTF(returnValue);
}
第三步编写c语⾔代码
JNIEXPORT jstring JNICALL
Java_com_example_hanlei_myapplication_MainActivity_panduan(JNIEnv *env, jobject instance, jint i) {
if (i==1)
{
return env->NewStringUTF("I LOVE YOU!");
}
return env->NewStringUTF("Sorrry");
}
第四步编写xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="schemas.android/apk/res/android"
xmlns:app="schemas.android/apk/res-auto"
xmlns:tools="schemas.android/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="application.MainActivity">
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/et"
android:hint="请输⼊数字"
android:numeric="integer"
/>
<TextView
android:id="@+id/sample_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hai ,my Love"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Go"
android:id="@+id/btn"/>
</LinearLayout>
第五步,逻辑编写
这个是MainActivity的代码。
text函数什么意思这个是主要的代码。
第六步
测试
package  application;
import  android.support.v7.app.AppCompatActivity;
import  android.os.Bundle;
import  android.view.View;
import  android.widget.EditText;
import  android.widget.TextView;
public  class  MainActivity  extends  AppCompatActivity  {
private  TextView tv;
private  EditText et;
// Used to load the 'native-lib' library on application startup.
static  {
System.loadLibrary("native-lib");
}
@Override
protected  void  onCreate (Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Example of a call to a native method
tv = (TextView) findViewById(R.id.sample_text);
et=findViewById();
findViewById(R.id.btn).setOnClickListener(new  View.OnClickListener() {
@Override
public  void  onClick (View view) {
tv.setText(panduan(Integer.Text().toString())));
}
});
}
/**
* A native method that is implemented by the 'native-lib' native library,
* which is packaged with this application.
*/
public  native  String stringFromJNI ();
public  native  String getHelloJni ();
public  native  void  updateFile (String path);
public  native  String panduan (int  i);}
findViewById(R .id.btn ).setOnClickListener (new View .OnClickListener () {
@Override
public void onClick(View view) {
tv .setText (panduan(Integer .parseInt (et .getText ().toString ())));
}
});
总结
很简单,不过多解释。
0x02 if逻辑反汇编分析
反汇编分析,当然是要丢在IDA⾥进⾏分析了。
这⾥有个问题就是,IDA只有32位才可以使⽤F5插件,我之前不知道,坑了好久。 我假装⾃⼰不知道⾃⼰的函数名称啊什么的。就按照流程进⾏分析。
本来第⼀步是要进⾏试玩的,demo试玩我就算了吧。
第⼀步,反编译,到函数。
反编译,Android Killer
到函数之后进⾏反汇编。
第⼆步,反汇编
双击进⼊函数。
第三步 F5插件
F5插件真的⽐较好⽤,但是我们还是以ARM为主。
第四步 ARM分析
⾸先来看下流程图
从流程图上可以看到这是⼀个if逻辑的流程图。
我们来看主要代码
.text:00004644PUSH            {R7,LR}
.text:00004646MOV            R7, SP
.text:00004648SUB            SP, SP, #0x20
.text:0000464A                MOV            R3, R2
.text:0000464C                MOV            R12, R1
.
text:0000464E                MOV            LR, R0
.text:00004650                STR            R0, [SP,#0x28+var_10]
.text:00004652                STR            R1, [SP,#0x28+var_14]
.text:00004654                STR            R2, [SP,#0x28+var_18]
.text:00004656                LDR            R0, [SP,#0x28+var_18]
.text:00004658                CMP            R0, #1
.text:0000465A                STR            R3, [SP,#0x28+var_1C]
.text:0000465C                STR.W          R12, [SP,#0x28+var_20]
.text:00004660                STR.W          LR, [SP,#0x28+var_24]
.text:00004664                BNE            loc_4676
.text:00004666                B              loc_4668
PUSH            {R7,LR}
PUSH 是⼊栈的意思
R7是通⽤寄存器
LR就是:R14:链接寄存器(LR) LR是链接寄存器,是ARM处理器中⼀个有特殊⽤途的寄存器,当调⽤函数时,返回地址即PC的值被保存到LR中(mov lr,pc)。
那么这句话的意思就是把R7 和LR⼊栈
MOV            R7, SP
这句话好理解,就是把sp的值给R7。
在随机存储器区划出⼀块区域作为堆栈区,数据可以⼀个个顺序地存⼊(压⼊)到这个区域之中,这个过程称为‘压栈’(push )。通常⽤⼀个指针(堆栈指针 SP—Stack Pointer)实现做⼀次调整,SP 总指向最后⼀个压⼊堆栈的数据所在的数据单元(栈顶)。
SUB            SP, SP, #0x20
SUB 是减法运算。
简单的翻译⼀下就是:sp=sp-#0x20
这⾥的#0x20就是⼗六进制的意思。
MOV            R3, R2
R3=R2
MOV            R12, R1
R12=R1
MOV            LR, R0
LR=R0
STR            R0, [SP,#0x28+var_10]
STR{条件} 源寄存器,<;存储器地址>
STR指令⽤于从源寄存器中将⼀个32位的字数据传送到存储器中。该指令在程序设计中⽐较常⽤。
翻译⼀下就是 把R0这⾥的数据送到[SP,#0x28+var_10]中

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。