在监控apk行为时,可能需要smail hook。具体流程如下:给大家推荐高级工具Virtuous Ten Studio。
•解包并反编译Android程序成Smali指令代码
•插入监控程序段至反编译后Smali代码中
•监控程序段用于监控Android程序运行过程中的运行行为
•修改Android程序调用系统API所传的参数或API的返回值
•重新编译修改后的Smali代码并打包为新的Android程序
•运行重新编译的新Android程序,并通过插入的监控程序段获取该Android程序的运行行为数据
但smail hook存在一些不足的地方,比如:
•利用so实现相应的功能.
•利用反射机制调用相应的功能
•加载jar作为代码执行
1、比如下面通过so实现的!
http://blog.csdn.net/gg137608987/article/details/7572372
Activity代码:
- package com.test.jniclass;
- import android.app.Activity;
- import android.os.Bundle;
- public class AndroidJniClassDemo extends Activity {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- executeMethod();
- }
- private void show(){
- System.out.println("AndroidJniClassDemo show function");
- }
- private int intShow(){
- System.out.println("AndroidJniClassDemo intShow function");
- return 1;
- }
- private native void executeMethod();
- static{
- System.loadLibrary("AndroidJniDemo");
- }
.c文件代码:
- #include<jni.h>
- #include<stdio.h>
- #include<android/log.h>
- JNIEXPORT void JNICALL Java_com_test_jniclass_AndroidJniClassDemo_executeMethod (JNIEnv *env, jobject obj)
- {
- jclass clazz = (*env)->GetObjectClass(env,obj); //通过类的对象
- jmethodID mid = (*env)->GetMethodID(env,clazz,"show","()V");//查找java中的show方法的ID,最后的签名符号为void类型
- if(mid == NULL)
- {
- __android_log_print(ANDROID_LOG_INFO,"HGY", "method show ID not found");
- return; //如果方法ID没有找到
- }
- jmethodID intshowID = (*env)->GetMethodID(env,clazz,"intShow","()I");
- if(intshowID == NULL)
- {
- __android_log_print(ANDROID_LOG_INFO,"HGY", "method intShow ID not found");
- return; //如果方法ID没有找到
- }
- __android_log_print(ANDROID_LOG_INFO,"HGY", "will execute show function");
- (*env)->CallVoidMethod(env,obj,mid); //执行show方法
- __android_log_print(ANDROID_LOG_INFO,"HGY", "will execute intShow function");
- (*env)->CallIntMethod(env,obj,intshowID); //执行show方法
- }
这个就是标准的hook api流程:这个后续专门介绍一下,很多同志们搞这个!
•利用ptrace函数attach到zygote进程,使该进程暂停运行.
•获取并保存zygote进程当前的寄存器
•在目标进程申请内存
•写入soloader代码到目标进程
•设置目标进程寄存器,执行soloader代码.
•加载so实现inlinehook.
•恢复目标进程寄存器,并恢复执行.
•对新创建的进程执行的功能进行监控输出.
3、模拟器对抗
有些apk会检测环境,防止被**。这些都是可以通过hook代码实现欺骗。
运行环境随机化,如:手机型号、IMEI、手机号等
时间环境模拟,如:样本需要半夜运行、样本延时4小时运行等
手机网络模拟,如:2G、3G、WIFI
检测第三方程序,如:样本触发需要第三方浏览器、杀毒软件等
隐私环境模拟,如:短信、通讯录、拨号记录等