442 lines
16 KiB
C
442 lines
16 KiB
C
/* MessageServer_Release_x64.exe sha256 7911b15c4379625eaa12ff227708aa3a033bc6ac2cf6b34283136e3a62df25f1
|
|
* Ghidra 12.1.2 decompiler output for 0x1400c0610 FUN_1400c0610
|
|
* Pseudocode, not original source. */
|
|
|
|
ulonglong FUN_1400c0610(uint *param_1,int param_2,uint *param_3,uint *param_4)
|
|
|
|
{
|
|
undefined *puVar1;
|
|
undefined *puVar2;
|
|
char cVar3;
|
|
uint uVar4;
|
|
uint uVar5;
|
|
uint uVar6;
|
|
undefined8 uVar7;
|
|
ulonglong uVar8;
|
|
wchar_t *pwVar9;
|
|
uint *puVar10;
|
|
uint *puVar11;
|
|
longlong *plVar12;
|
|
int *piVar13;
|
|
int *piVar14;
|
|
undefined ***pppuVar15;
|
|
uint *puVar16;
|
|
wchar_t *pwVar17;
|
|
uint uVar18;
|
|
longlong lVar19;
|
|
uint *puVar20;
|
|
uint **ppuVar21;
|
|
undefined **ppuVar22;
|
|
uint uVar23;
|
|
wchar_t local_res18 [4];
|
|
uint *local_res20;
|
|
uint *local_b8;
|
|
undefined *local_b0;
|
|
uint *local_a8;
|
|
undefined1 local_a0;
|
|
wchar_t local_98 [4];
|
|
undefined **local_90;
|
|
undefined8 local_88;
|
|
undefined8 local_80;
|
|
undefined8 local_78;
|
|
undefined8 local_70;
|
|
uint local_68;
|
|
uint local_64;
|
|
uint *local_60;
|
|
undefined1 local_58;
|
|
longlong local_50 [3];
|
|
|
|
local_50[1] = 0xfffffffffffffffe;
|
|
uVar4 = (int)(*param_3 + ((int)*param_3 >> 0x1f & 7U)) >> 3;
|
|
puVar11 = param_3;
|
|
puVar20 = param_4;
|
|
local_res20 = param_4;
|
|
local_68 = uVar4;
|
|
uVar7 = FUN_1400bd260(param_3,&local_64,param_3,param_4);
|
|
if ((char)uVar7 != '\0') {
|
|
pwVar9 = local_res18;
|
|
puVar10 = param_3;
|
|
uVar8 = FUN_1400bcfd0(param_3,(undefined8 *)pwVar9,puVar11,puVar20);
|
|
if ((char)uVar8 != '\0') {
|
|
FUN_14006cb70(puVar10,pwVar9,puVar11,puVar20);
|
|
local_b0 = PTR_DAT_1401ac010;
|
|
puVar11 = (uint *)(ulonglong)param_3[10];
|
|
pwVar9 = (wchar_t *)(**(code **)(*(longlong *)param_1 + 0xc0))(param_1,puVar11,&local_b0);
|
|
if (((pwVar9 == (wchar_t *)0x0) || (puVar10 = (uint *)(ulonglong)local_64, local_64 == 0)) ||
|
|
(local_64 == 3)) {
|
|
LAB_1400c0d95:
|
|
piVar13 = (int *)(**(code **)(*(longlong *)param_1 + 0x58))(param_1);
|
|
local_a8 = (uint *)piVar13;
|
|
FUN_14006b350(piVar13);
|
|
local_a0 = 1;
|
|
if (DAT_1401b42cf != '\0') {
|
|
(**(code **)(*(longlong *)param_1 + 200))
|
|
(param_1,L"Proud::CNetCoreImpl::ProcessMessage_Encrypted");
|
|
}
|
|
FUN_1400141f0((longlong *)&local_b0,L" decrypt failed");
|
|
local_88 = 0;
|
|
local_80 = 0;
|
|
local_78 = 0;
|
|
local_70 = 0;
|
|
local_90 = Proud::ByteArray::vftable;
|
|
ppuVar22 = &local_b0;
|
|
plVar12 = FUN_140078c10((longlong *)local_res18,6,(ulonglong)param_3[10],
|
|
(longlong *)ppuVar22,(longlong)&local_90);
|
|
lVar19 = *(longlong *)param_1;
|
|
(**(code **)(lVar19 + 0x80))(param_1,plVar12);
|
|
FUN_140078360(&local_90);
|
|
uVar8 = (ulonglong)uVar4;
|
|
FUN_1400bc600((int *)param_3,uVar8,lVar19,ppuVar22);
|
|
FUN_14006b3e0((longlong)piVar13);
|
|
puVar2 = local_b0;
|
|
if (((local_b0 != (undefined *)0x0) && (local_b0 != PTR_DAT_1401ac010)) &&
|
|
(puVar1 = local_b0 + -8, puVar1 != (undefined *)0x0)) {
|
|
piVar14 = (int *)FUN_14006cb70(piVar13,uVar8,lVar19,ppuVar22);
|
|
local_a8 = (uint *)piVar14;
|
|
FUN_14006b350(piVar14);
|
|
local_a0 = 1;
|
|
piVar13 = (int *)(puVar2 + -4);
|
|
*piVar13 = *piVar13 + -1;
|
|
if (*piVar13 == 0) {
|
|
FUN_14006cc60(puVar1);
|
|
}
|
|
local_b0 = (undefined *)FUN_14006b3e0((longlong)piVar14);
|
|
}
|
|
goto LAB_1400c0e9d;
|
|
}
|
|
if (local_64 == 1) {
|
|
puVar20 = (uint *)(ulonglong)(uint)((int)(((int)*param_3 >> 0x1f & 7U) + *param_3) >> 3);
|
|
puVar10 = param_3;
|
|
puVar11 = param_4;
|
|
uVar7 = FUN_1400cec90((longlong)param_3,(int *)param_4,(uint *)pwVar9,(ulonglong)puVar20);
|
|
cVar3 = (char)uVar7;
|
|
LAB_1400c070e:
|
|
if (cVar3 == '\0') goto LAB_1400c0d95;
|
|
}
|
|
else if (local_64 == 2) {
|
|
puVar20 = (uint *)(ulonglong)(uint)((int)(((int)*param_3 >> 0x1f & 7U) + *param_3) >> 3);
|
|
pwVar9 = pwVar9 + 0x1e8;
|
|
puVar10 = param_3;
|
|
puVar11 = param_4;
|
|
uVar7 = FUN_1400dd0f0((longlong)param_3,(int *)param_4,(SIZE_T)pwVar9,(ulonglong)puVar20);
|
|
cVar3 = (char)uVar7;
|
|
goto LAB_1400c070e;
|
|
}
|
|
if (param_2 != 0x24) {
|
|
LAB_1400c0d45:
|
|
puVar2 = local_b0;
|
|
if (((local_b0 != (undefined *)0x0) && (local_b0 != PTR_DAT_1401ac010)) &&
|
|
(puVar1 = local_b0 + -8, puVar1 != (undefined *)0x0)) {
|
|
piVar14 = (int *)FUN_14006cb70(puVar10,puVar11,pwVar9,puVar20);
|
|
local_a8 = (uint *)piVar14;
|
|
FUN_14006b350(piVar14);
|
|
local_a0 = 1;
|
|
piVar13 = (int *)(puVar2 + -4);
|
|
*piVar13 = *piVar13 + -1;
|
|
if (*piVar13 == 0) {
|
|
FUN_14006cc60(puVar1);
|
|
}
|
|
local_b0 = (undefined *)FUN_14006b3e0((longlong)piVar14);
|
|
}
|
|
return CONCAT71((int7)((ulonglong)local_b0 >> 8),1);
|
|
}
|
|
lVar19 = 2;
|
|
pwVar9 = local_98;
|
|
uVar7 = FUN_1400bc930(param_4,(undefined8 *)pwVar9,2);
|
|
if ((char)uVar7 != '\0') {
|
|
pwVar9 = local_res18;
|
|
pwVar17 = (wchar_t *)(ulonglong)param_3[10];
|
|
cVar3 = (**(code **)(*(longlong *)param_1 + 0xb0))(param_1);
|
|
lVar19 = *(longlong *)param_1;
|
|
if (cVar3 == '\0') {
|
|
puVar10 = (uint *)(**(code **)(lVar19 + 0x58))();
|
|
puVar11 = puVar10;
|
|
local_a8 = puVar10;
|
|
FUN_14006b350((int *)puVar10);
|
|
local_a0 = 1;
|
|
if (DAT_1401b42cf != '\0') {
|
|
pwVar9 = *(wchar_t **)param_1;
|
|
pwVar17 = L"Proud::CNetCoreImpl::ProcessMessage_Encrypted";
|
|
puVar11 = param_1;
|
|
(**(code **)(pwVar9 + 100))();
|
|
}
|
|
FUN_14006cb70(puVar11,pwVar17,pwVar9,puVar20);
|
|
local_b8 = (uint *)PTR_DAT_1401ac010;
|
|
FUN_140053d20((longlong *)&local_b8,L"GetExpectedDecryptCount failed!!",pwVar9,puVar20);
|
|
local_88 = 0;
|
|
local_80 = 0;
|
|
local_78 = 0;
|
|
local_70 = 0;
|
|
local_90 = Proud::ByteArray::vftable;
|
|
ppuVar21 = &local_b8;
|
|
plVar12 = FUN_140078c10(local_50,6,(ulonglong)param_3[10],(longlong *)ppuVar21,
|
|
(longlong)&local_90);
|
|
lVar19 = *(longlong *)param_1;
|
|
(**(code **)(lVar19 + 0x80))(param_1,plVar12);
|
|
FUN_140078360(&local_90);
|
|
uVar8 = (ulonglong)uVar4;
|
|
FUN_1400bc600((int *)param_4,uVar8,lVar19,ppuVar21);
|
|
puVar11 = local_b8;
|
|
if (((local_b8 != (uint *)0x0) && (local_b8 != (uint *)PTR_DAT_1401ac010)) &&
|
|
(puVar20 = local_b8 + -2, puVar20 != (uint *)0x0)) {
|
|
piVar13 = (int *)FUN_14006cb70(param_4,uVar8,lVar19,ppuVar21);
|
|
local_60 = (uint *)piVar13;
|
|
FUN_14006b350(piVar13);
|
|
local_58 = 1;
|
|
puVar11 = puVar11 + -1;
|
|
*puVar11 = *puVar11 - 1;
|
|
if (*puVar11 == 0) {
|
|
FUN_14006cc60(puVar20);
|
|
}
|
|
FUN_14006b3e0((longlong)piVar13);
|
|
}
|
|
local_b8 = (uint *)PTR_DAT_1401ac010;
|
|
FUN_14006b3e0((longlong)puVar10);
|
|
puVar2 = local_b0;
|
|
if (((local_b0 != (undefined *)0x0) && (local_b0 != PTR_DAT_1401ac010)) &&
|
|
(puVar1 = local_b0 + -8, puVar1 != (undefined *)0x0)) {
|
|
piVar14 = (int *)FUN_14006cb70(puVar10,uVar8,lVar19,ppuVar21);
|
|
local_a8 = (uint *)piVar14;
|
|
FUN_14006b350(piVar14);
|
|
local_a0 = 1;
|
|
piVar13 = (int *)(puVar2 + -4);
|
|
*piVar13 = *piVar13 + -1;
|
|
if (*piVar13 == 0) {
|
|
FUN_14006cc60(puVar1);
|
|
}
|
|
local_b0 = (undefined *)FUN_14006b3e0((longlong)piVar14);
|
|
}
|
|
}
|
|
else {
|
|
if (local_98[0] == local_res18[0]) {
|
|
puVar11 = (uint *)(ulonglong)param_3[10];
|
|
(**(code **)(lVar19 + 0xb8))();
|
|
puVar10 = param_1;
|
|
goto LAB_1400c0d45;
|
|
}
|
|
puVar10 = (uint *)(**(code **)(lVar19 + 0x58))();
|
|
puVar11 = puVar10;
|
|
local_a8 = puVar10;
|
|
FUN_14006b350((int *)puVar10);
|
|
local_a0 = 1;
|
|
if (DAT_1401b42cf != '\0') {
|
|
pwVar9 = *(wchar_t **)param_1;
|
|
pwVar17 = L"Proud::CNetCoreImpl::ProcessMessage_Encrypted";
|
|
puVar11 = param_1;
|
|
(**(code **)(pwVar9 + 100))();
|
|
}
|
|
FUN_14006cb70(puVar11,pwVar17,pwVar9,puVar20);
|
|
local_b8 = (uint *)PTR_DAT_1401ac010;
|
|
FUN_140053d20((longlong *)&local_b8,L"decryptCount1(%d) != decryptCount2(%d)",
|
|
(ulonglong)(ushort)local_98[0],(ulonglong)(ushort)local_res18[0]);
|
|
local_88 = 0;
|
|
local_80 = 0;
|
|
local_78 = 0;
|
|
local_70 = 0;
|
|
local_90 = Proud::ByteArray::vftable;
|
|
ppuVar21 = &local_b8;
|
|
plVar12 = FUN_140078c10(local_50,6,(ulonglong)param_3[10],(longlong *)ppuVar21,
|
|
(longlong)&local_90);
|
|
lVar19 = *(longlong *)param_1;
|
|
(**(code **)(lVar19 + 0x80))(param_1,plVar12);
|
|
FUN_140078360(&local_90);
|
|
uVar8 = (ulonglong)uVar4;
|
|
FUN_1400bc600((int *)param_4,uVar8,lVar19,ppuVar21);
|
|
puVar11 = local_b8;
|
|
if (((local_b8 != (uint *)0x0) && (local_b8 != (uint *)PTR_DAT_1401ac010)) &&
|
|
(puVar20 = local_b8 + -2, puVar20 != (uint *)0x0)) {
|
|
piVar13 = (int *)FUN_14006cb70(param_4,uVar8,lVar19,ppuVar21);
|
|
local_60 = (uint *)piVar13;
|
|
FUN_14006b350(piVar13);
|
|
local_58 = 1;
|
|
puVar11 = puVar11 + -1;
|
|
*puVar11 = *puVar11 - 1;
|
|
if (*puVar11 == 0) {
|
|
FUN_14006cc60(puVar20);
|
|
}
|
|
FUN_14006b3e0((longlong)piVar13);
|
|
}
|
|
local_b8 = (uint *)PTR_DAT_1401ac010;
|
|
FUN_14006b3e0((longlong)puVar10);
|
|
puVar2 = local_b0;
|
|
if (((local_b0 != (undefined *)0x0) && (local_b0 != PTR_DAT_1401ac010)) &&
|
|
(puVar1 = local_b0 + -8, puVar1 != (undefined *)0x0)) {
|
|
piVar14 = (int *)FUN_14006cb70(puVar10,uVar8,lVar19,ppuVar21);
|
|
local_a8 = (uint *)piVar14;
|
|
FUN_14006b350(piVar14);
|
|
local_a0 = 1;
|
|
piVar13 = (int *)(puVar2 + -4);
|
|
*piVar13 = *piVar13 + -1;
|
|
if (*piVar13 == 0) {
|
|
FUN_14006cc60(puVar1);
|
|
}
|
|
local_b0 = (undefined *)FUN_14006b3e0((longlong)piVar14);
|
|
}
|
|
}
|
|
goto LAB_1400c0e9d;
|
|
}
|
|
puVar10 = (uint *)(**(code **)(*(longlong *)param_1 + 0x58))();
|
|
puVar11 = puVar10;
|
|
local_60 = puVar10;
|
|
FUN_14006b350((int *)puVar10);
|
|
local_58 = 1;
|
|
if (DAT_1401b42cf != '\0') {
|
|
lVar19 = *(longlong *)param_1;
|
|
pwVar9 = L"Proud::CNetCoreImpl::ProcessMessage_Encrypted";
|
|
puVar11 = param_1;
|
|
(**(code **)(lVar19 + 200))();
|
|
}
|
|
FUN_14006cb70(puVar11,pwVar9,lVar19,puVar20);
|
|
local_b8 = (uint *)PTR_DAT_1401ac010;
|
|
uVar4 = FUN_14006c9f0(L"decryptCount1 read failed!!");
|
|
uVar18 = 0;
|
|
uVar6 = 0;
|
|
uVar8 = 0;
|
|
if ((local_b8 != (uint *)0x0) && (uVar8 = 0, local_b8 != (uint *)PTR_DAT_1401ac010)) {
|
|
uVar8 = (ulonglong)local_b8[-2];
|
|
}
|
|
uVar5 = uVar4;
|
|
if ((((int)uVar4 <= (int)uVar8) && (uVar5 = uVar6, local_b8 != (uint *)0x0)) &&
|
|
(local_b8 != (uint *)PTR_DAT_1401ac010)) {
|
|
uVar5 = local_b8[-2];
|
|
}
|
|
uVar23 = 1;
|
|
if (1 < (int)uVar5) {
|
|
uVar23 = uVar5;
|
|
}
|
|
uVar5 = uVar6;
|
|
if ((local_b8 != (uint *)0x0) && (local_b8 != (uint *)PTR_DAT_1401ac010)) {
|
|
uVar5 = local_b8[-2];
|
|
}
|
|
if ((int)uVar5 < (int)uVar23) {
|
|
if (local_b8 == (uint *)0x0) {
|
|
local_b8 = (uint *)PTR_DAT_1401ac010;
|
|
}
|
|
if ((int)uVar23 < 0) {
|
|
/* WARNING: Subroutine does not return */
|
|
FUN_14006be00();
|
|
}
|
|
if (uVar23 == 0) {
|
|
FUN_1400031e0((longlong *)&local_b8,PTR_DAT_1401ac010,uVar8,puVar20);
|
|
}
|
|
else {
|
|
uVar5 = uVar6;
|
|
if ((local_b8 != (uint *)0x0) && (local_b8 != (uint *)PTR_DAT_1401ac010)) {
|
|
uVar5 = local_b8[-2];
|
|
}
|
|
if (uVar23 != uVar5) {
|
|
puVar11 = (uint *)FUN_14006cbf0((longlong)(int)uVar23 * 2 + 10);
|
|
if (puVar11 != (uint *)0x0) {
|
|
*puVar11 = 0;
|
|
puVar11[1] = 1;
|
|
}
|
|
*puVar11 = uVar23;
|
|
uVar5 = uVar6;
|
|
if ((local_b8 != (uint *)0x0) && (local_b8 != (uint *)PTR_DAT_1401ac010)) {
|
|
uVar5 = local_b8[-2];
|
|
}
|
|
puVar16 = (uint *)PTR_DAT_1401ac010;
|
|
if ((int)uVar23 < (int)uVar5) {
|
|
LAB_1400c0875:
|
|
if (local_b8 != (uint *)0x0) {
|
|
puVar16 = local_b8;
|
|
}
|
|
}
|
|
else {
|
|
uVar23 = uVar6;
|
|
if (local_b8 != (uint *)0x0) {
|
|
if (local_b8 != (uint *)PTR_DAT_1401ac010) {
|
|
uVar23 = local_b8[-2];
|
|
}
|
|
goto LAB_1400c0875;
|
|
}
|
|
}
|
|
uVar8 = (ulonglong)uVar23;
|
|
FUN_14006ca20(puVar11 + 2,puVar16,uVar23);
|
|
FUN_1400031e0((longlong *)&local_b8,puVar16,uVar8,puVar20);
|
|
local_b8 = puVar11 + 2;
|
|
}
|
|
}
|
|
}
|
|
FUN_140002e40((longlong *)&local_b8);
|
|
puVar11 = local_b8;
|
|
if (local_b8 == (uint *)0x0) {
|
|
puVar11 = (uint *)PTR_DAT_1401ac010;
|
|
}
|
|
FUN_14006ca20(puVar11,L"decryptCount1 read failed!!",uVar4);
|
|
puVar11 = local_b8;
|
|
if (local_b8 == (uint *)0x0) {
|
|
puVar11 = (uint *)PTR_DAT_1401ac010;
|
|
}
|
|
uVar6 = FUN_14006c9f0((short *)puVar11);
|
|
uVar4 = uVar18;
|
|
if (0 < (int)uVar6) {
|
|
uVar4 = uVar6;
|
|
}
|
|
uVar6 = uVar18;
|
|
if ((local_b8 != (uint *)0x0) && (local_b8 != (uint *)PTR_DAT_1401ac010)) {
|
|
uVar6 = local_b8[-2];
|
|
}
|
|
if (((int)uVar4 < (int)uVar6) || (uVar4 = uVar18, local_b8 == (uint *)0x0)) {
|
|
LAB_1400c0908:
|
|
if (((local_b8 != (uint *)PTR_DAT_1401ac010) && (local_b8 != (uint *)0x0)) &&
|
|
(local_b8 + -2 != (uint *)0x0)) {
|
|
local_b8[-2] = uVar4;
|
|
*(undefined2 *)((longlong)local_b8 + (longlong)(int)uVar4 * 2) = 0;
|
|
}
|
|
}
|
|
else if (local_b8 != (uint *)PTR_DAT_1401ac010) {
|
|
uVar4 = local_b8[-2];
|
|
goto LAB_1400c0908;
|
|
}
|
|
local_88 = 0;
|
|
local_80 = 0;
|
|
local_78 = 0;
|
|
local_70 = 0;
|
|
local_90 = Proud::ByteArray::vftable;
|
|
ppuVar21 = &local_b8;
|
|
plVar12 = FUN_140078c10(local_50,6,(ulonglong)param_3[10],(longlong *)ppuVar21,
|
|
(longlong)&local_90);
|
|
lVar19 = *(longlong *)param_1;
|
|
(**(code **)(lVar19 + 0x80))(param_1);
|
|
pppuVar15 = &local_90;
|
|
FUN_140078360(pppuVar15);
|
|
puVar11 = local_b8;
|
|
if (((local_b8 != (uint *)0x0) && (local_b8 != (uint *)PTR_DAT_1401ac010)) &&
|
|
(puVar20 = local_b8 + -2, puVar20 != (uint *)0x0)) {
|
|
piVar13 = (int *)FUN_14006cb70(pppuVar15,plVar12,lVar19,ppuVar21);
|
|
local_a8 = (uint *)piVar13;
|
|
FUN_14006b350(piVar13);
|
|
local_a0 = 1;
|
|
puVar11 = puVar11 + -1;
|
|
*puVar11 = *puVar11 - 1;
|
|
if (*puVar11 == 0) {
|
|
FUN_14006cc60(puVar20);
|
|
}
|
|
FUN_14006b3e0((longlong)piVar13);
|
|
}
|
|
uVar8 = (ulonglong)local_68;
|
|
FUN_1400bc600((int *)local_res20,uVar8,lVar19,ppuVar21);
|
|
FUN_14006b3e0((longlong)puVar10);
|
|
puVar2 = local_b0;
|
|
if (((local_b0 != (undefined *)0x0) && (local_b0 != PTR_DAT_1401ac010)) &&
|
|
(puVar1 = local_b0 + -8, puVar1 != (undefined *)0x0)) {
|
|
piVar14 = (int *)FUN_14006cb70(puVar10,uVar8,lVar19,ppuVar21);
|
|
local_a8 = (uint *)piVar14;
|
|
FUN_14006b350(piVar14);
|
|
local_a0 = 1;
|
|
piVar13 = (int *)(puVar2 + -4);
|
|
*piVar13 = *piVar13 + -1;
|
|
if (*piVar13 == 0) {
|
|
FUN_14006cc60(puVar1);
|
|
}
|
|
local_b0 = (undefined *)FUN_14006b3e0((longlong)piVar14);
|
|
}
|
|
goto LAB_1400c0e9d;
|
|
}
|
|
}
|
|
local_b0 = (undefined *)FUN_1400bc600((int *)param_3,(ulonglong)uVar4,puVar11,puVar20);
|
|
LAB_1400c0e9d:
|
|
return (ulonglong)local_b0 & 0xffffffffffffff00;
|
|
}
|
|
|