这里先提一种针对性校强但简单好理解的办法,纯Java实现,代码大概也就50行不到吧。

还有更强的并且能过各种保护(反调试反HOOK反内存修改等等)的万能方法,不过较复杂,长篇大论的,等有空整理出来再提

本文适用场景:

1.需要重打包APK给普通用户,没有root权限也没有HOOK框架

2.so很难脱壳修复分析修改,或者逆向时间会很长很长。

3.so中调用了this.getPackageManager().getPackageInfo来获取签名进行校验

故事开始,某天,你暗恋的女神需要某个app的VIP,怎奈你兜兜空空如也,根本买不起VIP,然后你发现这个app的VIP是本地判断的,于是……

经过一番折腾,很快就改好了APK,重打包安装运行。提示非法操作?

又一番折腾,发现程序主要逻辑在so中,so被混淆的面目全非还进行了加固,最后发现在so中进行了APK签名校验,于是用hook过了签名校验,正常运行,VIP到手。

可是这样怎么发给女神呢?女神的手机没有root也没有hook框架。分析so?实在太复杂了,一时半会根本来不及,要让女神等你三五十天?恐怕到时候是备胎都当不成了吧。

怎么办?

总体思路:

既然修改so不成,也无法使用hook框架,那么就从别处入手。

本文用本人曾经悬赏过的加固APK(悬赏期内没人破解成功,加固强度还可以)进行分析:

由于so非常复杂,时间关系直接放弃分析。通过HOOK发现so的中签名校验是通过this.getPackageManager().getPackageInfo来获取的,于是想法就来了——

这个this是MainActivity的实例,所以这个this是一个很大的突破口:

思路活跃的同学可能已经发现了,只要覆盖MainActivity的getPackageManager就行了。

具体过程如下:

1.写一个HookPackageManager,专门用来HOOK各种PM相关方法:

public class HookPackageManager extends PackageManager {

    private PackageManager mBase; //用来做适配,返回其他信息

    public HookPackageManager(PackageManager base) {
mBase = base;
} @Override
public PackageInfo getPackageInfo(String packageName, int flags)
throws NameNotFoundException {
if (!"ywt.android.test6".equals(packageName)) {
//如果不是目标APK,则返回原始数据
return mBase.getPackageInfo(packageName, flags);
}
PackageInfo pkgInfo = new PackageInfo();
pkgInfo.signatures = new Signature[] {
new Signature(new byte[] {
//这是填写原始APK中读到的签名,用来欺骗so,很长就不贴了,后面会给出APK,反编译看即可。
})
};
return pkgInfo;
} //下面还有很多需要implements的方法,太多了,就不写了,后面会给出APK,反编译看即可,只要用mBase一一调用返回即可。
}

2.写一个HookMainActivity,代码如下:

public class HookMainActivity extends Activity {

    @Override
public PackageManager getPackageManager() {
//由于调用的是this.getPackageManager(),所以只要重写getPackageManager,返回一个伪造的实例,就可以实现欺骗
PackageManager pm = new HookPackageManager(super.getPackageManager());
return pm;
}
}

3.将写好的Java代码反编译为smali,将crackme.apk也反编译为smali,然后将crackme中的MainActivity.smali中的父类修改为继承HookMainActivity

4.重新打包APK,就可以绕过APK的签名校验啦。

