关于安卓的调试方法(三)

2019-04-20 约 2017 字 预计阅读 5 分钟

声明:本文 【关于安卓的调试方法(三)】 由作者 Peanuts 于 2019-04-20 08:06:00 首发 先知社区 曾经 浏览数 106 次

感谢 Peanuts 的辛苦付出!

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之后运行的图片

关键词:[‘安全技术’, ‘移动安全’]


author

旭达网络

旭达网络技术博客,曾记录各种技术问题,一贴搞定.
本文采用知识共享署名 4.0 国际许可协议进行许可。

We notice you're using an adblocker. If you like our webite please keep us running by whitelisting this site in your ad blocker. We’re serving quality, related ads only. Thank you!

I've whitelisted your website.

Not now