相关代码:
相关代码:
FridaServer通过TCP与PC上的Frida进行通信,所以可以检测进程中是否存在 FridaServer进程
在映射的so文件中扫描Frida的库特征,例如:“gadgets”,“LIBFRIDA”等等,这 两个在Frida的所有版本中都有存在
String apkPath=context.getPackageCodePath();//获取Apk的路径
ZipFile zipFile=new ZipFile(apkPath);
ZipEntry dexEntry=ZipFile.getEntry("classes.dex");//读取zip包中的classes.dex文件
String dexCRC=dexEntry.getCrc().toString();//计算dex的CRC文件值
MessageDigest digest=MessageDigest.getInstance("MD5");
byte[] bytes=new byte[1024];
FileInputStream fileinputStream=new FileInputStream(new File(dexPath));
int byteCount;
while(fileinputStream.read(bytes)!=-1){
digest.update(bytes,0,byteCount);
}
BigInteger bigInteger=new BigInteger(1,digest.digest());//计算dex的哈希
String MD5=bigInteger.toString();//dex的哈希值
通过APK包的MD5摘要进行判断文件是否被修改过,这里需要计算APK的MD5值,然后将MD5上传到服务器进行判断,或者等待服务器下发原始文件的MD5值,进行比较判断。
String apkPath=context.getPackageCodePath();//获取Apk的路径
MessageDigest digest=MessageDigest.getInstance("MD5");
byte[] bytes=new byte[1024];
FileInputStream fileinputStream=new FileInputStream(new File(apkPath));//读取apk文件
int byteCount;
while(fileinputStream.read(bytes)!=-1){
digest.update(bytes,0,byteCount);
}
BigInteger bigInteger=new BigInteger(1,digest.digest());//计算apk的哈希
String MD5=bigInteger.toString();//apk的哈希值
<1>.通过android.content.pm.PackageInfo.getPacketInfo()函数获取包信息,然后拿到签名信息
<2>.该签名信息为一个byte数组,可以转换成 X.509格式的证书信息,或者直接对该签名信息求哈希
<3>.现阶段为了增加分析的难度,通常都会将部分代码放到.so文件中。
PackageInfo packageInfo=content.getPackageManager()
.getPackageInfo(content.getPackageName()
PackageManager.GET_SIGNATURES);//获取包信息
Signature[] signature=packageInfo.signatures;
Signature sign=signature[0];
MessageDigest digest=MessageDigest.getInstance("MD5");
digest.update(sign);
Context.getPackageCodePath() 用来获得当前应用程序对应的 apk 文件的路径:/data/app/包名/xxx.apk
Context.getPackageResourcePath() 获取该程序的安装包路径 : /data/app/包名/xxx.apk
packageInfo.applicationInfo.sourceDir 这里面也可以获取apk路径
android.content.pm.PackageInfo.getPacketInfo(ClassName,flags).signatures
这里需要注意 当flags为64的时候,该函数会获取签名信息
所以需要在getpackageinfo下断点,当flags为64的时候,就是获取签名信息
// 1.反射实例化PackageParser对象
Object packageParser = getPackageParser(path);
// 2.反射获取parsePackage方法
Object packageObject = getPackageInfo(path,packageParser);
// 3.调用collectCertificates方法
Method collectCertificatesMethod = packageParser.getClass(). getDeclaredMethod("collectCertificates",packageObject.getClass(),int.class);
collectCertificatesMethod.invoke(packageParser,packageObject,0);
// 4.获取mSignatures属性
Field signaturesField = packageObject.getClass().getDeclaredField("mSignatures");
signaturesField.setAccessible(true);
Signature[] mSignatures = (Signature[]) signaturesField.get(packageObject);
PackageManagerService.InstallPackageLI()
PackageParser.collectCertificates()
ApkSignatureVerifier.verify()
ApkSignatureSchemeV3Verifier.verify()
ApkSigningBlockUtils.findSignature()
ApkSigningBlockUtils.findApkSigningBlock()
ApkSigningBlockUtils.findApkSignatureSchemeBlock()
SignatureInfo.SignatureInfo()
ApkSignatureSchemeV3Verifier.verify()
ApkSignatureSchemeV3Verifier.verifySigner()
ApkSignatureSchemeV3Verifier.verifyAdditionalAttributes()
ApkSignatureSchemeV3Verifier.verifyProofOfRotationStruct()
ApkSignatureSchemeV3Verifier.VerifiedProofOfRotation()
de.robv.android.xposed.XposedHelpers类的
静态fieldCache字段 保存被hook的字段信息
静态methodCache字段 保存被hook的方法信息
静态constructorCache字段 保存被hook的类信息
检测内存映射列表中是否包含如下文件:
XposedBridge.so
XposedBridge.jar
handleHookMethod
invokeOriginalMethodNative
注:
1>.在dalvik.system.NativeStart.main方法后出现
de.robv.android.xposed.XposedBridge.main的方法调用
2>如果Xposed hook了调用栈里的一个方法,
还会有de.robv.android.xposed.XposedBridge.handleHookedMethod
和de.robv.android.xposed.XposedBridge.invokeOriginalMethodNative调用
de.robv.android.xposed.XposedBridge类
静态disableHooks 成员变量
这个字段表示是否对当前应用进行hook操作
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2020-6-17 11:43
被陌殇编辑
,原因: