如何在导致应用程序崩溃的代码中修复指令
How to Fix the Instruction in Code which cause application crash
主应用程序崩溃了,因为服务器会受到格式字符串错误的影响,当处理播放器昵称时一个无效的内存区域。执行的指令是" 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,但我可以根据要求共享测试工具的源代码。
该错误是由记录函数NetManager_logMessage引起的将文本转储为转储,添加时间戳(使用snprintf(,然后将整个字符串传递到无需的函数file_printf格式参数(%s(,您需要使用值05而不是04来欺骗错误的空间。此技巧在许多游戏中都可以工作,祝您好运
相关文章:
- Qt在特定代码后没有继续运行指令
- 如何使用预处理器指令包含两次具有不同代码的文件?
- 为什么我的拆卸C 代码使用指令指针和偏移来获取字符串文字
- 在运行基本 Avx512 代码时获取非法指令
- 任何可以在单个 CPU 指令中在 0 和 1 之间翻转位/整数/布尔值的可能代码
- 如何在导致应用程序崩溃的代码中修复指令
- 为新的指令集扩展程序进行了优化的代码的向后兼容性
- 如何检查编译的代码是否使用了 SSE 和 AVX 指令?
- JIT代码生成后,如何检索LLVM ::指令地址
- 不使用循环如何迭代代码指令
- 如何将RDRAND指令添加到与2008年汇编的64位代码中
- 为什么Folloing代码在2010年Visual Studio(X64应用程序)中抛出非法指令例外
- 为什么我的代码会导致指令缓存未命中
- C/C++中的6502仿真器:如何将寻址模式代码与实际指令代码分离
- C++ 定义指令失败,代码看起来正常
- 什么样的C++代码将生成此 x86 汇编指令
- 是否可以(如何)在 c/c++ 代码中给出编译器指令
- 可以将代码包装在匿名命名空间中以使用指令吗
- C++代码中的预处理器指令(_VARIADIC_MAX)
- 如何在标准C/C++代码上包含和翻译自定义指令/扩展以保持高性能