吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 8226|回复: 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++来编写.


代码如下:

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);
  (*env)->DeleteLocalRef(env, sPackageManagerFieldId);
  return sPackageManager;
}

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册[Register]

x

免费评分

参与人数 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++] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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, 2025-4-25 14:09

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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