关键call和关键跳、返回值的问题
关键call就是决定程序是否能注册等的关键地方。
关键call的执行结果决定跳转是否实现,在关键call下边,根据关键call的结果做出的判断,是关键跳。
关键call决定关键跳。
1、

根据字符串,查找

然后找到关键call和关键跳

如果我们只是修改关键跳jz,其实只是影响的这一段代码的执行。
如果修改的是关键call,影响的地方会必须多,因为调用这个关键call的地方,程序里面可能有多个地方;例如:如果程序中有10个地方调用这个call来查看注册是否成功,那么只要修改这个call,那么就会影响那10个地方的执行。
因此,我们在关键call的地方下断点

然后修改关键call中的执行结果,让je不执行。

test al,al就是判断al是否为0
我们进入call里面,可以直接修改返回结果。
修改技巧:

直接:
1)mov eax,0x1
2)retn n
这2处的代码,注意都会修改,第一处这里之所以是eax,因为关键跳的判断是根据eax的值决定;函数返回值,大部分都是eax,但是并不是全部;也有edx和eax共同返回值,也有指针地址作为返回值,这个要分情况定。
第二处,主要是retn 后边的n这个值。
这个n值要根据返回到上一次的函数地址的位置(一般参数的个数),决定这个n是多少。这个是直接返回,说明这个call是没有参数的,因此可以直接rent 0或者ret。

修改完,我们尝试执行一下,然后查看外边的关键跳是否执行:

发现,这个关键跳,已经不再执行了。
因此只要我们把这个关键call修改了,那么程序中所有调用关键call进行判断的地方都会被修改掉。这比修改关键跳,只作用于局部的范围大多了。

浙公网安备 33010602011771号