classes.dex硬编码后重签名安装
2019独角兽企业重金招聘Python工程师标准>>>
前言:
1、很多APK用apktool反编译后,重打包失败;
2、dex中smali指令硬编码,安装失败;
解决方法:
一、针对第一个问题,就是不反编译APK,而是直接从APK包从用Zip工具(winzip)将classes.dex提取出来,再使用IDA等反编译工具找到要修改指令的偏移,最后使用winhex等编辑工具修改指令,然后保存即可;
详细修改指令的方法是将OPCODE直接填充到相应位置即可:
原始JAVA代码如下:
public static void b(String arg4, String arg5, int arg6, Throwable arg7) {Log.d(arg4, arg5);return;}
IDA中此代码的opcode如下:
二、针对第二个问题,在classes.dex硬编码完成后,需要校正checksum和signture,使用下面的java程序修正classes.dex,
代码如下:
package javaproject;import java.security.*;
import java.util.zip.Adler32;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.FileOutputStream;public class ReDEX {public static void main(String[] args) {if (args.length == 1) {try {File file = new File(args[0]);byte[] barr = null;barr = getBytesFromFile(file);System.out.print("Original Checksum: ");for(int i = 8; i<12; i+=4)System.out.printf("0x%02X%02X%02X%02X ", barr[i+3], barr[i+2], barr[i+1], barr[i]);System.out.print("\nOriginal Signature: 0x");for(int i = 12; i<32; i+=4)System.out.printf("%02X%02X%02X%02X ", barr[i], barr[i+1], barr[i+2], barr[i+3]);calcSignature(barr);calcChecksum(barr);System.out.print("\n\nNew Checksum: ");for(int i = 8; i<12; i+=4)System.out.printf("0x%02X%02X%02X%02X ", barr[i+3], barr[i+2], barr[i+1], barr[i]);System.out.print("\nNew Signature: 0x");for(int i = 12; i<32; i+=4)System.out.printf("%02X%02X%02X%02X ", barr[i], barr[i+1], barr[i+2], barr[i+3]);try{String str = readUserInput("\nSave it(Yes or No):");if (str.equalsIgnoreCase("yes")) {putBytesToFile(barr, args[0]);System.err.println("\nFixed.");System.err.println(args[0]);} else{System.err.println("\nNothing");}}catch(IOException except){except.printStackTrace();}}catch (Exception e) {System.err.println("File input error");}}elseSystem.out.println("Invalid parameters");}private static String readUserInput(String prompt) throws IOException {System.out.print(prompt);InputStreamReader is_reader = new InputStreamReader(System.in);return new BufferedReader(is_reader).readLine();}public static byte[] getBytesFromFile(File file) throws IOException {InputStream is = new FileInputStream(file);// Get the size of the filelong length = file.length();if (length > Integer.MAX_VALUE) {// File is too large}// Create the byte array to hold the databyte[] bytes = new byte[(int)length];// Read in the bytesint offset = 0;int numRead = 0;while (offset < bytes.length && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {offset += numRead;}// Ensure all the bytes have been read inif (offset < bytes.length) {throw new IOException("Could not completely read file "+file.getName());}// Close the input stream and return bytesis.close();return bytes;}public static void putBytesToFile(byte[] data, String outfile) throws IOException {File destinationFile = new File(outfile);if (destinationFile.exists()) {System.out.println("overwrite");}FileOutputStream fos = new FileOutputStream(destinationFile);try {fos.write(data, 0, data.length);fos.flush(); fos.close();} catch (IOException e) {System.out.println(e);} }private static void calcSignature(byte bytes[]){MessageDigest md;try{md = MessageDigest.getInstance("SHA-1");}catch(NoSuchAlgorithmException ex){throw new RuntimeException(ex);}md.update(bytes, 32, bytes.length - 32);try{int amt = md.digest(bytes, 12, 20);if(amt != 20)throw new RuntimeException((new StringBuilder()).append("unexpected digest write:").append(amt).append("bytes").toString());}catch(DigestException ex){throw new RuntimeException(ex);}}private static void calcChecksum(byte bytes[]){Adler32 a32 = new Adler32();a32.update(bytes, 12, bytes.length - 12);int sum = (int)a32.getValue();bytes[8] = (byte)sum;bytes[9] = (byte)(sum >> 8);bytes[10] = (byte)(sum >> 16);bytes[11] = (byte)(sum >> 24);}
}
将修正好的dex直接替换进原始的APK中,重新签名安装会报INSTALL_PARSE_FAILED_NO_CERTIFICATES错误,此时使用jdk中jarsigner验证APK中签名问题,如下:
$jarsigner.exe -verify mod_sign.apk
jarsigner: java.lang.SecurityException: invalid SHA1 signature file digest for classes.dex
提示这种错误是因为原始APK中的签名文件没有删除掉,将META-INF下面的*.RSA、*.SF删除后,重新签名,就可以安装成功。
转载于:https://my.oschina.net/u/2424583/blog/619260
classes.dex硬编码后重签名安装相关推荐
- apk加固后重签名-mac
apk加固后重签名 签名工具的区别 进入签名工具目录 签名 签名验证 apk升级发版本前需要做安全检测,检测之前一般会进行加固处理,加固完成后,还需要对apk包进行重新签名. 有文章说需要把apk原来 ...
- iOS 用通用测试证书通过爱思助手重签名安装测试IPA
其他步骤跟其他证书生成一样 在配置bundle ID的时候要注意:写com.* 就可以了 通过爱思助手 - 工具箱 - IPA签名 - 证书签名 注意:通用证书里面要包含测试设备的ID才可以安装,重签 ...
- 逆向-002-iOS重签名
在Windows环境下会有,静默安装.通过iOS应用重签名(安装app到手机上),苹果签名机制,防止未授权的应用进行安装 ①获取应用ipa ②Codesign重签名 ③Xcode自动签名 ④Shell ...
- 专注于非越狱环境下iOS应用逆向研究,从dylib注入,应用重签名到App Hook
专注于非越狱环境下iOS应用逆向研究,从dylib注入,应用重签名到App Hook. 注意!本文所有操作均在以下环境下成功进行,不同平台或环境可能存在某些问题,欢迎大家在issue中提出问题以及相互 ...
- 解决iOS版抖音破解重签名后无法安装
解决iOS版抖音破解重签名后无法安装 回顾 上篇文章讲到 抖音9.8.1无法安装报错 DuplicateIdentifier 这个里更正下:版本为10.4.0 错误详细信息怎么查看 这里可以通过移动设 ...
- 海马苹果助手ipad版_iOS逆向-ipa包重签名及非越狱手机安装多个微信!
前一段时间学了点儿逆向相关的一些东西,但是都是基于越狱手机上的操作,给视频类应用去广告之类的.随着苹果生态圈的逐渐完善.及苹果对自身系统的保护越来越严格,导致现在的iPhone手机并不像以前那样存在大 ...
- iOS逆向-ipa包重签名及非越狱手机安装多个微信
前一段时间学了点儿逆向相关的一些东西,但是都是基于越狱手机上的操作,给视频类应用去广告之类的.随着苹果生态圈的逐渐完善.及苹果对自身系统的保护越来越严格,导致现在的iPhone手机并不像以前那样存在大 ...
- iOS逆向(1)——利用ipa重签名,3分钟iPhone安装多个微信
本文要达成如图效果,在一台iPhone上安装第二个微信: 准备: Xcode 微信ipa(可通过iTool进行下载) 重签名脚本 步骤 打开Xcode,新建Single View App项目,名字可以 ...
- 通过resign.jar重签名apk后出现raw目录下文件未找到的解决方法
问题: 通过resign.jar重签名的apk后,安装运行后直接出现闪退的情况,查看log的原因是提示android.content.res.Resources$NotFoundException: ...
最新文章
- web 容器 支持 php,web服务器lighttpd 对php的支持
- XamarinSQLite教程Xamarin.iOS项目中打开数据库文件
- jQuery 参考手册 - 事件
- 为什么 K8s 在阿里能成功?| 问底中国 IT 技术演进
- 如何在线将pdf转换成ppt格式
- 华为有造车实力,却坚决不造整车,这背后有着怎样的无奈与思考?
- 作者:​赵洋(1988-),男,国家超级计算天津中心中级工程师、科学计算组组长。...
- 忘记mysql的root密码后,修改密码
- (21)Verilog HDL结构:task语句
- python制作软件excel_利用Python制作一个 截图+Excel操作浏览器小工具
- Bailian4138 POJ NOI MATH-7827 质数的和与积【数论】
- protues 快捷键和元件
- dlibdotnet 人脸相似度源代码_C#开发的人脸左右相似度计算软件源码分析
- uint8_t / uint16_t / uint32_t /uint64_t 这些数据类型是什么?
- html幻灯片图片切换效果代码,jquery的幻灯片图片切换效果代码分享
- 各种域名都代表什么意思?
- 计算机语言学习书籍目录资源自己找(到处复制粘贴的目录)
- 逻辑电路是计算机学的吗,下列属于组合逻辑电路的是( )。
- 一种简单的仓储系统实物可视化分布实现方案
- FPGA开发——图像处理(包括MT9V034等摄像头学习笔记)