/
/
only update here
extern
"C"
JNIEXPORT void JNICALL
Java_org_koi_ctf20210814_P_attachBase(JNIEnv
*
env, jclass clazz, jobject base) {
jclass clz_File
=
env
-
>FindClass(
"java/io/File"
);
jclass clz_Context
=
env
-
>FindClass(
"android/content/Context"
);
jclass clz_AssetManager
=
env
-
>FindClass(
"android/content/res/AssetManager"
);
jclass clz_InputStream
=
env
-
>FindClass(
"java/io/InputStream"
);
jclass clz_FileOutputStream
=
env
-
>FindClass(
"java/io/FileOutputStream"
);
jclass clz_ActivityThread
=
env
-
>FindClass(
"android/app/ActivityThread"
);
jclass clz_ArrayMap
=
env
-
>FindClass(
"android/util/ArrayMap"
);
jclass clz_WeakReference
=
env
-
>FindClass(
"java/lang/ref/WeakReference"
);
jclass clz_LoadedApk
=
env
-
>FindClass(
"android/app/LoadedApk"
);
jclass clz_DexClassLoader
=
env
-
>FindClass(
"dalvik/system/DexClassLoader"
);
jmethodID mid_File_init
=
env
-
>GetMethodID(clz_File,
"<init>"
,
"(Ljava/io/File;Ljava/lang/String;)V"
);
jmethodID mid_FileOutputStream_init
=
env
-
>GetMethodID(clz_FileOutputStream,
"<init>"
,
"(Ljava/io/File;)V"
);
jmethodID mid_DexClassLoader_init
=
env
-
>GetMethodID(clz_DexClassLoader,
"<init>"
,
"(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;)V"
);
jmethodID mid_Context_getCacheDir
=
env
-
>GetMethodID(clz_Context,
"getCacheDir"
,
"()Ljava/io/File;"
);
jmethodID mid_Context_getAssets
=
env
-
>GetMethodID(clz_Context,
"getAssets"
,
"()Landroid/content/res/AssetManager;"
);
jmethodID mid_Context_getDir
=
env
-
>GetMethodID(clz_Context,
"getDir"
,
"(Ljava/lang/String;I)Ljava/io/File;"
);
jmethodID mid_AssetManager_open
=
env
-
>GetMethodID(clz_AssetManager,
"open"
,
"(Ljava/lang/String;)Ljava/io/InputStream;"
);
jmethodID mid_File_exists
=
env
-
>GetMethodID(clz_File,
"exists"
,
"()Z"
);
jmethodID mid_File_mkdirs
=
env
-
>GetMethodID(clz_File,
"mkdirs"
,
"()Z"
);
jmethodID mid_File_getAbsolutePath
=
env
-
>GetMethodID(clz_File,
"getAbsolutePath"
,
"()Ljava/lang/String;"
);
jmethodID mid_InputStream_read
=
env
-
>GetMethodID(clz_InputStream,
"read"
,
"([B)I"
);
jmethodID mid_InputStream_close
=
env
-
>GetMethodID(clz_InputStream,
"close"
,
"()V"
);
jmethodID mid_InputStream_available
=
env
-
>GetMethodID(clz_InputStream,
"available"
,
"()I"
);
jmethodID mid_FileOutputStream_write
=
env
-
>GetMethodID(clz_FileOutputStream,
"write"
,
"([BII)V"
);
jmethodID mid_FileOutputStream_flush
=
env
-
>GetMethodID(clz_FileOutputStream,
"flush"
,
"()V"
);
jmethodID mid_FileOutputStream_close
=
env
-
>GetMethodID(clz_FileOutputStream,
"close"
,
"()V"
);
jmethodID mid_ActivityThread_currentActivityThread
=
env
-
>GetStaticMethodID(clz_ActivityThread,
"currentActivityThread"
,
"()Landroid/app/ActivityThread;"
);
jmethodID mid_ArrayMap_get
=
env
-
>GetMethodID(clz_ArrayMap,
"get"
,
"(Ljava/lang/Object;)Ljava/lang/Object;"
);
jmethodID mid_WeakReference_get
=
env
-
>GetMethodID(clz_WeakReference,
"get"
,
"()Ljava/lang/Object;"
);
jfieldID fid_ActivityThread_mPackages
=
env
-
>GetFieldID(clz_ActivityThread,
"mPackages"
,
"Landroid/util/ArrayMap;"
);
jfieldID fid_LoadedApk_mClassLoader
=
env
-
>GetFieldID(clz_LoadedApk,
"mClassLoader"
,
"Ljava/lang/ClassLoader;"
);
try
{
jobject cacheDir
=
env
-
>CallObjectMethod(base, mid_Context_getCacheDir);
if
(!env
-
>CallBooleanMethod(cacheDir, mid_File_exists)) {
env
-
>CallBooleanMethod(cacheDir, mid_File_mkdirs);
}
jstring
str
=
env
-
>NewStringUTF(DECRYPTED_FILE_NAME);
jobject outFile
=
env
-
>NewObject(clz_File, mid_File_init, cacheDir,
str
);
jobject AssetManager
=
env
-
>CallObjectMethod(base, mid_Context_getAssets);
jstring out_file_name
=
env
-
>NewStringUTF(ENCRYPTED_FILE_NAME);
jobject
is
=
env
-
>CallObjectMethod(AssetManager, mid_AssetManager_open, out_file_name);
jobject fos
=
env
-
>NewObject(clz_FileOutputStream, mid_FileOutputStream_init, outFile);
jint file_size
=
env
-
>CallIntMethod(
is
, mid_InputStream_available);
jbyteArray
buffer
=
env
-
>NewByteArray(file_size);
env
-
>CallIntMethod(
is
, mid_InputStream_read,
buffer
);
/
/
read
jbyte
*
p_bt_ary
=
(jbyte
*
)env
-
>GetByteArrayElements(
buffer
,
0
);
/
/
here you can add decryption function.
for
(jint i
=
0
; i < file_size;
+
+
i) {
p_bt_ary[i] ^
=
273
;
}
env
-
>SetByteArrayRegion(
buffer
,
0
, file_size, p_bt_ary);
env
-
>CallVoidMethod(fos, mid_FileOutputStream_write,
buffer
,
0
, file_size);
env
-
>DeleteLocalRef(
buffer
);
env
-
>CallVoidMethod(fos, mid_FileOutputStream_flush);
env
-
>CallVoidMethod(
is
, mid_InputStream_close);
env
-
>CallVoidMethod(fos, mid_FileOutputStream_close);
jstring file_abs_path
=
(jstring) env
-
>CallObjectMethod(outFile, mid_File_getAbsolutePath);
jobject currentActivityThread
=
env
-
>CallStaticObjectMethod(clz_ActivityThread,
mid_ActivityThread_currentActivityThread);
jobject mPackages
=
env
-
>GetObjectField(currentActivityThread,
fid_ActivityThread_mPackages);
jstring package_name
=
env
-
>NewStringUTF(PACKAGE_NAME);
jobject weakReference
=
env
-
>CallObjectMethod(mPackages, mid_ArrayMap_get, package_name);
jobject loadedApk
=
env
-
>CallObjectMethod(weakReference, mid_WeakReference_get);
jobject parent
=
env
-
>GetObjectField(loadedApk, fid_LoadedApk_mClassLoader);
jstring jstr_dexOpt
=
env
-
>NewStringUTF(
"dexOpt"
);
jobject dexOpt
=
env
-
>CallObjectMethod(base, mid_Context_getDir, jstr_dexOpt,
0
);
jstring dexOpt_abs_path
=
(jstring) env
-
>CallObjectMethod(dexOpt, mid_File_getAbsolutePath);
jstring str_null
=
env
-
>NewStringUTF("");
jobject dLoader
=
env
-
>NewObject(clz_DexClassLoader, mid_DexClassLoader_init, file_abs_path,
dexOpt_abs_path, str_null, parent);
env
-
>SetObjectField(loadedApk, fid_LoadedApk_mClassLoader, dLoader);
} catch (...) {}
}