使用 ollydbg 访问地址

逆向工程 ollydbg
2021-06-24 13:17:44

我有一些关于如何绕过几百行到达地址的问题。假设我们有以下场景:

                   + -----------------------+
          004019EF |                        |   <----- we are here
                   |   content of function  |
                   |   004019EF             |
                   |                        |
                   |                        |
                   +------------------------+
                   |                        |
                   |     this area contains |
                   |     lines which        |
                   |     I want to bypass   |
                   |     quickly            |
                   |                        |
                   +------------------------+
         00401E1F  |                        |     <-- we want to go here
                   |     content which I    |
                   |     want to analyze    |
                   |                        |
                   |                        |
                   +------------------------+

因此,情况是例如我在 004019EF,然后我发现 00401E1F 的位置似乎也很重要。我决定去那里。为此,我单击 Ctrl+G,键入目标地址并在 00401E1F 处设置断点(单击 F2)。然后我让它运行。但是程序没有到达那个地方。它终止进程并在带有 RETN 的位置结束。于是,我又开始了这个过程。但是这一次,我手动从 004019EF 行到 00401E1F。在途中,我通过用 NOP 指令替换它们来消除所有导致终止的行/指令。最后,我到达了地址 00401E1F。

我的问题是:

当我用NOP替换指令或改变跳转指令的标志来修改程序的执行流程时,这些修改对00401E1F的内容会不会有问题?

我的意思是我可以说以下几点:

“这些指令会导致问题,所以用 NOP 删除它们不会有问题”

或者

我是否会错过 004019EF 和 00401E1F 之间区域的一些结果,这可能对 00401E1F 的内容很重要?如果是,那么:

是否有另一种方法可以绕过该线路到达目标地址而无需修补/更改线路或指令?

2个回答

我是否会错过 004019EF 和 00401E1F 之间区域的一些结果,这可能对 00401E1F 的内容很重要?

如果不分析该代码,就不可能知道该代码是否包含副作用

是否有另一种方法可以绕过该线路到达目标地址而无需修补/更改线路或指令?

是的,您有两个选择:

  1. 更改寄存器。最直接的方法就是改变EIP尽管在副作用方面,这当然可能是有问题的。
  2. 如果00401E1F有条件地执行之前的代码,则满足所需的任何条件,以便该代码不会被执行。

杰森说的。考虑这个 C 代码:

int size;
int nelem=1;
struct whatever *data;
if (debugger_is_running)
    nelem-=2;                 // pass an unreasonable value to malloc
size=sizeof (struct whatever)*nelem;
if ((data=malloc(size))==NULL)
    abort_program("No memory");
......
// use data here

这是nelems-=2您要修补指令。如果您刚刚nop调用abort_program,您的数据仍将是一个 NULL 指针,并导致程序在您使用它时崩溃,很久以后。

您确实需要分析代码块之间的所有内容,找出程序如何检测调试器,并更改那段代码。