修补应用程序导致访问违规 c0000005

逆向工程 ollydbg x64dbg 修补
2021-07-10 14:55:38

我一直在使用这个应用程序来消除它的试用限制。但是我更改的每个字节都会引发访问违规。

一段代码:

原来的:

003354C6 - 0F85 D3000000         - jne 0033559F
00EA54CC - FF 87 54050000        - inc [edi+00000554]
00EA54D2 - 83 BF 54050000 0A     - cmp dword ptr [edi+00000554],0A { 10 }
003354D9 - 0F82 C0000000         - jb 0033559F
003354DF - 6A 00                 - push 00 { 0 }

打补丁

003354D2 - 83 BF 54050000 0F     - cmp dword ptr [edi+00000554],0F { 15 }

没有其他任何改变。现在程序确实运行了,但是大约 4 秒后它崩溃了。

当通过 x64dbg 运行时,它会捕获异常,但我不知道如何处理它。 x64dbg

并正常运行它给出了这个 Windows 崩溃报告

任何帮助,提示将不胜感激!

2个回答

没有更多信息,很难确定。但是,我会提出两个意见-

  • 看来您的补丁正试图将循环的上限从 10 增加到 16。

  • 发生访问冲突的函数似乎是一个 C++ 类成员函数,其中错误指令试图读取成员变量。(这里的 esi 是从 ecx 加载的,其中 ecx 是this指针。

这种组合让我怀疑循环限制的增加会导致越界数组访问。例如这样的事情 -

std::array<some_class*,10> widgets;         // or std::vector or C-array etc

.. elsewhere ..

for( size_t i = 0; i < 10; ++i ) {          // the patch changes 10 to 15
    widgets[i]->faulting_function( ... );
}

为了确认这个假设并解决它,你需要从故障函数向后工作,看看 ecx 来自哪里,然后增加容器的大小。但是,如果这是静态的并且在 exefile 的数据部分,那么这样做可能并非易事。

这更像是一个评论答案,但由于我的声誉低于 50,我只能发布答案。

这与cmp您进行字节修补指令有关。

EIP寄存器发生访问冲突,它告诉计算机接下来要执行什么指令,并控制程序的流程。cmp要修补是突破,可能是因为什么它返回不符合的jb发生指令,因此EIP抛出访问冲突。

具体cmp工作如何你逆转了吗?