The Challenge: Moving Beyond Bytecode

In the world of Android security, most research revolves around the JVM layer. We’re used to patching .dex files using Smali or leveraging automated frameworks like ReVanced.

It’s a comfortable space, but developers are increasingly moving the “crown jewels” out of reach.

Sophisticated applications now bury their most critical logic—license verification, anti-tamper mechanisms, and complex obfuscation—inside Native Libraries (.so files).

By using the Java Native Interface (JNI), they move the security frontier from easily readable bytecode to compiled machine code.

When logic is shifted to the native layer, simply patching the Java caller is no longer enough; the library itself will often detect the change and refuse to cooperate.

Hands-on example

I recently encountered a target that utilized native “kill-switches” embedded directly within the JNI_OnLoad function.

In the JNI lifecycle, JNI_OnLoad is the gatekeeper. It is the very first function executed when a library is loaded; if it returns an error or triggers a crash, the library fails to initialize, effectively neutralizing any Java features that depend on it.

Identifying the Target

Our first step is to locate where the native bridge is established.

Opening the APK in jadx, we look for the System.loadLibrary call and the native method definitions:

package foo.bar.baz.LicenceManager

public final class DefaultPublicKeyDataProvider implements PublicKeyDataProvider {
    public final Base64Coding a;

    @Metadata(d1 = {"<metadata>")
    public static final class Companion {
    }

    static {
        System.loadLibrary("lm");
    }

    public DefaultPublicKeyDataProvider(Base64Coding base64Coding) {
        this.a = base64Coding;
    }

    @JvmStatic
    private static final native String getPublicKeyData();

    @Override
    public final Object a() {
        return this.a.decode(getPublicKeyData());
    }
}

If we try to bypass the logic in Java, we hit a wall: the library liblm.so performs its own integrity checks upon loading.

If we’ve tampered with the APK, JNI_OnLoad detects the signature mismatch and kills the process before getPublicKeyData() can even be called.

type: logcat
osVersion: google/blazer/blazer:16/
package: com.foo.myapp:75, targetSdk 35
buffers: main,system,crash,events,kernel
level: error

--------- beginning of main
01-10 07:57:59.231 11550 11550 E FeatureFlagsImplExport: android.os.flagging.AconfigStorageReadException: ERROR_PACKAGE_NOT_FOUND: package android.xr cannot be found on the device
01-10 07:57:59.329 11550 11847 E ashmem  : Pinning is deprecated since Android Q. Please use trim or other methods.
--------- beginning of crash
01-10 07:57:59.367 11550 11550 E AndroidRuntime: FATAL EXCEPTION: main
01-10 07:57:59.367 11550 11550 E AndroidRuntime: Process: com.foo.myapp, PID: 11550
01-10 07:57:59.367 11550 11550 E AndroidRuntime: java.lang.UnsatisfiedLinkError: JNI_ERR returned from JNI_OnLoad in "/data/app/~~A-Ly5qW1ZbWSSjYZdgcnjQ==/com.foo.myapp-U4v8WCluA7NjDuUwNy3fCw==/lib/arm64/libfusefs.so"
01-10 07:57:59.367 11550 11550 E AndroidRuntime: 	at java.lang.Runtime.loadLibrary0(Runtime.java:1097)
01-10 07:57:59.367 11550 11550 E AndroidRuntime: 	at java.lang.Runtime.loadLibrary0(Runtime.java:1019)
01-10 07:57:59.367 11550 11550 E AndroidRuntime: 	at java.lang.System.loadLibrary(System.java:1765)
01-10 07:57:59.367 11550 11550 E AndroidRuntime: 	at com.foo.myapp.data.common.junction.fusefs.BlockingFuseFileSystem.<clinit>(Unknown Source:2)
01-10 07:57:59.367 11550 11550 E AndroidRuntime: 	at com.foo.myapp.data.common.LibraryManagerImpl.a(Unknown Source:5)
01-10 07:57:59.367 11550 11550 E AndroidRuntime: 	at com.foo.myapp.ui.storagemanager.service.server.local.DomainLauncher.b(Unknown Source:63)
01-10 07:57:59.367 11550 11550 E AndroidRuntime: 	at com.foo.myapp.ui.EdsApp$onCreate$1.invokeSuspend(Unknown Source:43)
01-10 07:57:59.367 11550 11550 E AndroidRuntime: 	at com.foo.myapp.ui.EdsApp$onCreate$1.invoke(Unknown Source:12)
01-10 07:57:59.367 11550 11550 E AndroidRuntime: 	at com.foo.myapp.data.common.threadcoroutinecontext.LaunchBlockingKt$launchBlocking$1.invokeSuspend(Unknown Source:45)
01-10 07:57:59.367 11550 11550 E AndroidRuntime: 	at com.foo.myapp.data.common.threadcoroutinecontext.LaunchBlockingKt$launchBlocking$1.invoke(Unknown Source:12)
01-10 07:57:59.367 11550 11550 E AndroidRuntime: 	at kotlinx.coroutines.CoroutineStart.a(Unknown Source:40)
01-10 07:57:59.367 11550 11550 E AndroidRuntime: 	at com.foo.myapp.data.common.threadcoroutinecontext.LaunchBlockingKt.a(Unknown Source:41)
01-10 07:57:59.367 11550 11550 E AndroidRuntime: 	at com.foo.myapp.ui.EdsApp.onCreate(Unknown Source:52)
01-10 07:57:59.367 11550 11550 E AndroidRuntime: 	at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1406)
01-10 07:57:59.367 11550 11550 E AndroidRuntime: 	at android.app.ActivityThread.handleBindApplication(ActivityThread.java:8183)
01-10 07:57:59.367 11550 11550 E AndroidRuntime: 	at android.app.ActivityThread.-$$Nest$mhandleBindApplication(Unknown Source:0)
01-10 07:57:59.367 11550 11550 E AndroidRuntime: 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2699)
01-10 07:57:59.367 11550 11550 E AndroidRuntime: 	at android.os.Handler.dispatchMessage(Handler.java:132)
01-10 07:57:59.367 11550 11550 E AndroidRuntime: 	at android.os.Looper.dispatchMessage(Looper.java:333)
01-10 07:57:59.367 11550 11550 E AndroidRuntime: 	at android.os.Looper.loopOnce(Looper.java:263)
01-10 07:57:59.367 11550 11550 E AndroidRuntime: 	at android.os.Looper.loop(Looper.java:367)
01-10 07:57:59.367 11550 11550 E AndroidRuntime: 	at android.app.ActivityThread.main(ActivityThread.java:9331)
01-10 07:57:59.367 11550 11550 E AndroidRuntime: 	at java.lang.reflect.Method.invoke(Native Method)
01-10 07:57:59.367 11550 11550 E AndroidRuntime: 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:566)
01-10 07:57:59.367 11550 11550 E AndroidRuntime: 	at com.android.internal.os.ExecInit.main(ExecInit.java:50)
01-10 07:57:59.367 11550 11550 E AndroidRuntime: 	at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
01-10 07:57:59.367 11550 11550 E AndroidRuntime: 	at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:366)

Into the Depths: Analyzing liblm.so with Ghidra

Once we’ve identified that the security logic is anchored in the native layer, we need to extract the liblm.so file from the APK (usually found in the lib/arm64-v8a/ directory) and load it into Ghidra.

decompiled_apk/lib/arm64-v8a
❯ ls
Permissions Size User Date Modified Name
.rw-r--r--  4.0M blaz  1 Jan  1981   libcryfs-jni.so
.rw-r--r--  1.7M blaz  1 Jan  1981   libcrypto.so
.rw-r--r--  2.6M blaz  1 Jan  1981   libcryptsetup.so
.rw-r--r--  4.1M blaz  1 Jan  1981   libencfs-jni.so
.rw-r--r--  4.3k blaz  1 Jan  1981   liberrno-lib.so
.rw-r--r--  210k blaz  1 Jan  1981   libexfat.so
.rw-r--r--  641k blaz  1 Jan  1981   libext4.so
.rw-r--r--  183k blaz  1 Jan  1981   libfat.so
.rw-r--r--   52k blaz  1 Jan  1981   libfdutil.so
.rw-r--r--  134k blaz  1 Jan  1981   libfusefs.so
.rw-r--r--  104k blaz  1 Jan  1981   libgocryptfs-jni.so
.rw-r--r--  8.1M blaz  1 Jan  1981   libgocryptfs.so
.rw-r--r--   68k blaz  1 Jan  1981   libjson-c.so
.rw-r--r--  111k blaz  1 Jan  1981   liblibusb.so
.rw-r--r--  8.9k blaz  1 Jan  1981   liblibusbcom.so
.rw-r--r--   41k blaz  1 Jan  1981   liblm.so
.rw-r--r--   36k blaz  1 Jan  1981   libmemoryutil.so
.rw-r--r--  345k blaz  1 Jan  1981   libmounter.so
.rw-r--r--  389k blaz  1 Jan  1981   libnrb.so
.rw-r--r--  648k blaz  1 Jan  1981   libntfs.so
.rw-r--r--  6.5M blaz  1 Jan  1981   libpdfsdk.so
.rw-r--r--   47k blaz  1 Jan  1981   libpdfsdk_jni.so
.rw-r--r--  626k blaz  1 Jan  1981   libsmb.so
.rw-r--r--  272k blaz  1 Jan  1981   libsmb2.so
.rw-r--r--  1.8M blaz  1 Jan  1981   libsqlite3x.so
.rw-r--r--  5.2k blaz  1 Jan  1981   libusb-lib.so
.rw-r--r--  564k blaz  1 Jan  1981   libutil.so
.rw-r--r--  1.8M blaz  1 Jan  1981   libveracrypt.so

We are on the right track. Among all the other libraries the app depends on, there’s also liblm.so — the one we are interested in. Let’s open it in Ghidra to see what we find!

Locating the Entry Point

In the Symbol Tree, we look for JNI_OnLoad. This is the function the Android Runtime (ART) calls immediately after System.loadLibrary().

Symbol tree in Ghidra

Looking at the decompiled JNI_OnLoad, this is what we find:

undefined8 JNI_OnLoad(undefined8 param_1)

{
  int iVar1;
  undefined8 uVar2;
  
  obfs_check1_start();
  uVar2 = loadJniUtil(param_1);
  if (-1 < (int)uVar2) {
    getEnv();
    iVar1 = obfs_check1_finish();
    if (iVar1 == 0) {
      clearJni();
      uVar2 = 0xffffffff;
    }
    else {
      uVar2 = 0x10006;
    }
  }
  return uVar2;
}

The code is not very hard to read as-is, but let’s rename the parameter, local variables, and return value to make it even clearer.

undefined8 JNI_OnLoad(undefined8 JavaVM)

{
  int antiTamperCheck?;
  undefined8 JNI_VERSION;
  
  obfs_check1_start();
  JNI_VERSION = loadJniUtil(JavaVM);
  if (-1 < (int)JNI_VERSION) {
    getEnv();
    antiTamperCheck? = obfs_check1_finish();
    if (antiTamperCheck? == 0) {
      clearJni();
      JNI_VERSION = 0xffffffff;
    }
    else {
      JNI_VERSION = 0x10006;
    }
  }
  return JNI_VERSION;
}

When we look at the decompiled C code, several red flags appear that indicate this isn’t just a standard library registration.

The developers have wrapped the initialization process in multiple validation layers:

The Starting Gun (obfs_check1_start): This function simply captures the current CPU time using clock() and stores it in a global variable (DAT_00111928). - This is a classic anti-debugging/anti-tracing technique. - By marking the exact moment the library starts loading, the application can later calculate how long the initialization took.

Here’s the code of the obfs_check1_start if you’re interested:

obfs_check1_start code

void obfs_check1_start(void)

{
  DAT_00111928 = clock();
  return;
}

The Bridge Initialization (loadJniUtil): The library attempts to load its internal utilities. - Notice the check if (-1 < (int)uVar2). In JNI, returning -1 (typically JNI_ERR) tells the Android Runtime that the library failed to load, which crashes the Java side with an UnsatisfiedLinkError.

The “Trap” (obfs_check1_finish): This is the most critical part of the logic. - Even if the library loads correctly, it runs a finishing check. - If iVar1 == 0 (the check fails), it calls clearJni() to wipe sensitive data from memory and returns 0xffffffff (-1). - If it succeeds, it returns 0x10006—the hex constant for JNI_VERSION_1_6, signaling to Android that everything is fine.

Here is the code for obfs_check1_finish if you are interested (note that it is very long and difficult to read; thankfully, we won’t have to deal with it much besides acknowledging its existence):

obfs_check1_finish code

void obfs_check1_finish(long *param_1)

