so层调试深入及xposed入门使用
so层反调试的绕过
本文参考链接及附件地址:https://www.52pojie.cn/thread-749955-1-1.html
首先我们回顾一下我们在调试的时候会有那些特征
- 首先是端口,我们ida远程调试的时候利用的是
23946
- 其次调试过程中进程的
Traceid
会非0 - 接着就是使用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环境及安装
- 网易mumu模拟机安装xposed4.4.4以上版本,安装过程中会有产生一些问题我遇到的问题具体提示
can't executable
(具体的指令忘记了。。)大概解决的方法就是关闭==应用兼容==。 - 夜神模拟器,可以直接安装安装的版本为xposed4.4.4一下的版本,且这个环境更加适合新手入门
- 真机(由于本人资金短缺没有尝试。。)
简单的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之后运行的图片