378 lines
13 KiB
C
378 lines
13 KiB
C
/* MessageServer_Release_x64.exe sha256 7911b15c4379625eaa12ff227708aa3a033bc6ac2cf6b34283136e3a62df25f1
|
|
* Ghidra 12.1.2 decompiler output for 0x1400d6a50 FUN_1400d6a50
|
|
* Pseudocode, not original source. */
|
|
|
|
/* WARNING: Function: __security_check_cookie replaced with injection: security_check_cookie */
|
|
|
|
undefined8
|
|
FUN_1400d6a50(undefined8 *param_1,longlong param_2,uint param_3,longlong param_4,char param_5,
|
|
longlong param_6,undefined8 *param_7,longlong *param_8)
|
|
|
|
{
|
|
uint uVar1;
|
|
undefined8 *puVar2;
|
|
char cVar3;
|
|
int iVar4;
|
|
uint uVar5;
|
|
undefined8 uVar6;
|
|
longlong lVar7;
|
|
longlong *plVar8;
|
|
char *pcVar9;
|
|
uint *puVar10;
|
|
undefined2 *puVar11;
|
|
char cVar12;
|
|
uint *puVar13;
|
|
longlong lVar14;
|
|
longlong lVar15;
|
|
uint *puVar16;
|
|
uint *puVar17;
|
|
ulonglong uVar18;
|
|
ulonglong uVar19;
|
|
char **ppcVar20;
|
|
SIZE_T SVar21;
|
|
longlong **pplVar22;
|
|
uint *puVar23;
|
|
uint uVar24;
|
|
undefined1 auStack_108 [32];
|
|
uint local_e8;
|
|
longlong *local_d8;
|
|
uint local_d0 [2];
|
|
longlong local_c8;
|
|
uint *local_c0;
|
|
int local_b8;
|
|
int local_b4;
|
|
uint local_a8;
|
|
longlong local_a0;
|
|
uint local_98;
|
|
undefined8 *local_90;
|
|
char *local_88;
|
|
undefined8 local_80;
|
|
ushort local_78;
|
|
ushort local_76;
|
|
uint local_74;
|
|
uint local_70;
|
|
uint local_6c;
|
|
ulonglong local_68;
|
|
|
|
local_80 = 0xfffffffffffffffe;
|
|
local_68 = DAT_1401ac5a0 ^ (ulonglong)auStack_108;
|
|
uVar19 = (ulonglong)param_3;
|
|
local_90 = param_7;
|
|
local_a8 = param_3;
|
|
local_a0 = param_4;
|
|
FUN_1400bca00(local_d0);
|
|
uVar18 = uVar19;
|
|
FUN_1400bc680((longlong)local_d0,param_2,uVar19,param_4);
|
|
FUN_1400bcb60((int *)local_d0,uVar19,uVar18,param_4);
|
|
FUN_1400bc600((int *)local_d0,0,uVar18,param_4);
|
|
uVar19 = 0x10;
|
|
uVar6 = FUN_1400bc930(local_d0,(undefined8 *)&local_78,0x10);
|
|
if ((char)uVar6 == '\0') {
|
|
FUN_140008030(param_8,L"UDP frag header missing!",uVar19,param_4);
|
|
local_d8 = &local_c8;
|
|
FUN_1400d1800(&local_c8);
|
|
if (local_c0 == (uint *)0x0) {
|
|
return 2;
|
|
}
|
|
if (-1 < local_b4) {
|
|
return 2;
|
|
}
|
|
/* WARNING: Subroutine does not return */
|
|
FUN_14006be00();
|
|
}
|
|
if (local_78 == 0xabcd) {
|
|
if (((((int)local_74 < 1) ||
|
|
(iVar4 = (**(code **)(*(longlong *)*param_1 + 8))(), iVar4 < (int)local_74)) ||
|
|
(uVar19 = (ulonglong)local_6c, (int)local_6c < 0)) ||
|
|
((int)local_74 / (int)DAT_1401ac118 < (int)local_6c)) {
|
|
uVar5 = (**(code **)(*(longlong *)*param_1 + 8))();
|
|
local_e8 = local_6c;
|
|
FUN_140053d20(param_8,L"UDP frag length is wrong #1! packetlength=%d, maxlength=%d, fragID=%d"
|
|
,(ulonglong)local_74,(ulonglong)uVar5);
|
|
local_d8 = &local_c8;
|
|
FUN_1400d1800(&local_c8);
|
|
if (local_c0 == (uint *)0x0) {
|
|
return 2;
|
|
}
|
|
if (-1 < local_b4) {
|
|
return 2;
|
|
}
|
|
/* WARNING: Subroutine does not return */
|
|
FUN_14006be00();
|
|
}
|
|
if (local_78 != 0xabce) goto LAB_1400d6c2f;
|
|
}
|
|
else if (local_78 != 0xabce) {
|
|
FUN_140053d20(param_8,L"Cannot identify UDP fragment nor full packet! fragheaderSplitter=%u",
|
|
(ulonglong)local_78,param_4);
|
|
local_d8 = &local_c8;
|
|
FUN_1400d1800(&local_c8);
|
|
if (local_c0 == (uint *)0x0) {
|
|
return 2;
|
|
}
|
|
if (-1 < local_b4) {
|
|
return 2;
|
|
}
|
|
/* WARNING: Subroutine does not return */
|
|
FUN_14006be00();
|
|
}
|
|
if (((int)local_74 < 1) ||
|
|
(iVar4 = (**(code **)(*(longlong *)*param_1 + 8))(), iVar4 < (int)local_74)) {
|
|
FUN_140008030(param_8,L"UDP full packet length is wrong!",uVar19,param_4);
|
|
local_d8 = &local_c8;
|
|
FUN_1400d1800(&local_c8);
|
|
if (local_c0 == (uint *)0x0) {
|
|
return 2;
|
|
}
|
|
if (-1 < local_b4) {
|
|
return 2;
|
|
}
|
|
/* WARNING: Subroutine does not return */
|
|
FUN_14006be00();
|
|
}
|
|
LAB_1400d6c2f:
|
|
cVar3 = (**(code **)(*(longlong *)*param_1 + 0x20))();
|
|
uVar5 = local_6c;
|
|
puVar13 = local_c0;
|
|
lVar15 = local_c8;
|
|
cVar12 = (char)(local_76 >> 8);
|
|
if ((((cVar12 == '\0') || (param_5 == '\0')) || (cVar12 == param_5)) &&
|
|
((((char)local_76 == '\0' || (cVar3 == '\0')) || ((char)local_76 == cVar3)))) {
|
|
local_98 = DAT_1401ac118 * local_6c;
|
|
uVar1 = local_74 - local_98;
|
|
if ((int)DAT_1401ac118 < (int)(local_74 - local_98)) {
|
|
uVar1 = DAT_1401ac118;
|
|
}
|
|
ppcVar20 = (char **)(ulonglong)uVar1;
|
|
if (local_c8 == 0) {
|
|
if (local_c0 == (uint *)0x0) {
|
|
/* WARNING: Subroutine does not return */
|
|
FUN_1400d1900((ulonglong)local_98,(ulonglong)local_76,ppcVar20,param_4);
|
|
}
|
|
}
|
|
else {
|
|
local_b8 = *(int *)(local_c8 + 0x18);
|
|
}
|
|
uVar24 = local_b8 - ((int)(local_d0[0] + ((int)local_d0[0] >> 0x1f & 7U)) >> 3);
|
|
if ((local_78 == 0xabcd) && (uVar1 != uVar24)) {
|
|
FUN_140053d20(param_8,
|
|
L"UDP frag length is wrong #2! desiredFragLength=%d, fragPayloadLength=%d",
|
|
ppcVar20,(ulonglong)uVar24);
|
|
local_d8 = &local_c8;
|
|
FUN_1400d1800(&local_c8);
|
|
if (local_c0 == (uint *)0x0) {
|
|
return 2;
|
|
}
|
|
if (-1 < local_b4) {
|
|
return 2;
|
|
}
|
|
/* WARNING: Subroutine does not return */
|
|
FUN_14006be00();
|
|
}
|
|
local_d8 = param_1 + 1;
|
|
lVar14 = local_a0;
|
|
lVar7 = FUN_1400d3900((longlong)local_d8,local_a0);
|
|
if (lVar7 == 0) {
|
|
plVar8 = (longlong *)(**(code **)(*(longlong *)*param_1 + 0x18))();
|
|
pcVar9 = FUN_1400d6640(plVar8,lVar14,ppcVar20,param_4);
|
|
*(longlong *)(pcVar9 + 0x70) = param_6;
|
|
ppcVar20 = &local_88;
|
|
lVar14 = local_a0;
|
|
local_88 = pcVar9;
|
|
FUN_1400d5bb0((char *)local_d8,local_a0,ppcVar20);
|
|
lVar15 = local_c8;
|
|
puVar13 = local_c0;
|
|
uVar5 = local_6c;
|
|
}
|
|
else {
|
|
pcVar9 = *(char **)(lVar7 + 0x10);
|
|
}
|
|
puVar2 = local_90;
|
|
if (local_78 == 0xabcd) {
|
|
SVar21 = (SIZE_T)local_70;
|
|
puVar23 = (uint *)(SVar21 % (ulonglong)*(uint *)(pcVar9 + 0x28));
|
|
puVar17 = (uint *)0x0;
|
|
puVar13 = puVar23;
|
|
puVar10 = puVar17;
|
|
if ((*(longlong *)(pcVar9 + 8) != 0) &&
|
|
(puVar16 = *(uint **)(*(longlong *)(pcVar9 + 8) + (longlong)puVar23 * 8),
|
|
puVar16 != (uint *)0x0)) {
|
|
while (puVar13 = (uint *)((ulonglong)puVar16[8] % (ulonglong)*(uint *)(pcVar9 + 0x28)),
|
|
puVar10 = puVar17, (int)puVar23 == (int)puVar13) {
|
|
puVar10 = puVar16;
|
|
if ((*puVar16 == local_70) ||
|
|
(puVar16 = *(uint **)(puVar16 + 4), puVar10 = puVar17, puVar16 == (uint *)0x0)) break;
|
|
}
|
|
}
|
|
iVar4 = 0;
|
|
if (puVar10 == (uint *)0x0) {
|
|
plVar8 = (longlong *)FUN_1400d4840();
|
|
local_d8 = plVar8;
|
|
FUN_1400146f0((longlong)(plVar8 + 5),local_74,SVar21);
|
|
if (0 < (int)local_74) {
|
|
iVar4 = (int)(local_74 - 1) / (int)DAT_1401ac118 + 1;
|
|
}
|
|
FUN_1400c2030((longlong)plVar8,iVar4,SVar21);
|
|
plVar8[0xb] = param_6;
|
|
puVar13 = puVar17;
|
|
if ((int)plVar8[3] != 0) {
|
|
puVar13 = (uint *)plVar8[2];
|
|
}
|
|
memset(puVar13,0,(longlong)(int)plVar8[3]);
|
|
pplVar22 = &local_d8;
|
|
puVar13 = &local_70;
|
|
puVar10 = FUN_1400d5b10(pcVar9,puVar13,pplVar22);
|
|
uVar5 = local_6c;
|
|
}
|
|
else {
|
|
plVar8 = *(longlong **)(puVar10 + 2);
|
|
pplVar22 = (longlong **)(ulonglong)*(uint *)(plVar8 + 8);
|
|
if (*(uint *)(plVar8 + 8) != local_74) {
|
|
FUN_140053d20(param_8,
|
|
L"UDP frag length is wrong #3! assembledDataCount=%d, packetLength=%d",
|
|
pplVar22,(ulonglong)local_74);
|
|
SVar21 = 0;
|
|
FUN_1400a22a0(pcVar9,puVar10,'\0');
|
|
FUN_1400c28d0((longlong)plVar8,puVar10,SVar21);
|
|
local_d8 = &local_c8;
|
|
FUN_1400d1800(&local_c8);
|
|
if (local_c0 == (uint *)0x0) {
|
|
return 2;
|
|
}
|
|
if (-1 < local_b4) {
|
|
return 2;
|
|
}
|
|
/* WARNING: Subroutine does not return */
|
|
FUN_14006be00();
|
|
}
|
|
}
|
|
uVar1 = *(uint *)(plVar8 + 3);
|
|
if ((int)uVar1 <= (int)uVar5) {
|
|
FUN_140008030(param_8,L"UDP FragID is wrong!",pplVar22,puVar23);
|
|
local_d8 = &local_c8;
|
|
FUN_1400d1800(&local_c8);
|
|
if ((local_c0 != (uint *)0x0) && (local_b4 < 0)) {
|
|
/* WARNING: Subroutine does not return */
|
|
FUN_14006be00();
|
|
}
|
|
return 2;
|
|
}
|
|
if ((int)plVar8[8] < (int)(uVar24 + local_98)) {
|
|
FUN_140008030(param_8,L"UDP Frag Payload Length is wrong!",pplVar22,puVar23);
|
|
local_d8 = &local_c8;
|
|
FUN_1400d1800(&local_c8);
|
|
if (local_c0 == (uint *)0x0) {
|
|
return 2;
|
|
}
|
|
if (-1 < local_b4) {
|
|
return 2;
|
|
}
|
|
/* WARNING: Subroutine does not return */
|
|
FUN_14006be00();
|
|
}
|
|
if (((int)uVar5 < 0) || ((int)uVar1 <= (int)uVar5)) {
|
|
/* WARNING: Subroutine does not return */
|
|
FUN_14006be30((ulonglong)uVar1,puVar13,pplVar22,puVar23);
|
|
}
|
|
lVar15 = plVar8[2];
|
|
if (*(char *)(lVar15 + (int)uVar5) == '\0') {
|
|
if ((int)uVar1 <= (int)uVar5) {
|
|
/* WARNING: Subroutine does not return */
|
|
FUN_14006be30((ulonglong)uVar1,lVar15,pplVar22,puVar23);
|
|
}
|
|
*(undefined1 *)(lVar15 + (int)uVar5) = 1;
|
|
*(int *)(plVar8 + 10) = (int)plVar8[10] + 1;
|
|
*(double *)(pcVar9 + 0x60) = (double)(int)local_a8 + *(double *)(pcVar9 + 0x60);
|
|
*(longlong *)(pcVar9 + 0x70) = param_6;
|
|
puVar13 = local_c0;
|
|
if (local_c0 == (uint *)0x0) {
|
|
if (local_c8 == 0) {
|
|
/* WARNING: Subroutine does not return */
|
|
FUN_1400d1900(0,lVar15,pplVar22,puVar23);
|
|
}
|
|
puVar13 = puVar17;
|
|
if (*(int *)(local_c8 + 0x18) != 0) {
|
|
puVar13 = *(uint **)(local_c8 + 0x10);
|
|
}
|
|
}
|
|
if ((int)plVar8[8] != 0) {
|
|
puVar17 = (uint *)plVar8[7];
|
|
}
|
|
FUN_140006500((undefined8 *)((longlong)puVar17 + (longlong)(int)local_98),
|
|
(undefined8 *)
|
|
((longlong)((int)(local_d0[0] + ((int)local_d0[0] >> 0x1f & 7U)) >> 3) +
|
|
(longlong)puVar13),(longlong)(int)uVar24);
|
|
}
|
|
if ((int)plVar8[3] == (int)plVar8[10]) {
|
|
*(undefined4 *)(local_90 + 2) = *(undefined4 *)(local_a0 + 8);
|
|
*(undefined2 *)((longlong)local_90 + 0x14) = *(undefined2 *)(local_a0 + 0xc);
|
|
*local_90 = plVar8;
|
|
if (puVar10 == (uint *)0x0) {
|
|
/* WARNING: Subroutine does not return */
|
|
FUN_1400064e0(0x80004005);
|
|
}
|
|
FUN_1400a22a0(pcVar9,puVar10,'\0');
|
|
local_d8 = &local_c8;
|
|
FUN_1400d1800(&local_c8);
|
|
if (local_c0 == (uint *)0x0) {
|
|
return 0;
|
|
}
|
|
if (-1 < local_b4) {
|
|
return 0;
|
|
}
|
|
/* WARNING: Subroutine does not return */
|
|
FUN_14006be00();
|
|
}
|
|
}
|
|
else if ((local_78 == 0xabce) && (0 < (int)uVar24)) {
|
|
puVar17 = (uint *)0x0;
|
|
if (puVar13 == (uint *)0x0) {
|
|
if (lVar15 == 0) {
|
|
/* WARNING: Subroutine does not return */
|
|
FUN_1400d1900(0xabcd,lVar14,ppcVar20,param_4);
|
|
}
|
|
puVar13 = puVar17;
|
|
if (*(int *)(lVar15 + 0x18) != 0) {
|
|
puVar13 = *(uint **)(lVar15 + 0x10);
|
|
}
|
|
}
|
|
*(double *)(pcVar9 + 0x60) = (double)(int)local_a8 + *(double *)(pcVar9 + 0x60);
|
|
*(longlong *)(pcVar9 + 0x70) = param_6;
|
|
*(undefined4 *)(local_90 + 2) = *(undefined4 *)(local_a0 + 8);
|
|
*(undefined2 *)((longlong)local_90 + 0x14) = *(undefined2 *)(local_a0 + 0xc);
|
|
puVar11 = FUN_1400d4840();
|
|
FUN_1400146f0((longlong)(puVar11 + 0x14),uVar24,(SIZE_T)ppcVar20);
|
|
if (*(int *)(puVar11 + 0x20) != 0) {
|
|
puVar17 = *(uint **)(puVar11 + 0x1c);
|
|
}
|
|
FUN_140006500((undefined8 *)puVar17,
|
|
(undefined8 *)
|
|
((longlong)((int)(local_d0[0] + ((int)local_d0[0] >> 0x1f & 7U)) >> 3) +
|
|
(longlong)puVar13),(longlong)(int)uVar24);
|
|
*puVar2 = puVar11;
|
|
local_d8 = &local_c8;
|
|
FUN_1400d1800(&local_c8);
|
|
if ((local_c0 != (uint *)0x0) && (local_b4 < 0)) {
|
|
/* WARNING: Subroutine does not return */
|
|
FUN_14006be00();
|
|
}
|
|
return 0;
|
|
}
|
|
local_d8 = &local_c8;
|
|
FUN_1400d1800(&local_c8);
|
|
if ((local_c0 != (uint *)0x0) && (local_b4 < 0)) {
|
|
/* WARNING: Subroutine does not return */
|
|
FUN_14006be00();
|
|
}
|
|
}
|
|
else {
|
|
local_d8 = &local_c8;
|
|
FUN_1400d1800(&local_c8);
|
|
if ((local_c0 != (uint *)0x0) && (local_b4 < 0)) {
|
|
/* WARNING: Subroutine does not return */
|
|
FUN_14006be00();
|
|
}
|
|
}
|
|
return 1;
|
|
}
|
|
|