(function() {
'use strict';
const config = {
dumpDecryptedDex: true,
bypassDebugChecks: true,
bypassIntegrityChecks: true,
bypassEmulatorDetection: true,
bypassRootDetection: true,
bypassHookDetection: true,
spoofDeviceInfo: true
};
let pendingHooks = [];
let modulesLoaded = false;
Process.findModuleByName('libdpjni.so') ? moduleReady() : moduleWaiter();
function moduleWaiter() {
console.log("[*] Waiting for libdpjni.so to load...");
Process.enumerateModules({
onMatch: function(module) {
if (module.name === 'libdpjni.so') {
console.log("[+] libdpjni.so loaded at: " + module.base);
moduleReady();
modulesLoaded = true;
}
},
onComplete: function() {
if (!modulesLoaded) {
setTimeout(moduleWaiter, 200);
}
}
});
}
function moduleReady() {
console.log("[+] Setting up DexProtector bypass");
pendingHooks.forEach(callback => callback());
pendingHooks = [];
setupAntiDebugBypass();
setupIntegrityBypass();
setupDeviceSpoofing();
setupDexDump();
}
function setupAntiDebugBypass() {
if (!config.bypassDebugChecks) return;
console.log("[*] Setting up anti-debug bypass");
let ptracePtr = Module.findExportByName(null, "ptrace");
if (ptracePtr) {
Interceptor.replace(ptracePtr, new NativeCallback(function(request, pid, addr, data) {
if (request == 0) {
return 0;
}
return -1;
}, 'long', ['int', 'int', 'pointer', 'pointer']));
console.log("[+] Hooked ptrace");
}
setupTracerPidBypass();
let dpCheckDebugger = Module.findExportByName("libdpjni.so", "dp_check_debugger");
if (dpCheckDebugger) {
Interceptor.attach(dpCheckDebugger, {
onLeave: function(retval) {
retval.replace(0);
}
});
console.log("[+] Hooked dp_check_debugger");
}
}
function setupTracerPidBypass() {
}
function setupIntegrityBypass() {
if (!config.bypassIntegrityChecks) return;
console.log("[*] Setting up integrity check bypass");
Java.perform(function() {
try {
const possibleClasses = [
"com.liapp.protect.Protection",
"com.liapp.protect.integrity.Verifier",
"com.liapp.protect.DPApplication"
];
possibleClasses.forEach(className => {
try {
const targetClass = Java.use(className);
const methodsToHook = [
"verifyIntegrity",
"checkSignature",
"validateResources",
"validateInstallation"
];
methodsToHook.forEach(methodName => {
try {
const overloads = targetClass[methodName].overloads;
overloads.forEach(overload => {
try {
overload.implementation = function() {
console.log(`[+] Bypassed ${className}.${methodName}`);
return true;
};
console.log(`[+] Hooked ${className}.${methodName}`);
} catch (e) {
}
});
} catch (e) {
}
});
} catch (e) {
}
});
try {
const PackageManager = Java.use("android.content.pm.PackageManager");
const GET_SIGNATURES = PackageManager.GET_SIGNATURES.value;
const PM_getPackageInfo = PackageManager.getPackageInfo.overload(
'java.lang.String', 'int');
PM_getPackageInfo.implementation = function(pkg, flags) {
if ((flags & GET_SIGNATURES) !== 0) {
console.log(`[+] Intercepted getPackageInfo for signatures: ${pkg}`);
flags &= ~GET_SIGNATURES;
const pkgInfo = this.getPackageInfo(pkg, flags);
addOriginalSignatures(pkgInfo);
return pkgInfo;
}
return this.getPackageInfo(pkg, flags);
};
console.log("[+] Hooked PackageManager.getPackageInfo for signature spoofing");
} catch (e) {
console.log("[-] Failed to hook signature verification: " + e);
}
} catch (e) {
console.log("[-] Error in integrity bypass: " + e);
}
});
const dpVerifyIntegrity = Module.findExportByName("libdpjni.so", "dp_verify_integrity");
if (dpVerifyIntegrity) {
Interceptor.attach(dpVerifyIntegrity, {
onLeave: function(retval) {
retval.replace(1);
}
});
console.log("[+] Hooked dp_verify_integrity");
}
}
function setupDeviceSpoofing() {
if (!config.spoofDeviceInfo) return;
Java.perform(function() {
try {
const secureSettings = Java.use("android.provider.Settings$Secure");
secureSettings.getString.overload('android.content.ContentResolver', 'java.lang.String')
.implementation = function(resolver, name) {
if (name === "android_id") {
console.log("[+] Spoofing Android ID");
return "deadbeef12345678";
}
return this.getString(resolver, name);
};
const Build = Java.use("android.os.Build");
const Field = Java.use("java.lang.reflect.Field");
const fingerprintField = Build.class.getDeclaredField("FINGERPRINT");
fingerprintField.setAccessible(true);
fingerprintField.set(null, "google/sdk_gphone_x86/generic:11/RSR1.201013.001/1234567:user/release-keys");
console.log("[+] Device info spoofing complete");
} catch (e) {
console.log("[-] Error in device spoofing: " + e);
}
});
}
function setupDexDump() {
if (!config.dumpDecryptedDex) return;
console.log("[*] Setting up DEX dumping");
Java.perform(function() {
try {
const DexClassLoader = Java.use("dalvik.system.DexClassLoader");
DexClassLoader.$init.overload('java.lang.String', 'java.lang.String', 'java.lang.String', 'java.lang.ClassLoader')
.implementation = function(dexPath, optDir, libPath, parent) {
console.log(`[+] DexClassLoader created: ${dexPath}`);
this.$init(dexPath, optDir, libPath, parent);
try {
const File = Java.use("java.io.File");
const FileInputStream = Java.use("java.io.FileInputStream");
const FileOutputStream = Java.use("java.io.FileOutputStream");
const dexFile = File.$new(dexPath);
if (dexFile.exists()) {
const dexSize = dexFile.length();
console.log(`[+] Found DEX file, size: ${dexSize}`);
const inStream = FileInputStream.$new(dexFile);
const buffer = Java.array('byte', dexSize);
inStream.read(buffer);
inStream.close();
if (isDexFile(buffer)) {
const dumpPath = `/data/local/tmp/dumped_${new Date().getTime()}.dex`;
const outFile = File.$new(dumpPath);
const outStream = FileOutputStream.$new(outFile);
outStream.write(buffer);
outStream.close();
console.log(`[+] Dumped DEX to: ${dumpPath}`);
}
}
} catch (e) {
console.log(`[-] Error dumping DEX: ${e}`);
}
};
console.log("[+] Hooked DexClassLoader for DEX dumping");
} catch (e) {
console.log(`[-] Failed to hook DexClassLoader: ${e}`);
}
});
}
function isDexFile(buffer) {
if (buffer.length < 8) return false;
const dexMagic = [0x64, 0x65, 0x78, 0x0A, 0x30, 0x33];
for (let i = 0; i < 6; i++) {
if (buffer[i] !== dexMagic[i]) return false;
}
if (buffer[6] < 0x35 || buffer[6] > 0x37) return false;
if (buffer[7] !== 0) return false;
return true;
}
function addOriginalSignatures(pkgInfo) {
}
})();