如何在导致应用程序崩溃的代码中修复指令

How to Fix the Instruction in Code which cause application crash

本文关键字:代码 指令 崩溃 应用程序      更新时间:2023-10-16

主应用程序崩溃了,因为服务器会受到格式字符串错误的影响,当处理播放器昵称时一个无效的内存区域。执行的指令是" cmp [eax],00000000",其中eax包含4昵称中的字节并崩溃服务器。

我进行了调试,发现在传递给file_printf函数的日志字符串之前,"%s"丢失了。因此,我试图通过IDA调试器添加此字符串并成功。输入这些字节后,现在,服务器崩溃了,随着消息"服务器崩溃","服务器不易受伤害"代码我输入的字节要修补应用程序:

RVA
    00400000
OFFSET
    0041dfad    cc  68          ; push 0061d0dc
           +    cc  |0061d0dc
           +    cc  e8          ; call 0040d270
           +    cc  ^0040d270
           +    cc  83          ; add esp,04
           +    cc  c4
           +    cc  04
           +    cc  e9          ; jmp 0041e059
           +    cc  ^0041e059
    0041e054    e8  e9          ; jmp 0041dfad
           +    ??  ^0041dfad
0055DD63 cmp     dword ptr [eax], 0
 /*source*/
if ( *(_DWORD *)a1 )
    a1 = sub_445D50();
  if ( v2 )
  {
    --*(_DWORD *)(v2 + 4);
    *(_DWORD *)a1 = *(_DWORD *)(v2 + 20);
    *(_DWORD *)(v2 + 20) = a1;
  }
  else
  {
    v3 = *(_DWORD *)((a1 - 4) & 0xFFFFFFFC);
    --dword_798ABD0;
    sub_445D50();
    memset(*(void **)(v3 + 8), 0xCDu, *(_DWORD *)(v3 + 16));
    free((void *)v3);
  }
}

/ hex值/0055DD63 83 38 00

测试服务器崩溃后,服务器在测试工具"服务器不易受伤害"中使用消息崩溃,但崩溃了。

和在调试器IDA中,我通过详细消息获得了此结果:

55dd63: The Instruction at 0x55DD63 referenced memory at 0x61616161, The memory could not be read -> 61616161 (exc.code c0000005, tid 4692)

图像1

图像2

图像3

图像4

图像5

我也可以共享测试工具,但由于测试工具具有.simplese trojan,并且可能会损害您的PC,但我可以根据要求共享测试工具的源代码。

,我可能会损害您的PC。

该错误是由记录函数NetManager_logMessage引起的将文本转储为转储,添加时间戳(使用snprintf(,然后将整个字符串传递到无需的函数file_printf格式参数(%s(,您需要使用值05而不是04来欺骗错误的空间。此技巧在许多游戏中都可以工作,祝您好运