关于安卓的调试方法(三)
Peanuts 移动安全 10797浏览 · 2019-04-20 00:06

so层调试深入及xposed入门使用

so层反调试的绕过

本文参考链接及附件地址:https://www.52pojie.cn/thread-749955-1-1.html

首先我们回顾一下我们在调试的时候会有那些特征

  1. 首先是端口,我们ida远程调试的时候利用的是23946
  2. 其次调试过程中进程的Traceid会非0
  3. 接着就是使用ida调试时会启动*_server文件可以对这个文件进程名进行检测,判断是否被调试。

demo静态分析

这里尝试用安卓分析的神器jeb,就是价格贵了点。。

java层分析

可以看见这里引用了so层的函数,checkport从这里看来可能会有检查在这里。

so层分析

checkport函数查找

对于so层的分析,思路一般是查看java层引用的函数checkport,但是查看会发现这里并没有,所以可能是动态注册,面对这样的问题可以查看.data.rel.ro.local一般动态注册的函数会在其中进行一个注册。

对于如何找到这个段:view->open subview->segments
这里能看见时对ida的port进行检测

.init_array段

这个段会先于JNI_Onload函数先执行,很多的反调试都会设置在这里。思路一样,查看这个段。

可以发现这里新建了一个进程且,利用进程执行了查看了程序的TraceId是否为0,如果不为0即退出。

JNI_Onload

这里也是反调试的重点如下图

可以发现这里检查了*_server的启动情况找到即退出程序

反调试思路

端口检查

针对端口只要更改attach的端口即可。这里就不贴图了

对于新建进程的检查&*_server检查

对判断语句进行一个patch即可,我这里打开的是x86所以直接jz改成jnz即可,利用的keypatch

xposed使用

因为版本的不同踩了很多坑最后才成功了,网上都是针对AS2018年上半年的版本的,更新贼多的AS变化多到我心力憔悴的找方法。。

xposed环境及安装

  1. 网易mumu模拟机安装xposed4.4.4以上版本,安装过程中会有产生一些问题我遇到的问题具体提示can't executable(具体的指令忘记了。。)大概解决的方法就是关闭==应用兼容==。
  2. 夜神模拟器,可以直接安装安装的版本为xposed4.4.4一下的版本,且这个环境更加适合新手入门
  3. 真机(由于本人资金短缺没有尝试。。)

简单的hook模块的编写及demo演示

对于模块编写我的态度是,如果只是尝试那这个可以不用学习,但是如果想深入对其中app的破解,脱壳等很感兴趣,学习如何自己编写是很重要的(一个菜鸡的理解。。

demo

首先写一个我们我们需要的去hook的demo,当然是越简单越好,百度了一下网上的资源基本是针对手机的imei值进行一个hook。那我们就动手做一个。

package com.example.test;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Button;
import android.view.View;
import android.telephony.TelephonyManager;
import android.content.Context;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = (Button)findViewById(R.id.getIMEI);

        button.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
                try {
                    Log.d("XLZH", "get imei " + tm.getDeviceId());
                    Log.d("XLZH", "get imsi " + tm.getSubscriberId());
                }catch (Exception e) {
                    Log.d("XLZH", e.getMessage());
                    e.printStackTrace();
                }
            }
        });
    }
}

这是MainActivity.java中的代码,因为改文章定位在小白入门,其中Button button =(Button)findViewById(R.id.getIMEI)这句话可能有些小白新建工程时候会报错,解释一下这里是在activity_main.xml中新建了一个Buntton按钮且命名为getIMEI。

效果图如下(button被我画的有点歪):

xposed模块编程基础知识

==依赖库==编程过程中需要用到很多封装好的对象方法,这里xposed提供了XposedBridgeApi-54.jar(更高版本的有其对应的89的包)

==入口函数==都会有一个入口函数,且其模版基本不会更改当然xxx处是可以任意更改。

public class xxx implements IXposedHookLoadPackage {
public void handleLoadPackage(LoadPackageParam lpparam) throws Throwable {
}
}
步骤详解
添加api

首先新建一个项目最好是空项目吧然后步骤是

XposedBridgeApi-54.jar包放入lib文件夹->右键选择add as library

更改app目录下的AndroidMainfest.xml文件及build.gradle文件

在AndroidMainfest.xml中的application中添加如下字段:

<meta-data
        android:name="xposedmodule"
        android:value="true" />
    <meta-data
        android:name="xposeddescription"
        android:value="模块描述" />
    <meta-data
        android:name="xposedminversion"
        android:value="54" />

在build.gradle文件中查看一下libc文件的导入使用的申明==AS2+==版本需要把compile指令换成为provided。==AS3+==provided指令已在2018年底被compileOnly所代替。同时要把最上面一行更改了provide

编写xposed模版

先直接贴出代码,里面已经详细的写了注释。然后build接着安装启用然后重启手机

运行图片

首先贴出demo正常运行时候的图片

再贴出一张hook之后运行的图片

1 条评论
某人
表情
可输入 255