{
  char cVar1;
  long lVar2;
  undefined1 auVar3 [16];
  undefined1 auVar4 [16];
  undefined1 auVar5 [16];
  undefined1 auVar6 [16];
  undefined1 auVar7 [16];
  undefined1 auVar8 [16];
  undefined1 auVar9 [16];
  undefined1 auVar10 [16];
  undefined1 auVar11 [16];
  undefined1 auVar12 [16];
  undefined1 auVar13 [16];
  undefined1 auVar14 [16];
  undefined1 auVar15 [16];
  undefined1 auVar16 [16];
  undefined1 auVar17 [16];
  undefined1 auVar18 [16];
  undefined1 auVar19 [16];
  undefined1 auVar20 [16];
  undefined1 auVar21 [16];
  undefined1 auVar22 [16];
  undefined1 auVar23 [16];
  undefined1 auVar24 [16];
  undefined1 auVar25 [16];
  int iVar26;
  uint uVar27;
  clock_t cVar28;
  void *pvVar29;
  long lVar30;
  undefined8 uVar31;
  void *pvVar32;
  long lVar33;
  long lVar34;
  undefined8 uVar35;
  undefined8 uVar36;
  undefined8 uVar37;
  undefined8 uVar38;
  undefined8 uVar39;
  undefined8 uVar40;
  undefined8 uVar41;
  undefined8 uVar42;
  undefined8 uVar43;
  byte *pbVar44;
  char *__s2;
  char *pcVar45;
  ulong uVar46;
  byte *pbVar47;
  code *pcVar48;
  byte bVar49;
  byte bVar50;
  byte bVar51;
  byte bVar52;
  byte bVar53;
  byte bVar54;
  byte bVar55;
  byte bVar56;
  byte bVar57;
  byte bVar58;
  byte bVar59;
  byte bVar60;
  byte bVar61;
  byte bVar62;
  byte bVar63;
  byte bVar64;
  undefined1 auVar65 [16];
  int iVar66;
  int iVar67;
  int iVar68;
  int iVar69;
  int iVar70;
  int iVar71;
  int iVar72;
  int iVar73;
  int iVar74;
  byte bVar75;
  byte bVar76;
  byte bVar77;
  byte bVar78;
  byte bVar79;
  byte bVar80;
  byte bVar81;
  byte bVar82;
  byte bVar83;
  byte bVar84;
  byte bVar85;
  byte bVar86;
  byte bVar87;
  byte bVar88;
  byte bVar89;
  byte bVar90;
  int iVar91;
  int iVar92;
  int iVar93;
  int iVar94;
  uint local_84;
  undefined8 local_80;
  undefined8 uStack_78;
  long local_68;
  
  lVar2 = tpidr_el0;
  local_68 = *(long *)(lVar2 + 0x28);
  cVar28 = clock();
  if (((double)(cVar28 - DAT_00111928) / 1000000.0 <= 0.1) && (param_1 != (long *)0x0)) {
    pvVar29 = malloc(0x80);
    bVar49 = 0;
    bVar50 = 0;
    bVar51 = 0;
    bVar52 = 0;
    bVar53 = 0;
    bVar54 = 0;
    bVar55 = 0;
    bVar56 = 0;
    bVar57 = 0;
    bVar58 = 0;
    bVar59 = 0;
    bVar60 = 0;
    bVar61 = 0;
    bVar62 = 0;
    bVar63 = 0;
    bVar64 = 0;
    iVar93 = 3;
    iVar94 = 4;
    iVar91 = 1;
    iVar92 = 2;
    uVar35 = 0;
    uVar31 = 0x541c0770;
    iVar26 = 0x238;
    do {
      iVar66 = iVar91 * 0x105c72;
      iVar67 = iVar92 * 0x105c72;
      iVar68 = iVar93 * 0x105c72;
      iVar69 = iVar94 * 0x105c72;
      iVar91 = iVar91 + 8;
      iVar92 = iVar92 + 8;
      iVar93 = iVar93 + 8;
      iVar94 = iVar94 + 8;
      iVar26 = iVar26 + -8;
      iVar70 = iVar66 + 0x4171c8;
      iVar71 = iVar67 + 0x4171c8;
      iVar72 = iVar68 + 0x4171c8;
      iVar73 = iVar69 + 0x4171c8;
      bVar75 = (byte)uVar31 ^ (byte)iVar66;
      bVar76 = (byte)((ulong)uVar31 >> 8) ^ (byte)((uint)iVar66 >> 8);
      bVar77 = (byte)((ulong)uVar31 >> 0x10) ^ (byte)((uint)iVar66 >> 0x10);
      bVar78 = (byte)((ulong)uVar31 >> 0x18) ^ (byte)((uint)iVar66 >> 0x18);
      bVar79 = (byte)((ulong)uVar31 >> 0x20) ^ (byte)iVar67;
      bVar80 = (byte)((ulong)uVar31 >> 0x28) ^ (byte)((uint)iVar67 >> 8);
      bVar81 = (byte)((ulong)uVar31 >> 0x30) ^ (byte)((uint)iVar67 >> 0x10);
      bVar82 = (byte)((ulong)uVar31 >> 0x38) ^ (byte)((uint)iVar67 >> 0x18);
      uVar31 = CONCAT17(bVar82,CONCAT16(bVar81,CONCAT15(bVar80,CONCAT14(bVar79,CONCAT13(bVar78,
                                                  CONCAT12(bVar77,CONCAT11(bVar76,bVar75)))))));
      bVar83 = (byte)uVar35 ^ (byte)iVar68;
      bVar84 = (byte)((ulong)uVar35 >> 8) ^ (byte)((uint)iVar68 >> 8);
      bVar85 = (byte)((ulong)uVar35 >> 0x10) ^ (byte)((uint)iVar68 >> 0x10);
      bVar86 = (byte)((ulong)uVar35 >> 0x18) ^ (byte)((uint)iVar68 >> 0x18);
      bVar87 = (byte)((ulong)uVar35 >> 0x20) ^ (byte)iVar69;
      bVar88 = (byte)((ulong)uVar35 >> 0x28) ^ (byte)((uint)iVar69 >> 8);
      bVar89 = (byte)((ulong)uVar35 >> 0x30) ^ (byte)((uint)iVar69 >> 0x10);
      bVar90 = (byte)((ulong)uVar35 >> 0x38) ^ (byte)((uint)iVar69 >> 0x18);
      uVar35 = CONCAT17(bVar90,CONCAT16(bVar89,CONCAT15(bVar88,CONCAT14(bVar87,CONCAT13(bVar86,
                                                  CONCAT12(bVar85,CONCAT11(bVar84,bVar83)))))));
      bVar49 = bVar49 ^ (byte)iVar70;
      bVar50 = bVar50 ^ (byte)((uint)iVar70 >> 8);
      bVar51 = bVar51 ^ (byte)((uint)iVar70 >> 0x10);
      bVar52 = bVar52 ^ (byte)((uint)iVar70 >> 0x18);
      bVar53 = bVar53 ^ (byte)iVar71;
      bVar54 = bVar54 ^ (byte)((uint)iVar71 >> 8);
      bVar55 = bVar55 ^ (byte)((uint)iVar71 >> 0x10);
      bVar56 = bVar56 ^ (byte)((uint)iVar71 >> 0x18);
      bVar57 = bVar57 ^ (byte)iVar72;
      bVar58 = bVar58 ^ (byte)((uint)iVar72 >> 8);
      bVar59 = bVar59 ^ (byte)((uint)iVar72 >> 0x10);
      bVar60 = bVar60 ^ (byte)((uint)iVar72 >> 0x18);
      bVar61 = bVar61 ^ (byte)iVar73;
      bVar62 = bVar62 ^ (byte)((uint)iVar73 >> 8);
      bVar63 = bVar63 ^ (byte)((uint)iVar73 >> 0x10);
      bVar64 = bVar64 ^ (byte)((uint)iVar73 >> 0x18);
    } while (iVar26 != 0);
    bVar49 = bVar49 ^ bVar75;
    bVar50 = bVar50 ^ bVar76;
    bVar51 = bVar51 ^ bVar77;
    bVar52 = bVar52 ^ bVar78;
    bVar53 = bVar53 ^ bVar79;
    bVar54 = bVar54 ^ bVar80;
    bVar55 = bVar55 ^ bVar81;
    bVar56 = bVar56 ^ bVar82;
    bVar57 = bVar57 ^ bVar83;
    bVar58 = bVar58 ^ bVar84;
    bVar59 = bVar59 ^ bVar85;
    bVar60 = bVar60 ^ bVar86;
    bVar61 = bVar61 ^ bVar87;
    bVar62 = bVar62 ^ bVar88;
    bVar63 = bVar63 ^ bVar89;
    bVar64 = bVar64 ^ bVar90;
    uVar46 = 0;
    auVar65[1] = bVar50;
    auVar65[0] = bVar49;
    auVar65[2] = bVar51;
    auVar65[3] = bVar52;
    auVar65[4] = bVar53;
    auVar65[5] = bVar54;
    auVar65[6] = bVar55;
    auVar65[7] = bVar56;
    auVar65[8] = bVar57;
    auVar65[9] = bVar58;
    auVar65[10] = bVar59;
    auVar65[0xb] = bVar60;
    auVar65[0xc] = bVar61;
    auVar65[0xd] = bVar62;
    auVar65[0xe] = bVar63;
    auVar65[0xf] = bVar64;
    auVar3[1] = bVar50;
    auVar3[0] = bVar49;
    auVar3[2] = bVar51;
    auVar3[3] = bVar52;
    auVar3[4] = bVar53;
    auVar3[5] = bVar54;
    auVar3[6] = bVar55;
    auVar3[7] = bVar56;
    auVar3[8] = bVar57;
    auVar3[9] = bVar58;
    auVar3[10] = bVar59;
    auVar3[0xb] = bVar60;
    auVar3[0xc] = bVar61;
    auVar3[0xd] = bVar62;
    auVar3[0xe] = bVar63;
    auVar3[0xf] = bVar64;
    auVar65 = NEON_ext(auVar65,auVar3,8,1);
    uVar27 = CONCAT13(bVar52 ^ auVar65[3],
                      CONCAT12(bVar51 ^ auVar65[2],CONCAT11(bVar50 ^ auVar65[1],bVar49 ^ auVar65[0])
                              ));
    local_84 = uVar27 ^ 0x244e18f0 ^
               (uint)(CONCAT17(bVar56 ^ auVar65[7],
                               CONCAT16(bVar55 ^ auVar65[6],
                                        CONCAT15(bVar54 ^ auVar65[5],
                                                 CONCAT14(bVar53 ^ auVar65[4],uVar27)))) >> 0x20);
    do {
      *(byte *)((long)pvVar29 + uVar46) =
           (&DAT_001025e8)[uVar46] ^ (byte)uVar46 ^ *(byte *)((ulong)&local_84 | uVar46 & 3);
      uVar46 = uVar46 + 1;
    } while (uVar46 != 0x80);
    lVar30 = (**(code **)(*param_1 + 0x30))(param_1,pvVar29);
    uVar31 = __strlen_chk(pvVar29,0x80);
    __memset_chk(pvVar29,0,uVar31,0x80);
    free(pvVar29);
    if (lVar30 != 0) {
      pvVar29 = malloc(0x80);
      bVar49 = 0;
      bVar50 = 0;
      bVar51 = 0;
      bVar52 = 0;
      bVar53 = 0;
      bVar54 = 0;
      bVar55 = 0;
      bVar56 = 0;
      bVar57 = 0;
      bVar58 = 0;
      bVar59 = 0;
      bVar60 = 0;
      bVar61 = 0;
      bVar62 = 0;
      bVar63 = 0;
      bVar64 = 0;
      iVar93 = 3;
      iVar94 = 4;
      iVar91 = 1;
      iVar92 = 2;
      uVar35 = 0;
      uVar31 = 0x5000f37e;
      iVar26 = 0x348;
      do {
        iVar66 = iVar91 * 0x1c962c;
        iVar67 = iVar92 * 0x1c962c;
        iVar68 = iVar93 * 0x1c962c;
        iVar69 = iVar94 * 0x1c962c;
        iVar91 = iVar91 + 8;
        iVar92 = iVar92 + 8;
        iVar93 = iVar93 + 8;
        iVar94 = iVar94 + 8;
        iVar26 = iVar26 + -8;
        iVar70 = iVar66 + 0x7258b0;
        iVar71 = iVar67 + 0x7258b0;
        iVar72 = iVar68 + 0x7258b0;
        iVar73 = iVar69 + 0x7258b0;
        bVar75 = (byte)uVar31 ^ (byte)iVar66;
        bVar76 = (byte)((ulong)uVar31 >> 8) ^ (byte)((uint)iVar66 >> 8);
        bVar77 = (byte)((ulong)uVar31 >> 0x10) ^ (byte)((uint)iVar66 >> 0x10);
        bVar78 = (byte)((ulong)uVar31 >> 0x18) ^ (byte)((uint)iVar66 >> 0x18);
        bVar79 = (byte)((ulong)uVar31 >> 0x20) ^ (byte)iVar67;
        bVar80 = (byte)((ulong)uVar31 >> 0x28) ^ (byte)((uint)iVar67 >> 8);
        bVar81 = (byte)((ulong)uVar31 >> 0x30) ^ (byte)((uint)iVar67 >> 0x10);
        bVar82 = (byte)((ulong)uVar31 >> 0x38) ^ (byte)((uint)iVar67 >> 0x18);
        uVar31 = CONCAT17(bVar82,CONCAT16(bVar81,CONCAT15(bVar80,CONCAT14(bVar79,CONCAT13(bVar78,
                                                  CONCAT12(bVar77,CONCAT11(bVar76,bVar75)))))));
        bVar83 = (byte)uVar35 ^ (byte)iVar68;
        bVar84 = (byte)((ulong)uVar35 >> 8) ^ (byte)((uint)iVar68 >> 8);
        bVar85 = (byte)((ulong)uVar35 >> 0x10) ^ (byte)((uint)iVar68 >> 0x10);
        bVar86 = (byte)((ulong)uVar35 >> 0x18) ^ (byte)((uint)iVar68 >> 0x18);
        bVar87 = (byte)((ulong)uVar35 >> 0x20) ^ (byte)iVar69;
        bVar88 = (byte)((ulong)uVar35 >> 0x28) ^ (byte)((uint)iVar69 >> 8);
        bVar89 = (byte)((ulong)uVar35 >> 0x30) ^ (byte)((uint)iVar69 >> 0x10);
        bVar90 = (byte)((ulong)uVar35 >> 0x38) ^ (byte)((uint)iVar69 >> 0x18);
        uVar35 = CONCAT17(bVar90,CONCAT16(bVar89,CONCAT15(bVar88,CONCAT14(bVar87,CONCAT13(bVar86,
                                                  CONCAT12(bVar85,CONCAT11(bVar84,bVar83)))))));
        bVar49 = bVar49 ^ (byte)iVar70;
        bVar50 = bVar50 ^ (byte)((uint)iVar70 >> 8);
        bVar51 = bVar51 ^ (byte)((uint)iVar70 >> 0x10);
        bVar52 = bVar52 ^ (byte)((uint)iVar70 >> 0x18);
        bVar53 = bVar53 ^ (byte)iVar71;
        bVar54 = bVar54 ^ (byte)((uint)iVar71 >> 8);
        bVar55 = bVar55 ^ (byte)((uint)iVar71 >> 0x10);
        bVar56 = bVar56 ^ (byte)((uint)iVar71 >> 0x18);
        bVar57 = bVar57 ^ (byte)iVar72;
        bVar58 = bVar58 ^ (byte)((uint)iVar72 >> 8);
        bVar59 = bVar59 ^ (byte)((uint)iVar72 >> 0x10);
        bVar60 = bVar60 ^ (byte)((uint)iVar72 >> 0x18);
        bVar61 = bVar61 ^ (byte)iVar73;
        bVar62 = bVar62 ^ (byte)((uint)iVar73 >> 8);
        bVar63 = bVar63 ^ (byte)((uint)iVar73 >> 0x10);
        bVar64 = bVar64 ^ (byte)((uint)iVar73 >> 0x18);
      } while (iVar26 != 0);
      bVar49 = bVar49 ^ bVar75;
      bVar50 = bVar50 ^ bVar76;
      bVar51 = bVar51 ^ bVar77;
      bVar52 = bVar52 ^ bVar78;
      bVar53 = bVar53 ^ bVar79;
      bVar54 = bVar54 ^ bVar80;
      bVar55 = bVar55 ^ bVar81;
      bVar56 = bVar56 ^ bVar82;
      bVar57 = bVar57 ^ bVar83;
      bVar58 = bVar58 ^ bVar84;
      bVar59 = bVar59 ^ bVar85;
      bVar60 = bVar60 ^ bVar86;
      bVar61 = bVar61 ^ bVar87;
      bVar62 = bVar62 ^ bVar88;
      bVar63 = bVar63 ^ bVar89;
      bVar64 = bVar64 ^ bVar90;
      uVar46 = 0;
      auVar4[1] = bVar50;
      auVar4[0] = bVar49;
      auVar4[2] = bVar51;
      auVar4[3] = bVar52;
      auVar4[4] = bVar53;
      auVar4[5] = bVar54;
      auVar4[6] = bVar55;
      auVar4[7] = bVar56;
      auVar4[8] = bVar57;
      auVar4[9] = bVar58;
      auVar4[10] = bVar59;
      auVar4[0xb] = bVar60;
      auVar4[0xc] = bVar61;
      auVar4[0xd] = bVar62;
      auVar4[0xe] = bVar63;
      auVar4[0xf] = bVar64;
      auVar5[1] = bVar50;
      auVar5[0] = bVar49;
      auVar5[2] = bVar51;
      auVar5[3] = bVar52;
      auVar5[4] = bVar53;
      auVar5[5] = bVar54;
      auVar5[6] = bVar55;
      auVar5[7] = bVar56;
      auVar5[8] = bVar57;
      auVar5[9] = bVar58;
      auVar5[10] = bVar59;
      auVar5[0xb] = bVar60;
      auVar5[0xc] = bVar61;
      auVar5[0xd] = bVar62;
      auVar5[0xe] = bVar63;
      auVar5[0xf] = bVar64;
      auVar65 = NEON_ext(auVar4,auVar5,8,1);
      uVar27 = CONCAT13(bVar52 ^ auVar65[3],
                        CONCAT12(bVar51 ^ auVar65[2],
                                 CONCAT11(bVar50 ^ auVar65[1],bVar49 ^ auVar65[0])));
      local_84 = uVar27 ^ 0x3ecba34 ^
                 (uint)(CONCAT17(bVar56 ^ auVar65[7],
                                 CONCAT16(bVar55 ^ auVar65[6],
                                          CONCAT15(bVar54 ^ auVar65[5],
                                                   CONCAT14(bVar53 ^ auVar65[4],uVar27)))) >> 0x20);
      do {
        *(byte *)((long)pvVar29 + uVar46) =
             (&DAT_00102668)[uVar46] ^ (byte)uVar46 ^ *(byte *)((ulong)&local_84 | uVar46 & 3);
        uVar46 = uVar46 + 1;
      } while (uVar46 != 0x80);
      pvVar32 = malloc(0x80);
      bVar49 = 0;
      bVar50 = 0;
      bVar51 = 0;
      bVar52 = 0;
      bVar53 = 0;
      bVar54 = 0;
      bVar55 = 0;
      bVar56 = 0;
      bVar57 = 0;
      bVar58 = 0;
      bVar59 = 0;
      bVar60 = 0;
      bVar61 = 0;
      bVar62 = 0;
      bVar63 = 0;
      bVar64 = 0;
      iVar93 = 3;
      iVar94 = 4;
      iVar91 = 1;
      iVar92 = 2;
      uVar35 = 0;
      uVar31 = 0x25f5c53b;
      iVar26 = 0x350;
      do {
        iVar66 = iVar91 * 0x125877;
        iVar67 = iVar92 * 0x125877;
        iVar68 = iVar93 * 0x125877;
        iVar69 = iVar94 * 0x125877;
        iVar91 = iVar91 + 8;
        iVar92 = iVar92 + 8;
        iVar93 = iVar93 + 8;
        iVar94 = iVar94 + 8;
        iVar26 = iVar26 + -8;
        iVar70 = iVar66 + 0x4961dc;
        iVar71 = iVar67 + 0x4961dc;
        iVar72 = iVar68 + 0x4961dc;
        iVar73 = iVar69 + 0x4961dc;
        bVar75 = (byte)uVar31 ^ (byte)iVar66;
        bVar76 = (byte)((ulong)uVar31 >> 8) ^ (byte)((uint)iVar66 >> 8);
        bVar77 = (byte)((ulong)uVar31 >> 0x10) ^ (byte)((uint)iVar66 >> 0x10);
        bVar78 = (byte)((ulong)uVar31 >> 0x18) ^ (byte)((uint)iVar66 >> 0x18);
        bVar79 = (byte)((ulong)uVar31 >> 0x20) ^ (byte)iVar67;
        bVar80 = (byte)((ulong)uVar31 >> 0x28) ^ (byte)((uint)iVar67 >> 8);
        bVar81 = (byte)((ulong)uVar31 >> 0x30) ^ (byte)((uint)iVar67 >> 0x10);
        bVar82 = (byte)((ulong)uVar31 >> 0x38) ^ (byte)((uint)iVar67 >> 0x18);
        uVar31 = CONCAT17(bVar82,CONCAT16(bVar81,CONCAT15(bVar80,CONCAT14(bVar79,CONCAT13(bVar78,
                                                  CONCAT12(bVar77,CONCAT11(bVar76,bVar75)))))));
        bVar83 = (byte)uVar35 ^ (byte)iVar68;
        bVar84 = (byte)((ulong)uVar35 >> 8) ^ (byte)((uint)iVar68 >> 8);
        bVar85 = (byte)((ulong)uVar35 >> 0x10) ^ (byte)((uint)iVar68 >> 0x10);
        bVar86 = (byte)((ulong)uVar35 >> 0x18) ^ (byte)((uint)iVar68 >> 0x18);
        bVar87 = (byte)((ulong)uVar35 >> 0x20) ^ (byte)iVar69;
        bVar88 = (byte)((ulong)uVar35 >> 0x28) ^ (byte)((uint)iVar69 >> 8);
        bVar89 = (byte)((ulong)uVar35 >> 0x30) ^ (byte)((uint)iVar69 >> 0x10);
        bVar90 = (byte)((ulong)uVar35 >> 0x38) ^ (byte)((uint)iVar69 >> 0x18);
        uVar35 = CONCAT17(bVar90,CONCAT16(bVar89,CONCAT15(bVar88,CONCAT14(bVar87,CONCAT13(bVar86,
                                                  CONCAT12(bVar85,CONCAT11(bVar84,bVar83)))))));
        bVar49 = bVar49 ^ (byte)iVar70;
        bVar50 = bVar50 ^ (byte)((uint)iVar70 >> 8);
        bVar51 = bVar51 ^ (byte)((uint)iVar70 >> 0x10);
        bVar52 = bVar52 ^ (byte)((uint)iVar70 >> 0x18);
        bVar53 = bVar53 ^ (byte)iVar71;
        bVar54 = bVar54 ^ (byte)((uint)iVar71 >> 8);
        bVar55 = bVar55 ^ (byte)((uint)iVar71 >> 0x10);
        bVar56 = bVar56 ^ (byte)((uint)iVar71 >> 0x18);
        bVar57 = bVar57 ^ (byte)iVar72;
        bVar58 = bVar58 ^ (byte)((uint)iVar72 >> 8);
        bVar59 = bVar59 ^ (byte)((uint)iVar72 >> 0x10);
        bVar60 = bVar60 ^ (byte)((uint)iVar72 >> 0x18);
        bVar61 = bVar61 ^ (byte)iVar73;
        bVar62 = bVar62 ^ (byte)((uint)iVar73 >> 8);
        bVar63 = bVar63 ^ (byte)((uint)iVar73 >> 0x10);
        bVar64 = bVar64 ^ (byte)((uint)iVar73 >> 0x18);
      } while (iVar26 != 0);
      bVar49 = bVar49 ^ bVar75;
      bVar50 = bVar50 ^ bVar76;
      bVar51 = bVar51 ^ bVar77;
      bVar52 = bVar52 ^ bVar78;
      bVar53 = bVar53 ^ bVar79;
      bVar54 = bVar54 ^ bVar80;
      bVar55 = bVar55 ^ bVar81;
      bVar56 = bVar56 ^ bVar82;
      bVar57 = bVar57 ^ bVar83;
      bVar58 = bVar58 ^ bVar84;
      bVar59 = bVar59 ^ bVar85;
      bVar60 = bVar60 ^ bVar86;
      bVar61 = bVar61 ^ bVar87;
      bVar62 = bVar62 ^ bVar88;
      bVar63 = bVar63 ^ bVar89;
      bVar64 = bVar64 ^ bVar90;
      uVar46 = 0;
      auVar6[1] = bVar50;
      auVar6[0] = bVar49;
      auVar6[2] = bVar51;
      auVar6[3] = bVar52;
      auVar6[4] = bVar53;
      auVar6[5] = bVar54;
      auVar6[6] = bVar55;
      auVar6[7] = bVar56;
      auVar6[8] = bVar57;
      auVar6[9] = bVar58;
      auVar6[10] = bVar59;
      auVar6[0xb] = bVar60;
      auVar6[0xc] = bVar61;
      auVar6[0xd] = bVar62;
      auVar6[0xe] = bVar63;
      auVar6[0xf] = bVar64;
      auVar7[1] = bVar50;
      auVar7[0] = bVar49;
      auVar7[2] = bVar51;
      auVar7[3] = bVar52;
      auVar7[4] = bVar53;
      auVar7[5] = bVar54;
      auVar7[6] = bVar55;
      auVar7[7] = bVar56;
      auVar7[8] = bVar57;
      auVar7[9] = bVar58;
      auVar7[10] = bVar59;
      auVar7[0xb] = bVar60;
      auVar7[0xc] = bVar61;
      auVar7[0xd] = bVar62;
      auVar7[0xe] = bVar63;
      auVar7[0xf] = bVar64;
      auVar65 = NEON_ext(auVar6,auVar7,8,1);
      local_84 = CONCAT13(bVar52 ^ auVar65[3],
                          CONCAT12(bVar51 ^ auVar65[2],
                                   CONCAT11(bVar50 ^ auVar65[1],bVar49 ^ auVar65[0])));
      local_84 = local_84 ^
                 (uint)(CONCAT17(bVar56 ^ auVar65[7],
                                 CONCAT16(bVar55 ^ auVar65[6],
                                          CONCAT15(bVar54 ^ auVar65[5],
                                                   CONCAT14(bVar53 ^ auVar65[4],local_84)))) >> 0x20
                       );
      do {
        *(byte *)((long)pvVar32 + uVar46) =
             (&DAT_001026e8)[uVar46] ^ (byte)uVar46 ^ *(byte *)((ulong)&local_84 | uVar46 & 3);
        uVar46 = uVar46 + 1;
      } while (uVar46 != 0x80);
      lVar33 = (**(code **)(*param_1 + 0x388))(param_1,lVar30,pvVar29,pvVar32);
      uVar31 = __strlen_chk(pvVar29,0x80);
      __memset_chk(pvVar29,0,uVar31,0x80);
      free(pvVar29);
      uVar31 = __strlen_chk(pvVar32,0x80);
      __memset_chk(pvVar32,0,uVar31,0x80);
      free(pvVar32);
      if ((lVar33 != 0) &&
         (lVar30 = (**(code **)(*param_1 + 0x390))(param_1,lVar30,lVar33), lVar30 != 0)) {
        pvVar29 = malloc(0x80);
        bVar49 = 0;
        bVar50 = 0;
        bVar51 = 0;
        bVar52 = 0;
        bVar53 = 0;
        bVar54 = 0;
        bVar55 = 0;
        bVar56 = 0;
        bVar57 = 0;
        bVar58 = 0;
        bVar59 = 0;
        bVar60 = 0;
        bVar61 = 0;
        bVar62 = 0;
        bVar63 = 0;
        bVar64 = 0;
        iVar93 = 3;
        iVar94 = 4;
        iVar91 = 1;
        iVar92 = 2;
        uVar35 = 0;
        uVar31 = 0x1c680c8c;
        iVar26 = 0x388;
        do {
          iVar66 = iVar91 * 0x1a1a5d;
          iVar67 = iVar92 * 0x1a1a5d;
          iVar68 = iVar93 * 0x1a1a5d;
          iVar69 = iVar94 * 0x1a1a5d;
          iVar91 = iVar91 + 8;
          iVar92 = iVar92 + 8;
          iVar93 = iVar93 + 8;
          iVar94 = iVar94 + 8;
          iVar26 = iVar26 + -8;
          iVar70 = iVar66 + 0x686974;
          iVar71 = iVar67 + 0x686974;
          iVar72 = iVar68 + 0x686974;
          iVar73 = iVar69 + 0x686974;
          bVar75 = (byte)uVar31 ^ (byte)iVar66;
          bVar76 = (byte)((ulong)uVar31 >> 8) ^ (byte)((uint)iVar66 >> 8);
          bVar77 = (byte)((ulong)uVar31 >> 0x10) ^ (byte)((uint)iVar66 >> 0x10);
          bVar78 = (byte)((ulong)uVar31 >> 0x18) ^ (byte)((uint)iVar66 >> 0x18);
          bVar79 = (byte)((ulong)uVar31 >> 0x20) ^ (byte)iVar67;
          bVar80 = (byte)((ulong)uVar31 >> 0x28) ^ (byte)((uint)iVar67 >> 8);
          bVar81 = (byte)((ulong)uVar31 >> 0x30) ^ (byte)((uint)iVar67 >> 0x10);
          bVar82 = (byte)((ulong)uVar31 >> 0x38) ^ (byte)((uint)iVar67 >> 0x18);
          uVar31 = CONCAT17(bVar82,CONCAT16(bVar81,CONCAT15(bVar80,CONCAT14(bVar79,CONCAT13(bVar78,
                                                  CONCAT12(bVar77,CONCAT11(bVar76,bVar75)))))));
          bVar83 = (byte)uVar35 ^ (byte)iVar68;
          bVar84 = (byte)((ulong)uVar35 >> 8) ^ (byte)((uint)iVar68 >> 8);
          bVar85 = (byte)((ulong)uVar35 >> 0x10) ^ (byte)((uint)iVar68 >> 0x10);
          bVar86 = (byte)((ulong)uVar35 >> 0x18) ^ (byte)((uint)iVar68 >> 0x18);
          bVar87 = (byte)((ulong)uVar35 >> 0x20) ^ (byte)iVar69;
          bVar88 = (byte)((ulong)uVar35 >> 0x28) ^ (byte)((uint)iVar69 >> 8);
          bVar89 = (byte)((ulong)uVar35 >> 0x30) ^ (byte)((uint)iVar69 >> 0x10);
          bVar90 = (byte)((ulong)uVar35 >> 0x38) ^ (byte)((uint)iVar69 >> 0x18);
          uVar35 = CONCAT17(bVar90,CONCAT16(bVar89,CONCAT15(bVar88,CONCAT14(bVar87,CONCAT13(bVar86,
                                                  CONCAT12(bVar85,CONCAT11(bVar84,bVar83)))))));
          bVar49 = bVar49 ^ (byte)iVar70;
          bVar50 = bVar50 ^ (byte)((uint)iVar70 >> 8);
          bVar51 = bVar51 ^ (byte)((uint)iVar70 >> 0x10);
          bVar52 = bVar52 ^ (byte)((uint)iVar70 >> 0x18);
          bVar53 = bVar53 ^ (byte)iVar71;
          bVar54 = bVar54 ^ (byte)((uint)iVar71 >> 8);
          bVar55 = bVar55 ^ (byte)((uint)iVar71 >> 0x10);
          bVar56 = bVar56 ^ (byte)((uint)iVar71 >> 0x18);
          bVar57 = bVar57 ^ (byte)iVar72;
          bVar58 = bVar58 ^ (byte)((uint)iVar72 >> 8);
          bVar59 = bVar59 ^ (byte)((uint)iVar72 >> 0x10);
          bVar60 = bVar60 ^ (byte)((uint)iVar72 >> 0x18);
          bVar61 = bVar61 ^ (byte)iVar73;
          bVar62 = bVar62 ^ (byte)((uint)iVar73 >> 8);
          bVar63 = bVar63 ^ (byte)((uint)iVar73 >> 0x10);
          bVar64 = bVar64 ^ (byte)((uint)iVar73 >> 0x18);
        } while (iVar26 != 0);
        bVar49 = bVar49 ^ bVar75;
        bVar50 = bVar50 ^ bVar76;
        bVar51 = bVar51 ^ bVar77;
        bVar52 = bVar52 ^ bVar78;
        bVar53 = bVar53 ^ bVar79;
        bVar54 = bVar54 ^ bVar80;
        bVar55 = bVar55 ^ bVar81;
        bVar56 = bVar56 ^ bVar82;
        bVar57 = bVar57 ^ bVar83;
        bVar58 = bVar58 ^ bVar84;
        bVar59 = bVar59 ^ bVar85;
        bVar60 = bVar60 ^ bVar86;
        bVar61 = bVar61 ^ bVar87;
        bVar62 = bVar62 ^ bVar88;
        bVar63 = bVar63 ^ bVar89;
        bVar64 = bVar64 ^ bVar90;
        uVar46 = 0;
        auVar8[1] = bVar50;
        auVar8[0] = bVar49;
        auVar8[2] = bVar51;
        auVar8[3] = bVar52;
        auVar8[4] = bVar53;
        auVar8[5] = bVar54;
        auVar8[6] = bVar55;
        auVar8[7] = bVar56;
        auVar8[8] = bVar57;
        auVar8[9] = bVar58;
        auVar8[10] = bVar59;
        auVar8[0xb] = bVar60;
        auVar8[0xc] = bVar61;
        auVar8[0xd] = bVar62;
        auVar8[0xe] = bVar63;
        auVar8[0xf] = bVar64;
        auVar9[1] = bVar50;
        auVar9[0] = bVar49;
        auVar9[2] = bVar51;
        auVar9[3] = bVar52;
        auVar9[4] = bVar53;
        auVar9[5] = bVar54;
        auVar9[6] = bVar55;
        auVar9[7] = bVar56;
        auVar9[8] = bVar57;
        auVar9[9] = bVar58;
        auVar9[10] = bVar59;
        auVar9[0xb] = bVar60;
        auVar9[0xc] = bVar61;
        auVar9[0xd] = bVar62;
        auVar9[0xe] = bVar63;
        auVar9[0xf] = bVar64;
        auVar65 = NEON_ext(auVar8,auVar9,8,1);
        uVar27 = CONCAT13(bVar52 ^ auVar65[3],
                          CONCAT12(bVar51 ^ auVar65[2],
                                   CONCAT11(bVar50 ^ auVar65[1],bVar49 ^ auVar65[0])));
        local_84 = uVar27 ^ 0x5c67057d ^
                   (uint)(CONCAT17(bVar56 ^ auVar65[7],
                                   CONCAT16(bVar55 ^ auVar65[6],
                                            CONCAT15(bVar54 ^ auVar65[5],
                                                     CONCAT14(bVar53 ^ auVar65[4],uVar27)))) >> 0x20
                         );
        do {
          *(byte *)((long)pvVar29 + uVar46) =
               (&DAT_00102768)[uVar46] ^ (byte)uVar46 ^ *(byte *)((ulong)&local_84 | uVar46 & 3);
          uVar46 = uVar46 + 1;
        } while (uVar46 != 0x80);
        lVar33 = (**(code **)(*param_1 + 0x30))(param_1,pvVar29);
        uVar31 = __strlen_chk(pvVar29,0x80);
        __memset_chk(pvVar29,0,uVar31,0x80);
        free(pvVar29);
        if (lVar33 != 0) {
          pvVar29 = malloc(0x80);
          bVar49 = 0;
          bVar50 = 0;
          bVar51 = 0;
          bVar52 = 0;
          bVar53 = 0;
          bVar54 = 0;
          bVar55 = 0;
          bVar56 = 0;
          bVar57 = 0;
          bVar58 = 0;
          bVar59 = 0;
          bVar60 = 0;
          bVar61 = 0;
          bVar62 = 0;
          bVar63 = 0;
          bVar64 = 0;
          iVar93 = 3;
          iVar94 = 4;
          iVar91 = 1;
          iVar92 = 2;
          uVar35 = 0;
          uVar31 = 0x4cd7852d;
          iVar26 = 0x3d0;
          do {
            iVar66 = iVar91 * 0x1c9e44;
            iVar67 = iVar92 * 0x1c9e44;
            iVar68 = iVar93 * 0x1c9e44;
            iVar69 = iVar94 * 0x1c9e44;
            iVar91 = iVar91 + 8;
            iVar92 = iVar92 + 8;
            iVar93 = iVar93 + 8;
            iVar94 = iVar94 + 8;
            iVar26 = iVar26 + -8;
            iVar70 = iVar66 + 0x727910;
            iVar71 = iVar67 + 0x727910;
            iVar72 = iVar68 + 0x727910;
            iVar73 = iVar69 + 0x727910;
            bVar75 = (byte)uVar31 ^ (byte)iVar66;
            bVar76 = (byte)((ulong)uVar31 >> 8) ^ (byte)((uint)iVar66 >> 8);
            bVar77 = (byte)((ulong)uVar31 >> 0x10) ^ (byte)((uint)iVar66 >> 0x10);
            bVar78 = (byte)((ulong)uVar31 >> 0x18) ^ (byte)((uint)iVar66 >> 0x18);
            bVar79 = (byte)((ulong)uVar31 >> 0x20) ^ (byte)iVar67;
            bVar80 = (byte)((ulong)uVar31 >> 0x28) ^ (byte)((uint)iVar67 >> 8);
            bVar81 = (byte)((ulong)uVar31 >> 0x30) ^ (byte)((uint)iVar67 >> 0x10);
            bVar82 = (byte)((ulong)uVar31 >> 0x38) ^ (byte)((uint)iVar67 >> 0x18);
            uVar31 = CONCAT17(bVar82,CONCAT16(bVar81,CONCAT15(bVar80,CONCAT14(bVar79,CONCAT13(bVar78
                                                  ,CONCAT12(bVar77,CONCAT11(bVar76,bVar75)))))));
            bVar83 = (byte)uVar35 ^ (byte)iVar68;
            bVar84 = (byte)((ulong)uVar35 >> 8) ^ (byte)((uint)iVar68 >> 8);
            bVar85 = (byte)((ulong)uVar35 >> 0x10) ^ (byte)((uint)iVar68 >> 0x10);
            bVar86 = (byte)((ulong)uVar35 >> 0x18) ^ (byte)((uint)iVar68 >> 0x18);
            bVar87 = (byte)((ulong)uVar35 >> 0x20) ^ (byte)iVar69;
            bVar88 = (byte)((ulong)uVar35 >> 0x28) ^ (byte)((uint)iVar69 >> 8);
            bVar89 = (byte)((ulong)uVar35 >> 0x30) ^ (byte)((uint)iVar69 >> 0x10);
            bVar90 = (byte)((ulong)uVar35 >> 0x38) ^ (byte)((uint)iVar69 >> 0x18);
            uVar35 = CONCAT17(bVar90,CONCAT16(bVar89,CONCAT15(bVar88,CONCAT14(bVar87,CONCAT13(bVar86
                                                  ,CONCAT12(bVar85,CONCAT11(bVar84,bVar83)))))));
            bVar49 = bVar49 ^ (byte)iVar70;
            bVar50 = bVar50 ^ (byte)((uint)iVar70 >> 8);
            bVar51 = bVar51 ^ (byte)((uint)iVar70 >> 0x10);
            bVar52 = bVar52 ^ (byte)((uint)iVar70 >> 0x18);
            bVar53 = bVar53 ^ (byte)iVar71;
            bVar54 = bVar54 ^ (byte)((uint)iVar71 >> 8);
            bVar55 = bVar55 ^ (byte)((uint)iVar71 >> 0x10);
            bVar56 = bVar56 ^ (byte)((uint)iVar71 >> 0x18);
            bVar57 = bVar57 ^ (byte)iVar72;
            bVar58 = bVar58 ^ (byte)((uint)iVar72 >> 8);
            bVar59 = bVar59 ^ (byte)((uint)iVar72 >> 0x10);
            bVar60 = bVar60 ^ (byte)((uint)iVar72 >> 0x18);
            bVar61 = bVar61 ^ (byte)iVar73;
            bVar62 = bVar62 ^ (byte)((uint)iVar73 >> 8);
            bVar63 = bVar63 ^ (byte)((uint)iVar73 >> 0x10);
            bVar64 = bVar64 ^ (byte)((uint)iVar73 >> 0x18);
          } while (iVar26 != 0);
          bVar49 = bVar49 ^ bVar75;
          bVar50 = bVar50 ^ bVar76;
          bVar51 = bVar51 ^ bVar77;
          bVar52 = bVar52 ^ bVar78;
          bVar53 = bVar53 ^ bVar79;
          bVar54 = bVar54 ^ bVar80;
          bVar55 = bVar55 ^ bVar81;
          bVar56 = bVar56 ^ bVar82;
          bVar57 = bVar57 ^ bVar83;
          bVar58 = bVar58 ^ bVar84;
          bVar59 = bVar59 ^ bVar85;
          bVar60 = bVar60 ^ bVar86;
          bVar61 = bVar61 ^ bVar87;
          bVar62 = bVar62 ^ bVar88;
          bVar63 = bVar63 ^ bVar89;
          bVar64 = bVar64 ^ bVar90;
          uVar46 = 0;
          auVar10[1] = bVar50;
          auVar10[0] = bVar49;
          auVar10[2] = bVar51;
          auVar10[3] = bVar52;
          auVar10[4] = bVar53;
          auVar10[5] = bVar54;
          auVar10[6] = bVar55;
          auVar10[7] = bVar56;
          auVar10[8] = bVar57;
          auVar10[9] = bVar58;
          auVar10[10] = bVar59;
          auVar10[0xb] = bVar60;
          auVar10[0xc] = bVar61;
          auVar10[0xd] = bVar62;
          auVar10[0xe] = bVar63;
          auVar10[0xf] = bVar64;
          auVar11[1] = bVar50;
          auVar11[0] = bVar49;
          auVar11[2] = bVar51;
          auVar11[3] = bVar52;
          auVar11[4] = bVar53;
          auVar11[5] = bVar54;
          auVar11[6] = bVar55;
          auVar11[7] = bVar56;
          auVar11[8] = bVar57;
          auVar11[9] = bVar58;
          auVar11[10] = bVar59;
          auVar11[0xb] = bVar60;
          auVar11[0xc] = bVar61;
          auVar11[0xd] = bVar62;
          auVar11[0xe] = bVar63;
          auVar11[0xf] = bVar64;
          auVar65 = NEON_ext(auVar10,auVar11,8,1);
          local_84 = CONCAT13(bVar52 ^ auVar65[3],
                              CONCAT12(bVar51 ^ auVar65[2],
                                       CONCAT11(bVar50 ^ auVar65[1],bVar49 ^ auVar65[0])));
          local_84 = local_84 ^
                     (uint)(CONCAT17(bVar56 ^ auVar65[7],
                                     CONCAT16(bVar55 ^ auVar65[6],
                                              CONCAT15(bVar54 ^ auVar65[5],
                                                       CONCAT14(bVar53 ^ auVar65[4],local_84)))) >>
                           0x20);
          do {
            *(byte *)((long)pvVar29 + uVar46) =
                 (&DAT_001027e8)[uVar46] ^ (byte)uVar46 ^ *(byte *)((ulong)&local_84 | uVar46 & 3);
            uVar46 = uVar46 + 1;
          } while (uVar46 != 0x80);
          pvVar32 = malloc(0x80);
          bVar49 = 0;
          bVar50 = 0;
          bVar51 = 0;
          bVar52 = 0;
          bVar53 = 0;
          bVar54 = 0;
          bVar55 = 0;
          bVar56 = 0;
          bVar57 = 0;
          bVar58 = 0;
          bVar59 = 0;
          bVar60 = 0;
          bVar61 = 0;
          bVar62 = 0;
          bVar63 = 0;
          bVar64 = 0;
          iVar93 = 3;
          iVar94 = 4;
          iVar91 = 1;
          iVar92 = 2;
          uVar35 = 0;
          uVar31 = 0x7388c19a;
          iVar26 = 0x398;
          do {
            iVar66 = iVar91 * 0x3a6f3;
            iVar67 = iVar92 * 0x3a6f3;
            iVar68 = iVar93 * 0x3a6f3;
            iVar69 = iVar94 * 0x3a6f3;
            iVar91 = iVar91 + 8;
            iVar92 = iVar92 + 8;
            iVar93 = iVar93 + 8;
            iVar94 = iVar94 + 8;
            iVar26 = iVar26 + -8;
            iVar70 = iVar66 + 0xe9bcc;
            iVar71 = iVar67 + 0xe9bcc;
            iVar72 = iVar68 + 0xe9bcc;
            iVar73 = iVar69 + 0xe9bcc;
            bVar75 = (byte)uVar31 ^ (byte)iVar66;
            bVar76 = (byte)((ulong)uVar31 >> 8) ^ (byte)((uint)iVar66 >> 8);
            bVar77 = (byte)((ulong)uVar31 >> 0x10) ^ (byte)((uint)iVar66 >> 0x10);
            bVar78 = (byte)((ulong)uVar31 >> 0x18) ^ (byte)((uint)iVar66 >> 0x18);
            bVar79 = (byte)((ulong)uVar31 >> 0x20) ^ (byte)iVar67;
            bVar80 = (byte)((ulong)uVar31 >> 0x28) ^ (byte)((uint)iVar67 >> 8);
            bVar81 = (byte)((ulong)uVar31 >> 0x30) ^ (byte)((uint)iVar67 >> 0x10);
            bVar82 = (byte)((ulong)uVar31 >> 0x38) ^ (byte)((uint)iVar67 >> 0x18);
            uVar31 = CONCAT17(bVar82,CONCAT16(bVar81,CONCAT15(bVar80,CONCAT14(bVar79,CONCAT13(bVar78
                                                  ,CONCAT12(bVar77,CONCAT11(bVar76,bVar75)))))));
            bVar83 = (byte)uVar35 ^ (byte)iVar68;
            bVar84 = (byte)((ulong)uVar35 >> 8) ^ (byte)((uint)iVar68 >> 8);
            bVar85 = (byte)((ulong)uVar35 >> 0x10) ^ (byte)((uint)iVar68 >> 0x10);
            bVar86 = (byte)((ulong)uVar35 >> 0x18) ^ (byte)((uint)iVar68 >> 0x18);
            bVar87 = (byte)((ulong)uVar35 >> 0x20) ^ (byte)iVar69;
            bVar88 = (byte)((ulong)uVar35 >> 0x28) ^ (byte)((uint)iVar69 >> 8);
            bVar89 = (byte)((ulong)uVar35 >> 0x30) ^ (byte)((uint)iVar69 >> 0x10);
            bVar90 = (byte)((ulong)uVar35 >> 0x38) ^ (byte)((uint)iVar69 >> 0x18);
            uVar35 = CONCAT17(bVar90,CONCAT16(bVar89,CONCAT15(bVar88,CONCAT14(bVar87,CONCAT13(bVar86
                                                  ,CONCAT12(bVar85,CONCAT11(bVar84,bVar83)))))));
            bVar49 = bVar49 ^ (byte)iVar70;
            bVar50 = bVar50 ^ (byte)((uint)iVar70 >> 8);
            bVar51 = bVar51 ^ (byte)((uint)iVar70 >> 0x10);
            bVar52 = bVar52 ^ (byte)((uint)iVar70 >> 0x18);
            bVar53 = bVar53 ^ (byte)iVar71;
            bVar54 = bVar54 ^ (byte)((uint)iVar71 >> 8);
            bVar55 = bVar55 ^ (byte)((uint)iVar71 >> 0x10);
            bVar56 = bVar56 ^ (byte)((uint)iVar71 >> 0x18);
            bVar57 = bVar57 ^ (byte)iVar72;
            bVar58 = bVar58 ^ (byte)((uint)iVar72 >> 8);
            bVar59 = bVar59 ^ (byte)((uint)iVar72 >> 0x10);
            bVar60 = bVar60 ^ (byte)((uint)iVar72 >> 0x18);
            bVar61 = bVar61 ^ (byte)iVar73;
            bVar62 = bVar62 ^ (byte)((uint)iVar73 >> 8);
            bVar63 = bVar63 ^ (byte)((uint)iVar73 >> 0x10);
            bVar64 = bVar64 ^ (byte)((uint)iVar73 >> 0x18);
          } while (iVar26 != 0);
          bVar49 = bVar49 ^ bVar75;
          bVar50 = bVar50 ^ bVar76;
          bVar51 = bVar51 ^ bVar77;
          bVar52 = bVar52 ^ bVar78;
          bVar53 = bVar53 ^ bVar79;
          bVar54 = bVar54 ^ bVar80;
          bVar55 = bVar55 ^ bVar81;
          bVar56 = bVar56 ^ bVar82;
          bVar57 = bVar57 ^ bVar83;
          bVar58 = bVar58 ^ bVar84;
          bVar59 = bVar59 ^ bVar85;
          bVar60 = bVar60 ^ bVar86;
          bVar61 = bVar61 ^ bVar87;
          bVar62 = bVar62 ^ bVar88;
          bVar63 = bVar63 ^ bVar89;
          bVar64 = bVar64 ^ bVar90;
          uVar46 = 0;
          auVar12[1] = bVar50;
          auVar12[0] = bVar49;
          auVar12[2] = bVar51;
          auVar12[3] = bVar52;
          auVar12[4] = bVar53;
          auVar12[5] = bVar54;
          auVar12[6] = bVar55;
          auVar12[7] = bVar56;
          auVar12[8] = bVar57;
          auVar12[9] = bVar58;
          auVar12[10] = bVar59;
          auVar12[0xb] = bVar60;
          auVar12[0xc] = bVar61;
          auVar12[0xd] = bVar62;
          auVar12[0xe] = bVar63;
          auVar12[0xf] = bVar64;
          auVar13[1] = bVar50;
          auVar13[0] = bVar49;
          auVar13[2] = bVar51;
          auVar13[3] = bVar52;
          auVar13[4] = bVar53;
          auVar13[5] = bVar54;
          auVar13[6] = bVar55;
          auVar13[7] = bVar56;
          auVar13[8] = bVar57;
          auVar13[9] = bVar58;
          auVar13[10] = bVar59;
          auVar13[0xb] = bVar60;
          auVar13[0xc] = bVar61;
          auVar13[0xd] = bVar62;
          auVar13[0xe] = bVar63;
          auVar13[0xf] = bVar64;
          auVar65 = NEON_ext(auVar12,auVar13,8,1);
          uVar27 = CONCAT13(bVar52 ^ auVar65[3],
                            CONCAT12(bVar51 ^ auVar65[2],
                                     CONCAT11(bVar50 ^ auVar65[1],bVar49 ^ auVar65[0])));
          local_84 = uVar27 ^ 0x742dd ^
                     (uint)(CONCAT17(bVar56 ^ auVar65[7],
                                     CONCAT16(bVar55 ^ auVar65[6],
                                              CONCAT15(bVar54 ^ auVar65[5],
                                                       CONCAT14(bVar53 ^ auVar65[4],uVar27)))) >>
                           0x20);
          do {
            *(byte *)((long)pvVar32 + uVar46) =
                 (&DAT_00102868)[uVar46] ^ (byte)uVar46 ^ *(byte *)((ulong)&local_84 | uVar46 & 3);
            uVar46 = uVar46 + 1;
          } while (uVar46 != 0x80);
          lVar34 = (**(code **)(*param_1 + 0x480))(param_1,lVar33,pvVar29,pvVar32);
          uVar31 = __strlen_chk(pvVar29,0x80);
          __memset_chk(pvVar29,0,uVar31,0x80);
          free(pvVar29);
          uVar31 = __strlen_chk(pvVar32,0x80);
          __memset_chk(pvVar32,0,uVar31,0x80);
          free(pvVar32);
          if (lVar34 != 0) {
            iVar91 = (**(code **)(*param_1 + 0x4b0))(param_1,lVar33,lVar34);
            uVar31 = (**(code **)(*param_1 + 0xf8))(param_1,lVar30);
            pvVar29 = malloc(0x80);
            bVar49 = 0;
            bVar50 = 0;
            bVar51 = 0;
            bVar52 = 0;
            bVar53 = 0;
            bVar54 = 0;
            bVar55 = 0;
            bVar56 = 0;
            bVar57 = 0;
            bVar58 = 0;
            bVar59 = 0;
            bVar60 = 0;
            bVar61 = 0;
            bVar62 = 0;
            bVar63 = 0;
            bVar64 = 0;
            iVar94 = 3;
            iVar66 = 4;
            iVar92 = 1;
            iVar93 = 2;
            uVar36 = 0;
            uVar35 = 0x8a062cf;
            iVar26 = 0x228;
            do {
              iVar67 = iVar92 * 0x494f4;
              iVar68 = iVar93 * 0x494f4;
              iVar69 = iVar94 * 0x494f4;
              iVar70 = iVar66 * 0x494f4;
              iVar92 = iVar92 + 8;
              iVar93 = iVar93 + 8;
              iVar94 = iVar94 + 8;
              iVar66 = iVar66 + 8;
              iVar26 = iVar26 + -8;
              iVar71 = iVar67 + 0x1253d0;
              iVar72 = iVar68 + 0x1253d0;
              iVar73 = iVar69 + 0x1253d0;
              iVar74 = iVar70 + 0x1253d0;
              bVar75 = (byte)uVar35 ^ (byte)iVar67;
              bVar76 = (byte)((ulong)uVar35 >> 8) ^ (byte)((uint)iVar67 >> 8);
              bVar77 = (byte)((ulong)uVar35 >> 0x10) ^ (byte)((uint)iVar67 >> 0x10);
              bVar78 = (byte)((ulong)uVar35 >> 0x18) ^ (byte)((uint)iVar67 >> 0x18);
              bVar79 = (byte)((ulong)uVar35 >> 0x20) ^ (byte)iVar68;
              bVar80 = (byte)((ulong)uVar35 >> 0x28) ^ (byte)((uint)iVar68 >> 8);
              bVar81 = (byte)((ulong)uVar35 >> 0x30) ^ (byte)((uint)iVar68 >> 0x10);
              bVar82 = (byte)((ulong)uVar35 >> 0x38) ^ (byte)((uint)iVar68 >> 0x18);
              uVar35 = CONCAT17(bVar82,CONCAT16(bVar81,CONCAT15(bVar80,CONCAT14(bVar79,CONCAT13(
                                                  bVar78,CONCAT12(bVar77,CONCAT11(bVar76,bVar75)))))
                                               ));
              bVar83 = (byte)uVar36 ^ (byte)iVar69;
              bVar84 = (byte)((ulong)uVar36 >> 8) ^ (byte)((uint)iVar69 >> 8);
              bVar85 = (byte)((ulong)uVar36 >> 0x10) ^ (byte)((uint)iVar69 >> 0x10);
              bVar86 = (byte)((ulong)uVar36 >> 0x18) ^ (byte)((uint)iVar69 >> 0x18);
              bVar87 = (byte)((ulong)uVar36 >> 0x20) ^ (byte)iVar70;
              bVar88 = (byte)((ulong)uVar36 >> 0x28) ^ (byte)((uint)iVar70 >> 8);
              bVar89 = (byte)((ulong)uVar36 >> 0x30) ^ (byte)((uint)iVar70 >> 0x10);
              bVar90 = (byte)((ulong)uVar36 >> 0x38) ^ (byte)((uint)iVar70 >> 0x18);
              uVar36 = CONCAT17(bVar90,CONCAT16(bVar89,CONCAT15(bVar88,CONCAT14(bVar87,CONCAT13(
                                                  bVar86,CONCAT12(bVar85,CONCAT11(bVar84,bVar83)))))
                                               ));
              bVar49 = bVar49 ^ (byte)iVar71;
              bVar50 = bVar50 ^ (byte)((uint)iVar71 >> 8);
              bVar51 = bVar51 ^ (byte)((uint)iVar71 >> 0x10);
              bVar52 = bVar52 ^ (byte)((uint)iVar71 >> 0x18);
              bVar53 = bVar53 ^ (byte)iVar72;
              bVar54 = bVar54 ^ (byte)((uint)iVar72 >> 8);
              bVar55 = bVar55 ^ (byte)((uint)iVar72 >> 0x10);
              bVar56 = bVar56 ^ (byte)((uint)iVar72 >> 0x18);
              bVar57 = bVar57 ^ (byte)iVar73;
              bVar58 = bVar58 ^ (byte)((uint)iVar73 >> 8);
              bVar59 = bVar59 ^ (byte)((uint)iVar73 >> 0x10);
              bVar60 = bVar60 ^ (byte)((uint)iVar73 >> 0x18);
              bVar61 = bVar61 ^ (byte)iVar74;
              bVar62 = bVar62 ^ (byte)((uint)iVar74 >> 8);
              bVar63 = bVar63 ^ (byte)((uint)iVar74 >> 0x10);
              bVar64 = bVar64 ^ (byte)((uint)iVar74 >> 0x18);
            } while (iVar26 != 0);
            bVar49 = bVar49 ^ bVar75;
            bVar50 = bVar50 ^ bVar76;
            bVar51 = bVar51 ^ bVar77;
            bVar52 = bVar52 ^ bVar78;
            bVar53 = bVar53 ^ bVar79;
            bVar54 = bVar54 ^ bVar80;
            bVar55 = bVar55 ^ bVar81;
            bVar56 = bVar56 ^ bVar82;
            bVar57 = bVar57 ^ bVar83;
            bVar58 = bVar58 ^ bVar84;
            bVar59 = bVar59 ^ bVar85;
            bVar60 = bVar60 ^ bVar86;
            bVar61 = bVar61 ^ bVar87;
            bVar62 = bVar62 ^ bVar88;
            bVar63 = bVar63 ^ bVar89;
            bVar64 = bVar64 ^ bVar90;
            uVar46 = 0;
            auVar14[1] = bVar50;
            auVar14[0] = bVar49;
            auVar14[2] = bVar51;
            auVar14[3] = bVar52;
            auVar14[4] = bVar53;
            auVar14[5] = bVar54;
            auVar14[6] = bVar55;
            auVar14[7] = bVar56;
            auVar14[8] = bVar57;
            auVar14[9] = bVar58;
            auVar14[10] = bVar59;
            auVar14[0xb] = bVar60;
            auVar14[0xc] = bVar61;
            auVar14[0xd] = bVar62;
            auVar14[0xe] = bVar63;
            auVar14[0xf] = bVar64;
            auVar15[1] = bVar50;
            auVar15[0] = bVar49;
            auVar15[2] = bVar51;
            auVar15[3] = bVar52;
            auVar15[4] = bVar53;
            auVar15[5] = bVar54;
            auVar15[6] = bVar55;
            auVar15[7] = bVar56;
            auVar15[8] = bVar57;
            auVar15[9] = bVar58;
            auVar15[10] = bVar59;
            auVar15[0xb] = bVar60;
            auVar15[0xc] = bVar61;
            auVar15[0xd] = bVar62;
            auVar15[0xe] = bVar63;
            auVar15[0xf] = bVar64;
            auVar65 = NEON_ext(auVar14,auVar15,8,1);
            uVar27 = CONCAT13(bVar52 ^ auVar65[3],
                              CONCAT12(bVar51 ^ auVar65[2],
                                       CONCAT11(bVar50 ^ auVar65[1],bVar49 ^ auVar65[0])));
            local_84 = uVar27 ^ 0x12f610 ^
                       (uint)(CONCAT17(bVar56 ^ auVar65[7],
                                       CONCAT16(bVar55 ^ auVar65[6],
                                                CONCAT15(bVar54 ^ auVar65[5],
                                                         CONCAT14(bVar53 ^ auVar65[4],uVar27)))) >>
                             0x20);
            do {
              *(byte *)((long)pvVar29 + uVar46) =
                   (&DAT_001028e8)[uVar46] ^ (byte)uVar46 ^ *(byte *)((ulong)&local_84 | uVar46 & 3)
              ;
              uVar46 = uVar46 + 1;
            } while (uVar46 != 0x80);
            pvVar32 = malloc(0x80);
            bVar49 = 0;
            bVar50 = 0;
            bVar51 = 0;
            bVar52 = 0;
            bVar53 = 0;
            bVar54 = 0;
            bVar55 = 0;
            bVar56 = 0;
            bVar57 = 0;
            bVar58 = 0;
            bVar59 = 0;
            bVar60 = 0;
            bVar61 = 0;
            bVar62 = 0;
            bVar63 = 0;
            bVar64 = 0;
            iVar94 = 3;
            iVar66 = 4;
            iVar92 = 1;
            iVar93 = 2;
            uVar36 = 0;
            uVar35 = 0x3017a073;
            iVar26 = 0x2e8;
            do {
              iVar67 = iVar92 * 0xd1ac;
              iVar68 = iVar93 * 0xd1ac;
              iVar69 = iVar94 * 0xd1ac;
              iVar70 = iVar66 * 0xd1ac;
              iVar92 = iVar92 + 8;
              iVar93 = iVar93 + 8;
              iVar94 = iVar94 + 8;
              iVar66 = iVar66 + 8;
              iVar26 = iVar26 + -8;
              iVar71 = iVar67 + 0x346b0;
              iVar72 = iVar68 + 0x346b0;
              iVar73 = iVar69 + 0x346b0;
              iVar74 = iVar70 + 0x346b0;
              bVar75 = (byte)uVar35 ^ (byte)iVar67;
              bVar76 = (byte)((ulong)uVar35 >> 8) ^ (byte)((uint)iVar67 >> 8);
              bVar77 = (byte)((ulong)uVar35 >> 0x10) ^ (byte)((uint)iVar67 >> 0x10);
              bVar78 = (byte)((ulong)uVar35 >> 0x18) ^ (byte)((uint)iVar67 >> 0x18);
              bVar79 = (byte)((ulong)uVar35 >> 0x20) ^ (byte)iVar68;
              bVar80 = (byte)((ulong)uVar35 >> 0x28) ^ (byte)((uint)iVar68 >> 8);
              bVar81 = (byte)((ulong)uVar35 >> 0x30) ^ (byte)((uint)iVar68 >> 0x10);
              bVar82 = (byte)((ulong)uVar35 >> 0x38) ^ (byte)((uint)iVar68 >> 0x18);
              uVar35 = CONCAT17(bVar82,CONCAT16(bVar81,CONCAT15(bVar80,CONCAT14(bVar79,CONCAT13(
                                                  bVar78,CONCAT12(bVar77,CONCAT11(bVar76,bVar75)))))
                                               ));
              bVar83 = (byte)uVar36 ^ (byte)iVar69;
              bVar84 = (byte)((ulong)uVar36 >> 8) ^ (byte)((uint)iVar69 >> 8);
              bVar85 = (byte)((ulong)uVar36 >> 0x10) ^ (byte)((uint)iVar69 >> 0x10);
              bVar86 = (byte)((ulong)uVar36 >> 0x18) ^ (byte)((uint)iVar69 >> 0x18);
              bVar87 = (byte)((ulong)uVar36 >> 0x20) ^ (byte)iVar70;
              bVar88 = (byte)((ulong)uVar36 >> 0x28) ^ (byte)((uint)iVar70 >> 8);
              bVar89 = (byte)((ulong)uVar36 >> 0x30) ^ (byte)((uint)iVar70 >> 0x10);
              bVar90 = (byte)((ulong)uVar36 >> 0x38) ^ (byte)((uint)iVar70 >> 0x18);
              uVar36 = CONCAT17(bVar90,CONCAT16(bVar89,CONCAT15(bVar88,CONCAT14(bVar87,CONCAT13(
                                                  bVar86,CONCAT12(bVar85,CONCAT11(bVar84,bVar83)))))
                                               ));
              bVar49 = bVar49 ^ (byte)iVar71;
              bVar50 = bVar50 ^ (byte)((uint)iVar71 >> 8);
              bVar51 = bVar51 ^ (byte)((uint)iVar71 >> 0x10);
              bVar52 = bVar52 ^ (byte)((uint)iVar71 >> 0x18);
              bVar53 = bVar53 ^ (byte)iVar72;
              bVar54 = bVar54 ^ (byte)((uint)iVar72 >> 8);
              bVar55 = bVar55 ^ (byte)((uint)iVar72 >> 0x10);
              bVar56 = bVar56 ^ (byte)((uint)iVar72 >> 0x18);
              bVar57 = bVar57 ^ (byte)iVar73;
              bVar58 = bVar58 ^ (byte)((uint)iVar73 >> 8);
              bVar59 = bVar59 ^ (byte)((uint)iVar73 >> 0x10);
              bVar60 = bVar60 ^ (byte)((uint)iVar73 >> 0x18);
              bVar61 = bVar61 ^ (byte)iVar74;
              bVar62 = bVar62 ^ (byte)((uint)iVar74 >> 8);
              bVar63 = bVar63 ^ (byte)((uint)iVar74 >> 0x10);
              bVar64 = bVar64 ^ (byte)((uint)iVar74 >> 0x18);
            } while (iVar26 != 0);
            bVar49 = bVar49 ^ bVar75;
            bVar50 = bVar50 ^ bVar76;
            bVar51 = bVar51 ^ bVar77;
            bVar52 = bVar52 ^ bVar78;
            bVar53 = bVar53 ^ bVar79;
            bVar54 = bVar54 ^ bVar80;
            bVar55 = bVar55 ^ bVar81;
            bVar56 = bVar56 ^ bVar82;
            bVar57 = bVar57 ^ bVar83;
            bVar58 = bVar58 ^ bVar84;
            bVar59 = bVar59 ^ bVar85;
            bVar60 = bVar60 ^ bVar86;
            bVar61 = bVar61 ^ bVar87;
            bVar62 = bVar62 ^ bVar88;
            bVar63 = bVar63 ^ bVar89;
            bVar64 = bVar64 ^ bVar90;
            uVar46 = 0;
            auVar16[1] = bVar50;
            auVar16[0] = bVar49;
            auVar16[2] = bVar51;
            auVar16[3] = bVar52;
            auVar16[4] = bVar53;
            auVar16[5] = bVar54;
            auVar16[6] = bVar55;
            auVar16[7] = bVar56;
            auVar16[8] = bVar57;
            auVar16[9] = bVar58;
            auVar16[10] = bVar59;
            auVar16[0xb] = bVar60;
            auVar16[0xc] = bVar61;
            auVar16[0xd] = bVar62;
            auVar16[0xe] = bVar63;
            auVar16[0xf] = bVar64;
            auVar17[1] = bVar50;
            auVar17[0] = bVar49;
            auVar17[2] = bVar51;
            auVar17[3] = bVar52;
            auVar17[4] = bVar53;
            auVar17[5] = bVar54;
            auVar17[6] = bVar55;
            auVar17[7] = bVar56;
            auVar17[8] = bVar57;
            auVar17[9] = bVar58;
            auVar17[10] = bVar59;
            auVar17[0xb] = bVar60;
            auVar17[0xc] = bVar61;
            auVar17[0xd] = bVar62;
            auVar17[0xe] = bVar63;
            auVar17[0xf] = bVar64;
            auVar65 = NEON_ext(auVar16,auVar17,8,1);
            uVar27 = CONCAT13(bVar52 ^ auVar65[3],
                              CONCAT12(bVar51 ^ auVar65[2],
                                       CONCAT11(bVar50 ^ auVar65[1],bVar49 ^ auVar65[0])));
            local_84 = uVar27 ^ 0xd2b4 ^
                       (uint)(CONCAT17(bVar56 ^ auVar65[7],
                                       CONCAT16(bVar55 ^ auVar65[6],
                                                CONCAT15(bVar54 ^ auVar65[5],
                                                         CONCAT14(bVar53 ^ auVar65[4],uVar27)))) >>
                             0x20);
            do {
              *(byte *)((long)pvVar32 + uVar46) =
                   (&DAT_00102968)[uVar46] ^ (byte)uVar46 ^ *(byte *)((ulong)&local_84 | uVar46 & 3)
              ;
              uVar46 = uVar46 + 1;
            } while (uVar46 != 0x80);
            lVar33 = (**(code **)(*param_1 + 0x108))(param_1,uVar31,pvVar29,pvVar32);
            uVar35 = __strlen_chk(pvVar29,0x80);
            __memset_chk(pvVar29,0,uVar35,0x80);
            free(pvVar29);
            uVar35 = __strlen_chk(pvVar32,0x80);
            __memset_chk(pvVar32,0,uVar35,0x80);
            free(pvVar32);
            if (lVar33 != 0) {
              uVar35 = (**(code **)(*param_1 + 0x110))(param_1,lVar30,lVar33);
              pvVar29 = malloc(0x80);
              bVar49 = 0;
              bVar50 = 0;
              bVar51 = 0;
              bVar52 = 0;
              bVar53 = 0;
              bVar54 = 0;
              bVar55 = 0;
              bVar56 = 0;
              bVar57 = 0;
              bVar58 = 0;
              bVar59 = 0;
              bVar60 = 0;
              bVar61 = 0;
              bVar62 = 0;
              bVar63 = 0;
              bVar64 = 0;
              iVar94 = 3;
              iVar66 = 4;
              iVar92 = 1;
              iVar93 = 2;
              uVar37 = 0;
              uVar36 = 0x52da1095;
              iVar26 = 0x318;
              do {
                iVar67 = iVar92 * 0xba2b;
                iVar68 = iVar93 * 0xba2b;
                iVar69 = iVar94 * 0xba2b;
                iVar70 = iVar66 * 0xba2b;
                iVar92 = iVar92 + 8;
                iVar93 = iVar93 + 8;
                iVar94 = iVar94 + 8;
                iVar66 = iVar66 + 8;
                iVar26 = iVar26 + -8;
                iVar71 = iVar67 + 0x2e8ac;
                iVar72 = iVar68 + 0x2e8ac;
                iVar73 = iVar69 + 0x2e8ac;
                iVar74 = iVar70 + 0x2e8ac;
                bVar75 = (byte)uVar36 ^ (byte)iVar67;
                bVar76 = (byte)((ulong)uVar36 >> 8) ^ (byte)((uint)iVar67 >> 8);
                bVar77 = (byte)((ulong)uVar36 >> 0x10) ^ (byte)((uint)iVar67 >> 0x10);
                bVar78 = (byte)((ulong)uVar36 >> 0x18) ^ (byte)((uint)iVar67 >> 0x18);
                bVar79 = (byte)((ulong)uVar36 >> 0x20) ^ (byte)iVar68;
                bVar80 = (byte)((ulong)uVar36 >> 0x28) ^ (byte)((uint)iVar68 >> 8);
                bVar81 = (byte)((ulong)uVar36 >> 0x30) ^ (byte)((uint)iVar68 >> 0x10);
                bVar82 = (byte)((ulong)uVar36 >> 0x38) ^ (byte)((uint)iVar68 >> 0x18);
                uVar36 = CONCAT17(bVar82,CONCAT16(bVar81,CONCAT15(bVar80,CONCAT14(bVar79,CONCAT13(
                                                  bVar78,CONCAT12(bVar77,CONCAT11(bVar76,bVar75)))))
                                                 ));
                bVar83 = (byte)uVar37 ^ (byte)iVar69;
                bVar84 = (byte)((ulong)uVar37 >> 8) ^ (byte)((uint)iVar69 >> 8);
                bVar85 = (byte)((ulong)uVar37 >> 0x10) ^ (byte)((uint)iVar69 >> 0x10);
                bVar86 = (byte)((ulong)uVar37 >> 0x18) ^ (byte)((uint)iVar69 >> 0x18);
                bVar87 = (byte)((ulong)uVar37 >> 0x20) ^ (byte)iVar70;
                bVar88 = (byte)((ulong)uVar37 >> 0x28) ^ (byte)((uint)iVar70 >> 8);
                bVar89 = (byte)((ulong)uVar37 >> 0x30) ^ (byte)((uint)iVar70 >> 0x10);
                bVar90 = (byte)((ulong)uVar37 >> 0x38) ^ (byte)((uint)iVar70 >> 0x18);
                uVar37 = CONCAT17(bVar90,CONCAT16(bVar89,CONCAT15(bVar88,CONCAT14(bVar87,CONCAT13(
                                                  bVar86,CONCAT12(bVar85,CONCAT11(bVar84,bVar83)))))
                                                 ));
                bVar49 = bVar49 ^ (byte)iVar71;
                bVar50 = bVar50 ^ (byte)((uint)iVar71 >> 8);
                bVar51 = bVar51 ^ (byte)((uint)iVar71 >> 0x10);
                bVar52 = bVar52 ^ (byte)((uint)iVar71 >> 0x18);
                bVar53 = bVar53 ^ (byte)iVar72;
                bVar54 = bVar54 ^ (byte)((uint)iVar72 >> 8);
                bVar55 = bVar55 ^ (byte)((uint)iVar72 >> 0x10);
                bVar56 = bVar56 ^ (byte)((uint)iVar72 >> 0x18);
                bVar57 = bVar57 ^ (byte)iVar73;
                bVar58 = bVar58 ^ (byte)((uint)iVar73 >> 8);
                bVar59 = bVar59 ^ (byte)((uint)iVar73 >> 0x10);
                bVar60 = bVar60 ^ (byte)((uint)iVar73 >> 0x18);
                bVar61 = bVar61 ^ (byte)iVar74;
                bVar62 = bVar62 ^ (byte)((uint)iVar74 >> 8);
                bVar63 = bVar63 ^ (byte)((uint)iVar74 >> 0x10);
                bVar64 = bVar64 ^ (byte)((uint)iVar74 >> 0x18);
              } while (iVar26 != 0);
              bVar49 = bVar49 ^ bVar75;
              bVar50 = bVar50 ^ bVar76;
              bVar51 = bVar51 ^ bVar77;
              bVar52 = bVar52 ^ bVar78;
              bVar53 = bVar53 ^ bVar79;
              bVar54 = bVar54 ^ bVar80;
              bVar55 = bVar55 ^ bVar81;
              bVar56 = bVar56 ^ bVar82;
              bVar57 = bVar57 ^ bVar83;
              bVar58 = bVar58 ^ bVar84;
              bVar59 = bVar59 ^ bVar85;
              bVar60 = bVar60 ^ bVar86;
              bVar61 = bVar61 ^ bVar87;
              bVar62 = bVar62 ^ bVar88;
              bVar63 = bVar63 ^ bVar89;
              bVar64 = bVar64 ^ bVar90;
              uVar46 = 0;
              auVar18[1] = bVar50;
              auVar18[0] = bVar49;
              auVar18[2] = bVar51;
              auVar18[3] = bVar52;
              auVar18[4] = bVar53;
              auVar18[5] = bVar54;
              auVar18[6] = bVar55;
              auVar18[7] = bVar56;
              auVar18[8] = bVar57;
              auVar18[9] = bVar58;
              auVar18[10] = bVar59;
              auVar18[0xb] = bVar60;
              auVar18[0xc] = bVar61;
              auVar18[0xd] = bVar62;
              auVar18[0xe] = bVar63;
              auVar18[0xf] = bVar64;
              auVar19[1] = bVar50;
              auVar19[0] = bVar49;
              auVar19[2] = bVar51;
              auVar19[3] = bVar52;
              auVar19[4] = bVar53;
              auVar19[5] = bVar54;
              auVar19[6] = bVar55;
              auVar19[7] = bVar56;
              auVar19[8] = bVar57;
              auVar19[9] = bVar58;
              auVar19[10] = bVar59;
              auVar19[0xb] = bVar60;
              auVar19[0xc] = bVar61;
              auVar19[0xd] = bVar62;
              auVar19[0xe] = bVar63;
              auVar19[0xf] = bVar64;
              auVar65 = NEON_ext(auVar18,auVar19,8,1);
              uVar27 = CONCAT13(bVar52 ^ auVar65[3],
                                CONCAT12(bVar51 ^ auVar65[2],
                                         CONCAT11(bVar50 ^ auVar65[1],bVar49 ^ auVar65[0])));
              local_84 = uVar27 ^ 0x240af33 ^
                         (uint)(CONCAT17(bVar56 ^ auVar65[7],
                                         CONCAT16(bVar55 ^ auVar65[6],
                                                  CONCAT15(bVar54 ^ auVar65[5],
                                                           CONCAT14(bVar53 ^ auVar65[4],uVar27))))
                               >> 0x20);
              do {
                *(byte *)((long)pvVar29 + uVar46) =
                     (&DAT_001029e8)[uVar46] ^ (byte)uVar46 ^
                     *(byte *)((ulong)&local_84 | uVar46 & 3);
                uVar46 = uVar46 + 1;
              } while (uVar46 != 0x80);
              pvVar32 = malloc(0x80);
              bVar49 = 0;
              bVar50 = 0;
              bVar51 = 0;
              bVar52 = 0;
              bVar53 = 0;
              bVar54 = 0;
              bVar55 = 0;
              bVar56 = 0;
              bVar57 = 0;
              bVar58 = 0;
              bVar59 = 0;
              bVar60 = 0;
              bVar61 = 0;
              bVar62 = 0;
              bVar63 = 0;
              bVar64 = 0;
              iVar94 = 3;
              iVar66 = 4;
              iVar92 = 1;
              iVar93 = 2;
              uVar37 = 0;
              uVar36 = 0x5b1be76;
              iVar26 = 0x3c8;
              do {
                iVar67 = iVar92 * 0x1d0179;
                iVar68 = iVar93 * 0x1d0179;
                iVar69 = iVar94 * 0x1d0179;
                iVar70 = iVar66 * 0x1d0179;
                iVar92 = iVar92 + 8;
                iVar93 = iVar93 + 8;
                iVar94 = iVar94 + 8;
                iVar66 = iVar66 + 8;
                iVar26 = iVar26 + -8;
                iVar71 = iVar67 + 0x7405e4;
                iVar72 = iVar68 + 0x7405e4;
                iVar73 = iVar69 + 0x7405e4;
                iVar74 = iVar70 + 0x7405e4;
                bVar75 = (byte)uVar36 ^ (byte)iVar67;
                bVar76 = (byte)((ulong)uVar36 >> 8) ^ (byte)((uint)iVar67 >> 8);
                bVar77 = (byte)((ulong)uVar36 >> 0x10) ^ (byte)((uint)iVar67 >> 0x10);
                bVar78 = (byte)((ulong)uVar36 >> 0x18) ^ (byte)((uint)iVar67 >> 0x18);
                bVar79 = (byte)((ulong)uVar36 >> 0x20) ^ (byte)iVar68;
                bVar80 = (byte)((ulong)uVar36 >> 0x28) ^ (byte)((uint)iVar68 >> 8);
                bVar81 = (byte)((ulong)uVar36 >> 0x30) ^ (byte)((uint)iVar68 >> 0x10);
                bVar82 = (byte)((ulong)uVar36 >> 0x38) ^ (byte)((uint)iVar68 >> 0x18);
                uVar36 = CONCAT17(bVar82,CONCAT16(bVar81,CONCAT15(bVar80,CONCAT14(bVar79,CONCAT13(
                                                  bVar78,CONCAT12(bVar77,CONCAT11(bVar76,bVar75)))))
                                                 ));
                bVar83 = (byte)uVar37 ^ (byte)iVar69;
                bVar84 = (byte)((ulong)uVar37 >> 8) ^ (byte)((uint)iVar69 >> 8);
                bVar85 = (byte)((ulong)uVar37 >> 0x10) ^ (byte)((uint)iVar69 >> 0x10);
                bVar86 = (byte)((ulong)uVar37 >> 0x18) ^ (byte)((uint)iVar69 >> 0x18);
                bVar87 = (byte)((ulong)uVar37 >> 0x20) ^ (byte)iVar70;
                bVar88 = (byte)((ulong)uVar37 >> 0x28) ^ (byte)((uint)iVar70 >> 8);
                bVar89 = (byte)((ulong)uVar37 >> 0x30) ^ (byte)((uint)iVar70 >> 0x10);
                bVar90 = (byte)((ulong)uVar37 >> 0x38) ^ (byte)((uint)iVar70 >> 0x18);
                uVar37 = CONCAT17(bVar90,CONCAT16(bVar89,CONCAT15(bVar88,CONCAT14(bVar87,CONCAT13(
                                                  bVar86,CONCAT12(bVar85,CONCAT11(bVar84,bVar83)))))
                                                 ));
                bVar49 = bVar49 ^ (byte)iVar71;
                bVar50 = bVar50 ^ (byte)((uint)iVar71 >> 8);
                bVar51 = bVar51 ^ (byte)((uint)iVar71 >> 0x10);
                bVar52 = bVar52 ^ (byte)((uint)iVar71 >> 0x18);
                bVar53 = bVar53 ^ (byte)iVar72;
                bVar54 = bVar54 ^ (byte)((uint)iVar72 >> 8);
                bVar55 = bVar55 ^ (byte)((uint)iVar72 >> 0x10);
                bVar56 = bVar56 ^ (byte)((uint)iVar72 >> 0x18);
                bVar57 = bVar57 ^ (byte)iVar73;
                bVar58 = bVar58 ^ (byte)((uint)iVar73 >> 8);
                bVar59 = bVar59 ^ (byte)((uint)iVar73 >> 0x10);
                bVar60 = bVar60 ^ (byte)((uint)iVar73 >> 0x18);
                bVar61 = bVar61 ^ (byte)iVar74;
                bVar62 = bVar62 ^ (byte)((uint)iVar74 >> 8);
                bVar63 = bVar63 ^ (byte)((uint)iVar74 >> 0x10);
                bVar64 = bVar64 ^ (byte)((uint)iVar74 >> 0x18);
              } while (iVar26 != 0);
              bVar49 = bVar49 ^ bVar75;
              bVar50 = bVar50 ^ bVar76;
              bVar51 = bVar51 ^ bVar77;
              bVar52 = bVar52 ^ bVar78;
              bVar53 = bVar53 ^ bVar79;
              bVar54 = bVar54 ^ bVar80;
              bVar55 = bVar55 ^ bVar81;
              bVar56 = bVar56 ^ bVar82;
              bVar57 = bVar57 ^ bVar83;
              bVar58 = bVar58 ^ bVar84;
              bVar59 = bVar59 ^ bVar85;
              bVar60 = bVar60 ^ bVar86;
              bVar61 = bVar61 ^ bVar87;
              bVar62 = bVar62 ^ bVar88;
              bVar63 = bVar63 ^ bVar89;
              bVar64 = bVar64 ^ bVar90;
              uVar46 = 0;
              auVar20[1] = bVar50;
              auVar20[0] = bVar49;
              auVar20[2] = bVar51;
              auVar20[3] = bVar52;
              auVar20[4] = bVar53;
              auVar20[5] = bVar54;
              auVar20[6] = bVar55;
              auVar20[7] = bVar56;
              auVar20[8] = bVar57;
              auVar20[9] = bVar58;
              auVar20[10] = bVar59;
              auVar20[0xb] = bVar60;
              auVar20[0xc] = bVar61;
              auVar20[0xd] = bVar62;
              auVar20[0xe] = bVar63;
              auVar20[0xf] = bVar64;
              auVar21[1] = bVar50;
              auVar21[0] = bVar49;
              auVar21[2] = bVar51;
              auVar21[3] = bVar52;
              auVar21[4] = bVar53;
              auVar21[5] = bVar54;
              auVar21[6] = bVar55;
              auVar21[7] = bVar56;
              auVar21[8] = bVar57;
              auVar21[9] = bVar58;
              auVar21[10] = bVar59;
              auVar21[0xb] = bVar60;
              auVar21[0xc] = bVar61;
              auVar21[0xd] = bVar62;
              auVar21[0xe] = bVar63;
              auVar21[0xf] = bVar64;
              auVar65 = NEON_ext(auVar20,auVar21,8,1);
              uVar27 = CONCAT13(bVar52 ^ auVar65[3],
                                CONCAT12(bVar51 ^ auVar65[2],
                                         CONCAT11(bVar50 ^ auVar65[1],bVar49 ^ auVar65[0])));
              local_84 = uVar27 ^ 0x805e4 ^
                         (uint)(CONCAT17(bVar56 ^ auVar65[7],
                                         CONCAT16(bVar55 ^ auVar65[6],
                                                  CONCAT15(bVar54 ^ auVar65[5],
                                                           CONCAT14(bVar53 ^ auVar65[4],uVar27))))
                               >> 0x20);
              do {
                *(byte *)((long)pvVar32 + uVar46) =
                     (&DAT_00102a68)[uVar46] ^ (byte)uVar46 ^
                     *(byte *)((ulong)&local_84 | uVar46 & 3);
                uVar46 = uVar46 + 1;
              } while (uVar46 != 0x80);
              lVar33 = (**(code **)(*param_1 + 0x108))(param_1,uVar31,pvVar29,pvVar32);
              uVar31 = __strlen_chk(pvVar29,0x80);
              __memset_chk(pvVar29,0,uVar31,0x80);
              free(pvVar29);
              uVar31 = __strlen_chk(pvVar32,0x80);
              __memset_chk(pvVar32,0,uVar31,0x80);
              free(pvVar32);
              if (lVar33 != 0) {
                uVar31 = (**(code **)(*param_1 + 0x110))(param_1,lVar30,lVar33);
                pvVar29 = malloc(0x80);
                bVar49 = 0;
                bVar50 = 0;
                bVar51 = 0;
                bVar52 = 0;
                bVar53 = 0;
                bVar54 = 0;
                bVar55 = 0;
                bVar56 = 0;
                bVar57 = 0;
                bVar58 = 0;
                bVar59 = 0;
                bVar60 = 0;
                bVar61 = 0;
                bVar62 = 0;
                bVar63 = 0;
                bVar64 = 0;
                iVar94 = 3;
                iVar66 = 4;
                iVar92 = 1;
                iVar93 = 2;
                uVar37 = 0;
                uVar36 = 0x4b574e87;
                iVar26 = 0x2f8;
                do {
                  iVar67 = iVar92 * 0x619f9;
                  iVar68 = iVar93 * 0x619f9;
                  iVar69 = iVar94 * 0x619f9;
                  iVar70 = iVar66 * 0x619f9;
                  iVar92 = iVar92 + 8;
                  iVar93 = iVar93 + 8;
                  iVar94 = iVar94 + 8;
                  iVar66 = iVar66 + 8;
                  iVar26 = iVar26 + -8;
                  iVar71 = iVar67 + 0x1867e4;
                  iVar72 = iVar68 + 0x1867e4;
                  iVar73 = iVar69 + 0x1867e4;
                  iVar74 = iVar70 + 0x1867e4;
                  bVar75 = (byte)uVar36 ^ (byte)iVar67;
                  bVar76 = (byte)((ulong)uVar36 >> 8) ^ (byte)((uint)iVar67 >> 8);
                  bVar77 = (byte)((ulong)uVar36 >> 0x10) ^ (byte)((uint)iVar67 >> 0x10);
                  bVar78 = (byte)((ulong)uVar36 >> 0x18) ^ (byte)((uint)iVar67 >> 0x18);
                  bVar79 = (byte)((ulong)uVar36 >> 0x20) ^ (byte)iVar68;
                  bVar80 = (byte)((ulong)uVar36 >> 0x28) ^ (byte)((uint)iVar68 >> 8);
                  bVar81 = (byte)((ulong)uVar36 >> 0x30) ^ (byte)((uint)iVar68 >> 0x10);
                  bVar82 = (byte)((ulong)uVar36 >> 0x38) ^ (byte)((uint)iVar68 >> 0x18);
                  uVar36 = CONCAT17(bVar82,CONCAT16(bVar81,CONCAT15(bVar80,CONCAT14(bVar79,CONCAT13(
                                                  bVar78,CONCAT12(bVar77,CONCAT11(bVar76,bVar75)))))
                                                  ));
                  bVar83 = (byte)uVar37 ^ (byte)iVar69;
                  bVar84 = (byte)((ulong)uVar37 >> 8) ^ (byte)((uint)iVar69 >> 8);
                  bVar85 = (byte)((ulong)uVar37 >> 0x10) ^ (byte)((uint)iVar69 >> 0x10);
                  bVar86 = (byte)((ulong)uVar37 >> 0x18) ^ (byte)((uint)iVar69 >> 0x18);
                  bVar87 = (byte)((ulong)uVar37 >> 0x20) ^ (byte)iVar70;
                  bVar88 = (byte)((ulong)uVar37 >> 0x28) ^ (byte)((uint)iVar70 >> 8);
                  bVar89 = (byte)((ulong)uVar37 >> 0x30) ^ (byte)((uint)iVar70 >> 0x10);
                  bVar90 = (byte)((ulong)uVar37 >> 0x38) ^ (byte)((uint)iVar70 >> 0x18);
                  uVar37 = CONCAT17(bVar90,CONCAT16(bVar89,CONCAT15(bVar88,CONCAT14(bVar87,CONCAT13(
                                                  bVar86,CONCAT12(bVar85,CONCAT11(bVar84,bVar83)))))
                                                  ));
                  bVar49 = bVar49 ^ (byte)iVar71;
                  bVar50 = bVar50 ^ (byte)((uint)iVar71 >> 8);
                  bVar51 = bVar51 ^ (byte)((uint)iVar71 >> 0x10);
                  bVar52 = bVar52 ^ (byte)((uint)iVar71 >> 0x18);
                  bVar53 = bVar53 ^ (byte)iVar72;
                  bVar54 = bVar54 ^ (byte)((uint)iVar72 >> 8);
                  bVar55 = bVar55 ^ (byte)((uint)iVar72 >> 0x10);
                  bVar56 = bVar56 ^ (byte)((uint)iVar72 >> 0x18);
                  bVar57 = bVar57 ^ (byte)iVar73;
                  bVar58 = bVar58 ^ (byte)((uint)iVar73 >> 8);
                  bVar59 = bVar59 ^ (byte)((uint)iVar73 >> 0x10);
                  bVar60 = bVar60 ^ (byte)((uint)iVar73 >> 0x18);
                  bVar61 = bVar61 ^ (byte)iVar74;
                  bVar62 = bVar62 ^ (byte)((uint)iVar74 >> 8);
                  bVar63 = bVar63 ^ (byte)((uint)iVar74 >> 0x10);
                  bVar64 = bVar64 ^ (byte)((uint)iVar74 >> 0x18);
                } while (iVar26 != 0);
                bVar49 = bVar49 ^ bVar75;
                bVar50 = bVar50 ^ bVar76;
                bVar51 = bVar51 ^ bVar77;
                bVar52 = bVar52 ^ bVar78;
                bVar53 = bVar53 ^ bVar79;
                bVar54 = bVar54 ^ bVar80;
                bVar55 = bVar55 ^ bVar81;
                bVar56 = bVar56 ^ bVar82;
                bVar57 = bVar57 ^ bVar83;
                bVar58 = bVar58 ^ bVar84;
                bVar59 = bVar59 ^ bVar85;
                bVar60 = bVar60 ^ bVar86;
                bVar61 = bVar61 ^ bVar87;
                bVar62 = bVar62 ^ bVar88;
                bVar63 = bVar63 ^ bVar89;
                bVar64 = bVar64 ^ bVar90;
                uVar46 = 0;
                auVar22[1] = bVar50;
                auVar22[0] = bVar49;
                auVar22[2] = bVar51;
                auVar22[3] = bVar52;
                auVar22[4] = bVar53;
                auVar22[5] = bVar54;
                auVar22[6] = bVar55;
                auVar22[7] = bVar56;
                auVar22[8] = bVar57;
                auVar22[9] = bVar58;
                auVar22[10] = bVar59;
                auVar22[0xb] = bVar60;
                auVar22[0xc] = bVar61;
                auVar22[0xd] = bVar62;
                auVar22[0xe] = bVar63;
                auVar22[0xf] = bVar64;
                auVar23[1] = bVar50;
                auVar23[0] = bVar49;
                auVar23[2] = bVar51;
                auVar23[3] = bVar52;
                auVar23[4] = bVar53;
                auVar23[5] = bVar54;
                auVar23[6] = bVar55;
                auVar23[7] = bVar56;
                auVar23[8] = bVar57;
                auVar23[9] = bVar58;
                auVar23[10] = bVar59;
                auVar23[0xb] = bVar60;
                auVar23[0xc] = bVar61;
                auVar23[0xd] = bVar62;
                auVar23[0xe] = bVar63;
                auVar23[0xf] = bVar64;
                auVar65 = NEON_ext(auVar22,auVar23,8,1);
                uVar27 = CONCAT13(bVar52 ^ auVar65[3],
                                  CONCAT12(bVar51 ^ auVar65[2],
                                           CONCAT11(bVar50 ^ auVar65[1],bVar49 ^ auVar65[0])));
                local_84 = uVar27 ^ 0xa7a1b ^
                           (uint)(CONCAT17(bVar56 ^ auVar65[7],
                                           CONCAT16(bVar55 ^ auVar65[6],
                                                    CONCAT15(bVar54 ^ auVar65[5],
                                                             CONCAT14(bVar53 ^ auVar65[4],uVar27))))
                                 >> 0x20);
                do {
                  *(byte *)((long)pvVar29 + uVar46) =
                       (&DAT_00102ae8)[uVar46] ^ (byte)uVar46 ^
                       *(byte *)((ulong)&local_84 | uVar46 & 3);
                  uVar46 = uVar46 + 1;
                } while (uVar46 != 0x80);
                pvVar32 = malloc(0x80);
                bVar49 = 0;
                bVar50 = 0;
                bVar51 = 0;
                bVar52 = 0;
                bVar53 = 0;
                bVar54 = 0;
                bVar55 = 0;
                bVar56 = 0;
                bVar57 = 0;
                bVar58 = 0;
                bVar59 = 0;
                bVar60 = 0;
                bVar61 = 0;
                bVar62 = 0;
                bVar63 = 0;
                bVar64 = 0;
                iVar94 = 3;
                iVar66 = 4;
                iVar92 = 1;
                iVar93 = 2;
                uVar37 = 0;
                uVar36 = 0x3f51a418;
                iVar26 = 0x268;
                do {
                  iVar67 = iVar92 * 0x706e;
                  iVar68 = iVar93 * 0x706e;
                  iVar69 = iVar94 * 0x706e;
                  iVar70 = iVar66 * 0x706e;
                  iVar92 = iVar92 + 8;
                  iVar93 = iVar93 + 8;
                  iVar94 = iVar94 + 8;
                  iVar66 = iVar66 + 8;
                  iVar26 = iVar26 + -8;
                  iVar71 = iVar67 + 0x1c1b8;
                  iVar72 = iVar68 + 0x1c1b8;
                  iVar73 = iVar69 + 0x1c1b8;
                  iVar74 = iVar70 + 0x1c1b8;
                  bVar75 = (byte)uVar36 ^ (byte)iVar67;
                  bVar76 = (byte)((ulong)uVar36 >> 8) ^ (byte)((uint)iVar67 >> 8);
                  bVar77 = (byte)((ulong)uVar36 >> 0x10) ^ (byte)((uint)iVar67 >> 0x10);
                  bVar78 = (byte)((ulong)uVar36 >> 0x18) ^ (byte)((uint)iVar67 >> 0x18);
                  bVar79 = (byte)((ulong)uVar36 >> 0x20) ^ (byte)iVar68;
                  bVar80 = (byte)((ulong)uVar36 >> 0x28) ^ (byte)((uint)iVar68 >> 8);
                  bVar81 = (byte)((ulong)uVar36 >> 0x30) ^ (byte)((uint)iVar68 >> 0x10);
                  bVar82 = (byte)((ulong)uVar36 >> 0x38) ^ (byte)((uint)iVar68 >> 0x18);
                  uVar36 = CONCAT17(bVar82,CONCAT16(bVar81,CONCAT15(bVar80,CONCAT14(bVar79,CONCAT13(
                                                  bVar78,CONCAT12(bVar77,CONCAT11(bVar76,bVar75)))))
                                                  ));
                  bVar83 = (byte)uVar37 ^ (byte)iVar69;
                  bVar84 = (byte)((ulong)uVar37 >> 8) ^ (byte)((uint)iVar69 >> 8);
                  bVar85 = (byte)((ulong)uVar37 >> 0x10) ^ (byte)((uint)iVar69 >> 0x10);
                  bVar86 = (byte)((ulong)uVar37 >> 0x18) ^ (byte)((uint)iVar69 >> 0x18);
                  bVar87 = (byte)((ulong)uVar37 >> 0x20) ^ (byte)iVar70;
                  bVar88 = (byte)((ulong)uVar37 >> 0x28) ^ (byte)((uint)iVar70 >> 8);
                  bVar89 = (byte)((ulong)uVar37 >> 0x30) ^ (byte)((uint)iVar70 >> 0x10);
                  bVar90 = (byte)((ulong)uVar37 >> 0x38) ^ (byte)((uint)iVar70 >> 0x18);
                  uVar37 = CONCAT17(bVar90,CONCAT16(bVar89,CONCAT15(bVar88,CONCAT14(bVar87,CONCAT13(
                                                  bVar86,CONCAT12(bVar85,CONCAT11(bVar84,bVar83)))))
                                                  ));
                  bVar49 = bVar49 ^ (byte)iVar71;
                  bVar50 = bVar50 ^ (byte)((uint)iVar71 >> 8);
                  bVar51 = bVar51 ^ (byte)((uint)iVar71 >> 0x10);
                  bVar52 = bVar52 ^ (byte)((uint)iVar71 >> 0x18);
                  bVar53 = bVar53 ^ (byte)iVar72;
                  bVar54 = bVar54 ^ (byte)((uint)iVar72 >> 8);
                  bVar55 = bVar55 ^ (byte)((uint)iVar72 >> 0x10);
                  bVar56 = bVar56 ^ (byte)((uint)iVar72 >> 0x18);
                  bVar57 = bVar57 ^ (byte)iVar73;
                  bVar58 = bVar58 ^ (byte)((uint)iVar73 >> 8);
                  bVar59 = bVar59 ^ (byte)((uint)iVar73 >> 0x10);
                  bVar60 = bVar60 ^ (byte)((uint)iVar73 >> 0x18);
                  bVar61 = bVar61 ^ (byte)iVar74;
                  bVar62 = bVar62 ^ (byte)((uint)iVar74 >> 8);
                  bVar63 = bVar63 ^ (byte)((uint)iVar74 >> 0x10);
                  bVar64 = bVar64 ^ (byte)((uint)iVar74 >> 0x18);
                } while (iVar26 != 0);
                bVar49 = bVar49 ^ bVar75;
                bVar50 = bVar50 ^ bVar76;
                bVar51 = bVar51 ^ bVar77;
                bVar52 = bVar52 ^ bVar78;
                bVar53 = bVar53 ^ bVar79;
                bVar54 = bVar54 ^ bVar80;
                bVar55 = bVar55 ^ bVar81;
                bVar56 = bVar56 ^ bVar82;
                bVar57 = bVar57 ^ bVar83;
                bVar58 = bVar58 ^ bVar84;
                bVar59 = bVar59 ^ bVar85;
                bVar60 = bVar60 ^ bVar86;
                bVar61 = bVar61 ^ bVar87;
                bVar62 = bVar62 ^ bVar88;
                bVar63 = bVar63 ^ bVar89;
                bVar64 = bVar64 ^ bVar90;
                uVar46 = 0;
                auVar24[1] = bVar50;
                auVar24[0] = bVar49;
                auVar24[2] = bVar51;
                auVar24[3] = bVar52;
                auVar24[4] = bVar53;
                auVar24[5] = bVar54;
                auVar24[6] = bVar55;
                auVar24[7] = bVar56;
                auVar24[8] = bVar57;
                auVar24[9] = bVar58;
                auVar24[10] = bVar59;
                auVar24[0xb] = bVar60;
                auVar24[0xc] = bVar61;
                auVar24[0xd] = bVar62;
                auVar24[0xe] = bVar63;
                auVar24[0xf] = bVar64;
                auVar25[1] = bVar50;
                auVar25[0] = bVar49;
                auVar25[2] = bVar51;
                auVar25[3] = bVar52;
                auVar25[4] = bVar53;
                auVar25[5] = bVar54;
                auVar25[6] = bVar55;
                auVar25[7] = bVar56;
                auVar25[8] = bVar57;
                auVar25[9] = bVar58;
                auVar25[10] = bVar59;
                auVar25[0xb] = bVar60;
                auVar25[0xc] = bVar61;
                auVar25[0xd] = bVar62;
                auVar25[0xe] = bVar63;
                auVar25[0xf] = bVar64;
                auVar65 = NEON_ext(auVar24,auVar25,8,1);
                local_84 = CONCAT13(bVar52 ^ auVar65[3],
                                    CONCAT12(bVar51 ^ auVar65[2],
                                             CONCAT11(bVar50 ^ auVar65[1],bVar49 ^ auVar65[0])));
                local_84 = local_84 ^
                           (uint)(CONCAT17(bVar56 ^ auVar65[7],
                                           CONCAT16(bVar55 ^ auVar65[6],
                                                    CONCAT15(bVar54 ^ auVar65[5],
                                                             CONCAT14(bVar53 ^ auVar65[4],local_84))
                                                   )) >> 0x20);
                do {
                  *(byte *)((long)pvVar32 + uVar46) =
                       (&DAT_00102b68)[uVar46] ^ (byte)uVar46 ^
                       *(byte *)((ulong)&local_84 | uVar46 & 3);
                  uVar46 = uVar46 + 1;
                } while (uVar46 != 0x80);
                pcVar48 = *(code **)(*param_1 + 0x108);
                uVar36 = (**(code **)(*param_1 + 0xf8))(param_1,uVar35);
                lVar30 = (*pcVar48)(param_1,uVar36,pvVar29,pvVar32);
                uVar36 = __strlen_chk(pvVar29,0x80);
                __memset_chk(pvVar29,0,uVar36,0x80);
                free(pvVar29);
                uVar36 = __strlen_chk(pvVar32,0x80);
                __memset_chk(pvVar32,0,uVar36,0x80);
                free(pvVar32);
                if (lVar30 != 0) {
                  uVar36 = FUN_001086a4();
                  uVar37 = FUN_001087a4();
                  uVar38 = FUN_001088a0();
                  uVar39 = FUN_001089a0();
                  uVar40 = FUN_00108aa0();
                  uVar41 = FUN_00108ba0();
                  if (iVar91 < 0x1c) {
                    uVar31 = (**(code **)(*param_1 + 0x110))(param_1,uVar35,lVar30,uVar31,0x40);
                    uVar35 = FUN_00108aa0();
                    uVar42 = FUN_00108ba0();
                    pcVar48 = *(code **)(*param_1 + 0x2f0);
                    uVar43 = (**(code **)(*param_1 + 0xf8))(param_1,uVar31);
                    lVar30 = (*pcVar48)(param_1,uVar43,uVar35,uVar42);
                    FUN_00108670(uVar35);
                    FUN_00108670(uVar42);
                    pcVar48 = *(code **)(*param_1 + 0x2f8);
                  }
                  else {
                    uVar31 = (**(code **)(*param_1 + 0x110))();
                    uVar35 = FUN_001086a4();
                    uVar42 = FUN_001087a4();
                    pcVar48 = *(code **)(*param_1 + 0x2f0);
                    uVar43 = (**(code **)(*param_1 + 0xf8))(param_1,uVar31);
                    uVar43 = (*pcVar48)(param_1,uVar43,uVar35,uVar42);
                    FUN_00108670(uVar35);
                    FUN_00108670(uVar42);
                    uVar31 = (**(code **)(*param_1 + 0x2f8))(param_1,uVar31,uVar43);
                    uVar35 = FUN_001088a0();
                    uVar42 = FUN_001089a0();
                    pcVar48 = *(code **)(*param_1 + 0x108);
                    uVar43 = (**(code **)(*param_1 + 0xf8))(param_1,uVar31);
                    lVar30 = (*pcVar48)(param_1,uVar43,uVar35,uVar42);
                    FUN_00108670(uVar35);
                    FUN_00108670(uVar42);
                    if (lVar30 == 0) goto LAB_00108630;
                    pcVar48 = *(code **)(*param_1 + 0x110);
                  }
                  lVar30 = (*pcVar48)(param_1,uVar31,lVar30);
                  FUN_00108670(uVar36);
                  FUN_00108670(uVar37);
                  FUN_00108670(uVar38);
                  FUN_00108670(uVar39);
                  FUN_00108670(uVar40);
                  FUN_00108670(uVar41);
                  if (lVar30 != 0) {
                    pcVar48 = *(code **)(*param_1 + 0x568);
                    iVar26 = (**(code **)(*param_1 + 0x558))(param_1,lVar30);
                    uVar31 = (*pcVar48)(param_1,lVar30,iVar26 + -1);
                    uVar35 = FUN_00108ca0();
                    uVar36 = FUN_00108da0();
                    pcVar48 = *(code **)(*param_1 + 0x108);
                    uVar37 = (**(code **)(*param_1 + 0xf8))(param_1,uVar31);
                    uVar37 = (*pcVar48)(param_1,uVar37,uVar35,uVar36);
                    FUN_00108670(uVar35);
                    FUN_00108670(uVar36);
                    lVar30 = (**(code **)(*param_1 + 0x110))(param_1,uVar31,uVar37);
                    if (lVar30 != 0) {
                      uVar31 = FUN_00108ea0();
                      lVar33 = (**(code **)(*param_1 + 0x30))(param_1,uVar31);
                      FUN_00108670(uVar31);
                      if (lVar33 != 0) {
                        uVar31 = FUN_00108fa0();
                        uVar35 = FUN_001090a0();
                        lVar34 = (**(code **)(*param_1 + 0x388))(param_1,lVar33,uVar31,uVar35);
                        FUN_00108670(uVar31);
                        FUN_00108670(uVar35);
                        if (lVar34 != 0) {
                          uVar31 = FUN_001091a0();
                          uVar35 = (**(code **)(*param_1 + 0x538))(param_1,uVar31);
                          FUN_00108670(uVar31);
                          lVar33 = (**(code **)(*param_1 + 0x390))(param_1,lVar33,lVar34,uVar35);
                          if (lVar33 != 0) {
                            uVar31 = FUN_00109294();
                            uVar35 = FUN_00109388();
                            pcVar48 = *(code **)(*param_1 + 0x108);
                            uVar36 = (**(code **)(*param_1 + 0xf8))(param_1,lVar33);
                            lVar34 = (*pcVar48)(param_1,uVar36,uVar31,uVar35);
                            FUN_00108670(uVar31);
                            FUN_00108670(uVar35);
                            if ((lVar34 != 0) &&
                               (lVar30 = (**(code **)(*param_1 + 0x110))
                                                   (param_1,lVar33,lVar34,lVar30), lVar30 != 0)) {
                              uVar27 = (**(code **)(*param_1 + 0x558))(param_1,lVar30);
                              pbVar44 = (byte *)(**(code **)(*param_1 + 0x6f0))(param_1,lVar30,0);
                              if (pbVar44 != (byte *)0x0) {
                                __s2 = (char *)malloc((long)(int)(uVar27 * 3));
                                uStack_78 = 0x4645444342413938;
                                local_80 = 0x3736353433323130;
                                if (0 < (int)uVar27) {
                                  cVar1 = *(char *)((ulong)&local_80 | (ulong)*pbVar44 & 0xf);
                                  *__s2 = *(char *)((ulong)&local_80 | (ulong)(*pbVar44 >> 4));
                                  __s2[1] = cVar1;
                                  if (uVar27 != 1) {
                                    lVar33 = (ulong)uVar27 - 1;
                                    pcVar45 = __s2 + 4;
                                    pbVar47 = pbVar44;
                                    do {
                                      pbVar47 = pbVar47 + 1;
                                      bVar49 = *pbVar47;
                                      lVar33 = lVar33 + -1;
                                      pcVar45[-2] = ':';
                                      cVar1 = *(char *)((ulong)&local_80 | (ulong)bVar49 & 0xf);
                                      pcVar45[-1] = *(char *)((ulong)&local_80 |
                                                             (ulong)(bVar49 >> 4));
                                      *pcVar45 = cVar1;
                                      pcVar45 = pcVar45 + 3;
                                    } while (lVar33 != 0);
                                  }
                                }
                                pcVar48 = *(code **)(*param_1 + 0x6f8);
                                __s2[(long)(int)(uVar27 * 3) - 1] = '\0';
                                (*pcVar48)(param_1,lVar30,pbVar44,0);
                                pcVar45 = (char *)FUN_00109488();
                                iVar26 = strcmp(pcVar45,__s2);
                                FUN_00108670(pcVar45);
                                free(__s2);
                                if (iVar26 == 0) {
                                  uVar31 = 1;
                                  goto LAB_00108634;
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
LAB_00108630:
  uVar31 = 0;
LAB_00108634:
  if (*(long *)(lVar2 + 0x28) == local_68) {
    return;
  }
                    /* WARNING: Subroutine does not return */
  __stack_chk_fail(uVar31);
}

The Patching Goal

Because obfs_check1_start and obfs_check1_finish work together to measure execution time, traditional step-by-step debugging is almost guaranteed to trigger the kill-switch.

From a bypass perspective, however, we don’t need to worry about the clock.

We just need to ensure the code always takes the else path.

In assembly, our objective is to find the conditional branch instruction that evaluates iVar1 and force it to always point to the “Golden Return” of 0x10006.

Executing the patch

To do so, we’ll have to examine the assembly instructions rather than just the decompiled code. Don’t worry, it’s a short function.



                             **************************************************************
                             *                          FUNCTION                          *
                             **************************************************************
                             undefined __cdecl JNI_OnLoad(undefined8 JavaVM)
             undefined         <UNASSIGNED>   <RETURN>
             undefined8        x0:8           JavaVM                                  XREF[2]:     00103e14(W), 
                                                                                                   00103e20(W)  
             undefined8        x0:8           JNI_VERSION                             XREF[2]:     00103e14(W), 
                                                                                                   00103e20(W)  
             undefined4        w0:4           antiTamperCheck?                        XREF[1]:     00103e20(W)  
             undefined8        Stack[-0x10]:8 local_10                                XREF[2]:     00103e00(W), 
                                                                                                   00103e3c(R)  
             undefined8        Stack[-0x20]:8 local_20                                XREF[2]:     00103dfc(W), 
                                                                                                   00103e40(*)  
                             JNI_OnLoad                                      XREF[3]:     Entry Point(*), 001033a4, 
                                                                                          001035a8(*)  
        00103dfc fd 7b be a9     stp        x29,x30,[sp, #local_20]!
        00103e00 f3 0b 00 f9     str        x19,[sp, #local_10]
        00103e04 fd 03 00 91     mov        x29,sp
        00103e08 f3 03 00 aa     mov        x19,JavaVM
        00103e0c f5 15 00 94     bl         obfs_check1_start                                undefined obfs_check1_start()
        00103e10 e0 03 13 aa     mov        JavaVM,x19
        00103e14 f7 15 00 94     bl         <EXTERNAL>::loadJniUtil                          undefined loadJniUtil()
        00103e18 20 01 f8 37     tbnz       JNI_VERSION,#0x1f,LAB_00103e3c
        00103e1c f9 15 00 94     bl         <EXTERNAL>::getEnv                               undefined getEnv()
        00103e20 fc 15 00 94     bl         obfs_check1_finish                               undefined obfs_check1_finish()
        00103e24 80 00 00 34     cbz        antiTamperCheck?,LAB_00103e34
        00103e28 c0 00 80 52     mov        antiTamperCheck?,#0x6
        00103e2c 20 00 a0 72     movk       antiTamperCheck?,#0x1, LSL #16
        00103e30 03 00 00 14     b          LAB_00103e3c
                             LAB_00103e34                                    XREF[1]:     00103e24(j)  
        00103e34 fb 15 00 94     bl         <EXTERNAL>::clearJni                             undefined clearJni()
        00103e38 00 00 80 12     mov        antiTamperCheck?,#0xffffffff
                             LAB_00103e3c                                    XREF[2]:     00103e18(j), 00103e30(j)  
        00103e3c f3 0b 40 f9     ldr        x19,[sp, #local_10]
        00103e40 fd 7b c2 a8     ldp        x29=>local_20,x30,[sp], #0x20
        00103e44 c0 03 5f d6     ret
                             **************************************************************
                             *                       THUNK FUNCTION                       *
                             **************************************************************
                             thunk undefined JNI_OnUnload()
                               Thunked-Function: <EXTERNAL>::clearJni
             undefined         <UNASSIGNED>   <RETURN>
                             JNI_OnUnload                                    XREF[3]:     Entry Point(*), 001033ac, 
                                                                                          001035d0(*)  
        00103e48 f6 15 00 14     b          <EXTERNAL>::clearJni

We’ll modify addresses 0x00103e0c (bl obfs_check1_start), 0x00103e20 (bl obfs_check1_finish) and, 0x00103e24 (cbz antiTamperCheck?,LAB_00103e34).

We can do so in Ghidra by right-clicking on the address and selecting patch instruction

Patching instructions in Ghidra

Let’s take the easiest route to see if it works. We will replace the addresses above with NOP (No Operation) opcodes and see what happens.

Doing so, we get the following:

                             **************************************************************
                             *                          FUNCTION                          *
                             **************************************************************
                             undefined __cdecl JNI_OnLoad(undefined8 JavaVM)
             undefined         <UNASSIGNED>   <RETURN>
             undefined8        x0:8           JavaVM                                  XREF[1]:     00103e14(W)  
             undefined8        x0:8           JNI_VERSION                             XREF[1]:     00103e14(W)  
             undefined4        w0:4           antiTamperCheck?
             undefined8        Stack[-0x10]:8 local_10                                XREF[2]:     00103e00(W), 
                                                                                                   00103e3c(R)  
             undefined8        Stack[-0x20]:8 local_20                                XREF[2]:     00103dfc(W), 
                                                                                                   00103e40(*)  
                             JNI_OnLoad                                      XREF[3]:     Entry Point(*), 001033a4, 
                                                                                          001035a8(*)  
        00103dfc fd 7b be a9     stp        x29,x30,[sp, #local_20]!
        00103e00 f3 0b 00 f9     str        x19,[sp, #local_10]
        00103e04 fd 03 00 91     mov        x29,sp
        00103e08 f3 03 00 aa     mov        x19,JavaVM
        00103e0c 1f 20 03 d5     nop
        00103e10 e0 03 13 aa     mov        JavaVM,x19
        00103e14 f7 15 00 94     bl         <EXTERNAL>::loadJniUtil                          undefined loadJniUtil()
        00103e18 20 01 f8 37     tbnz       JNI_VERSION,#0x1f,LAB_00103e3c
        00103e1c f9 15 00 94     bl         <EXTERNAL>::getEnv                               undefined getEnv()
        00103e20 1f 20 03 d5     nop
        00103e24 1f 20 03 d5     nop
        00103e28 c0 00 80 52     mov        antiTamperCheck?,#0x6
        00103e2c 20 00 a0 72     movk       antiTamperCheck?,#0x1, LSL #16
        00103e30 03 00 00 14     b          LAB_00103e3c
        00103e34 fb 15 00 94     bl         <EXTERNAL>::clearJni                             undefined clearJni()
        00103e38 00 00 80 12     mov        antiTamperCheck?,#0xffffffff
                             LAB_00103e3c                                    XREF[2]:     00103e18(j), 00103e30(j)  
        00103e3c f3 0b 40 f9     ldr        x19,[sp, #local_10]
        00103e40 fd 7b c2 a8     ldp        x29=>local_20,x30,[sp], #0x20
        00103e44 c0 03 5f d6     ret
                             **************************************************************
                             *                       THUNK FUNCTION                       *
                             **************************************************************
                             thunk undefined JNI_OnUnload()
                               Thunked-Function: <EXTERNAL>::clearJni
             undefined         <UNASSIGNED>   <RETURN>
                             JNI_OnUnload                                    XREF[3]:     Entry Point(*), 001033ac, 
                                                                                          001035d0(*)  
        00103e48 f6 15 00 14     b          <EXTERNAL>::clearJni

And if we look at it in the decompiled code view:

undefined8 JNI_OnLoad(undefined8 JavaVM)

{
  undefined8 JNI_VERSION;
  
  JNI_VERSION = loadJniUtil(JavaVM);
  if (-1 < (int)JNI_VERSION) {
    getEnv();
    JNI_VERSION = 0x10006;
  }
  return JNI_VERSION;
}

That looks pretty good! The calls to obfs_check1_finish and obfs_check1_start are gone, and the conditional check is gone. We are almost done.

Honestly, the only thing left is to export the modified library from Ghidra, replace the library in the decompiled APK, and recompile the APK.

And that’s easy!

Export modified dynamic library in Ghidra

Save as original file

And that’s it! Now we could replace the library in the decompiled APK, recompile it with something like apktool, and see if our fixes work.

Discovering other checks

Let’s check if some other dynamically linked library also exports obfs_check1_start or obfs_check1_finish. We can do so using nm and just a bit of bash scripting.

for lib in *.so; do
  if nm -D "$lib" 2>/dev/null | grep -qE 'obfs_check1_start|obfs_check1_finish'; then
    echo "[+] Found target: $lib"
    TARGET_LIBS+=("$lib")
  fi
done
[+] Found target: libfusefs.so
[+] Found target: liblm.so
[+] Found target: libmounter.so

We can see that two other libraries (libmounter.so and libfusefs.so) also export the functions we’ve determined to be anti-tamper checks. We would also have to patch these to get a fully working APK, but I won’t bore you with the details, since the steps are almost identical.