吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

搜索
查看: 2304|回复: 6

[Android CrackMe] JNI的方式来检测AndroidServiceHook(演示检测爆破签名校验)

[复制链接]
LivedForward 发表于 2019-9-20 10:16
CM是什么?Crackme是什么?这是什么东西?楼主发的什么?
他们都是一些公开给别人尝试破解的小程序,制作 Crackme 的人可能是程序员,想测试一下自己的软件保护技术,也可能是一位 Cracker,想挑战一下其它 Cracker 的破解实力,也可能是一些正在学习破解的人,自己编一些小程序给自己破解,KeyGenMe是要求别人做出它的 keygen (序号产生器), ReverseMe 要求别人把它的算法做出逆向分析, UnpackMe 是要求别人把它成功脱壳,本版块禁止回复非技术无关水贴。

本帖最后由 LivedForward 于 2019-9-21 21:10 编辑

之前的帖子:https://www.52pojie.cn/thread-1015426-1-1.html
检测系统关键API是否被JDK动态代{过}{滤}理Hook,以PackageManager为例,演示了如何检测App自身是否
被爆破签名校验.

这里我使用JNI方式来实现,也就是C++来编写.

Screenshot_2019-09-20-09-59-57-202_com.ckpms.png
代码如下:

int isHookPMS(JNIEnv *env){
        jobject cPMSO = getCurrentPMSObject(env);
        jclass cPMSC = (*env)->GetObjectClass(env, cPMSO);
        jclass cPMSFC =(*env)->GetSuperclass(env,cPMSC);
        jclass proxyClass = (*env)->FindClass(env,"java/lang/reflect/Proxy");
       if((*env)->IsAssignableFrom(env,  cPMSFC,proxyClass)){
                //PMS被Hook
        (*env)->DeleteLocalRef(env, cPMSO);
        (*env)->DeleteLocalRef(env, cPMSC);
        (*env)->DeleteLocalRef(env, cPMSFC);
        (*env)->DeleteLocalRef(env, proxyClass);
                return 1;
        }else{
        (*env)->DeleteLocalRef(env, cPMSO);
        (*env)->DeleteLocalRef(env, cPMSC);
        (*env)->DeleteLocalRef(env, cPMSFC);
        (*env)->DeleteLocalRef(env, proxyClass);
        return 0;
        }
}


jobject getCurrentPMSObject(JNIEnv *env){
        jclass activityThreadClass = (*env)->FindClass(env,"android/app/ActivityThread");
        jmethodID currentActivityThreadMethod = (*env)->
                   GetStaticMethodID(env,activityThreadClass,"currentActivityThread","()Landroid/app/ActivityThread;");
        jobject currentActivityThread = (*env)->CallStaticObjectMethod(env,activityThreadClass,currentActivityThreadMethod);
        jfieldID sPackageManagerFieldId = (*env)->GetStaticFieldID(env,activityThreadClass,"sPackageManager","Landroid/content/pm/IPackageManager;");
        jobject sPackageManager = (*env)->GetStaticObjectField(env,currentActivityThread,sPackageManagerFieldId);
        (*env)->DeleteLocalRef(env, activityThreadClass);
        (*env)->DeleteLocalRef(env, currentActivityThreadMethod);
        (*env)->DeleteLocalRef(env, currentActivityThread);
[size=33.9286px]   [size=33.9286px](*env)->DeleteLocalRef(env, sPackageManagerFieldId[size=33.9286px]);
  return sPackageManager;
}

测试APP下载地址:
链接:https://pan.baidu.com/s/1q4hPBivmyns98dMwAbGBMQ 提取码:5168

免费评分

参与人数 6吾爱币 +3 热心值 +4 收起 理由
Terco + 1 谢谢@Thanks!
若墟 + 1 楼主把这个demo分享出来呀
klxn0-0 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
少林大虾 + 1 我很赞同!
涛之雨 + 1 我很赞同!
九重桂妖 + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

九重桂妖 发表于 2019-9-20 10:42
这是高手
wu8511128 发表于 2019-9-20 10:43
涛之雨 发表于 2019-9-20 13:56
华为测试成功
所以要破解要改so。。。
没有电脑,用不了ida,回合结束
破解project 发表于 2019-9-20 15:05
帮忙格式化了一下

[C++] 纯文本查看 复制代码
int isHookPMS(JNIEnv *env){
        jobject cPMSO = getCurrentPMSObject(env);
        jclass cPMSC = (*env)->GetObjectClass(env, cPMSO);
        jclass cPMSFC =(*env)->GetSuperclass(env,cPMSC);
        jclass proxyClass = (*env)->FindClass(env,"java/lang/reflect/Proxy");
       if((*env)->IsAssignableFrom(env,  cPMSFC,proxyClass)){
                //PMS被Hook
        (*env)->DeleteLocalRef(env, cPMSO);
        (*env)->DeleteLocalRef(env, cPMSC);
        (*env)->DeleteLocalRef(env, cPMSFC);
        (*env)->DeleteLocalRef(env, proxyClass);
                return 1;
        }else{
        (*env)->DeleteLocalRef(env, cPMSO);
        (*env)->DeleteLocalRef(env, cPMSC);
        (*env)->DeleteLocalRef(env, cPMSFC);
        (*env)->DeleteLocalRef(env, proxyClass);
        return 0;
        }
}


jobject getCurrentPMSObject(JNIEnv *env){
        jclass activityThreadClass = (*env)->FindClass(env,"android/app/ActivityThread");
        jmethodID currentActivityThreadMethod = (*env)->
                   GetStaticMethodID(env,activityThreadClass,"currentActivityThread","()Landroid/app/ActivityThread;");
        jobject currentActivityThread = (*env)->CallStaticObjectMethod(env,activityThreadClass,currentActivityThreadMethod);
        jfieldID sPackageManagerFieldId = (*env)->GetStaticFieldID(env,activityThreadClass,"sPackageManager","Landroid/content/pm/IPackageManager;");
        jobject sPackageManager = (*env)->GetStaticObjectField(env,currentActivityThread,sPackageManagerFieldId);
        (*env)->DeleteLocalRef(env, activityThreadClass);
        (*env)->DeleteLocalRef(env, currentActivityThreadMethod);
        (*env)->DeleteLocalRef(env, currentActivityThread);
        return sPackageManager;
}
ytfrdfiw 发表于 2019-9-20 20:10
感谢分享。
青霄 发表于 2019-9-21 18:03
JNI是否可以调用C++操作windows上面程序内存呢
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2020-5-27 19:37

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表