重打包APK绕过签名校验的更多相关文章

  1. Android5.1.1 - APK签名校验分析和修改源码绕过签名校验

    Android5.1.1 - APK签名校验分析和修改源码绕过签名校验 作者:寻禹@阿里聚安全 APK签名校验分析 找到PackageParser类,该类在文件“frameworks/base/cor ...

  2. Apk去签名校验详解

    某些apk为了防止重打包,使用了签名校验.所以在破解的时候我们需要破解签名校验.在定位签名校验位置时常用的关键词有sign,signature,checkSign,signCheck,getPacka ...

  3. IDA硬编码修改SO,重新打包APK绕过FRIDA反调试

    该案例来自看雪 通过IDA修改SO 找到检测点 修改字符串 双击该字符串进入TEXT VIEW 选择 HEX VIEW 修改十六进制 右击EDIT 修改字符 右击 菜单栏-> edit -> ...

  4. unity 打包Apk生成签名证书keystore

    进行Android项目开发中想要将androidapp导出为apk的时候需要选择一个数字证书,即keystore文件(android.keystore),它用来对我们的APP进行签名,是导出APP的一 ...

  5. 转: APK签名校验绕过

    转: http://drops.wooyun.org/mobile/4296 APK签名校验绕过 3xpl0it · 2014/12/11 10:41 0x01 Android签名机制 将APK重命名 ...

  6. apk文件签名绕过

    声明: 1.本文转载自:http://www.2cto.com/Article/201311/256406.html,为了留作日后参考上传博客 2.如有转载请复试上面连接,尊重原创 apk文件签名绕过 ...

  7. 一次简单的绕过apk签名校验

    朋友发来一个apk,需要分析其中的一些算法,分析过程涉及到了重新打包apk,打包后的apk运行失败,估计是apk内部有检验是否被篡改的代码.检验apk是否被篡改,简单的方法是直接校验签名,如果apk签 ...

  8. APK签名校验绕过

    APK签名校验绕过 Android JNI 获取应用签名 android apk 防止反编译技术第一篇-加壳技术 android apk 防止反编译技术第五篇-完整性校验 利用IDA Pro反汇编程序 ...

  9. android逆向基础:apk 反编译 重打包 重签名

    apk 反编译大家都比较熟悉,这里只做一个笔记. 1 反编译 apk apktool d perfect.apk 这样就把资源文件解压缩了, classes.dex 也反编译成了 smali 文件 2 ...

  10. ApkTool反编译apk,去除广告或者汉化后重新打包apk,并签名

    http://my.oschina.net/mopidick/blog/135581 以ubuntu的环境为例子,window的大同小异 首先下载apktool工具:https://code.goog ...

随机推荐

  1. LeetCode 删除数组中重复项 26 80

    26(80) 给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素只出现一次(使得出现次数超过两次的元素只出现两次 ) ,返回删除后数组的新长度.元素的 相对顺序 应该保 ...

  2. 图论之最小生成树问题(kruskal)

    最近有几位同学催我更新,于是来摸摸鱼,来讲一下最小生成树问题. 所谓最小生成树(MST),就是在一张无向带权图中的一棵经过所有节点,边权和最小的一棵树.在实际生活中,可以运用于城镇之间的修路上. 对于 ...

  3. docker知识篇

    什么是Docker?Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的.可移植的.自给自足的容器.开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机).b ...

  4. css穿透

    https://www.cnblogs.com/linjiangxian/p/13183412.html

  5. Oracle账户被锁住,解锁

    转载自:https://blog.csdn.net/weixin_43464743/article/details/121226334 方法一PLSQL解锁1.用dba用户登录plsql.2.左侧选择 ...

  6. win10系统格式化后进行虚拟分区

    1. 目的 目前win10磁盘分区多数人采用两种方式: 1:只分一个C盘,文件在C盘以目录区分. 缺点:所有文件都在一起,区分查找比较麻烦. 2:物理分区,分多个盘,如C,D,E等等 缺点:容量固定, ...

  7. ZFBJ - 1 - 42 - NO.2

  8. 实验3 C语言分支语句和循环语句编程应用

    任务一 #include<math.h> #include<stdio.h> int main() { float a,b,c,x1,x2; float delta,real, ...

  9. Eclipse's Patching Codes Automatically

    如何把等号左边的赋值等式补齐? 想把queryRunner.query(conn, sql,new BeanListHandler<>(type), params); 的等号左边代码(返回 ...

  10. word多级标题自动编号设置

    1.选择段落 ->多级列表 ->定义新的多级列表 2.级别设置 ,这里操作比较繁琐,要多注意[输入编号的格式]要通过[包含的级别编号来自]这一项目来设定 标题1: 标题2 标题3: 标题4 ...