|
这就是Table 3。它以四个字节为单位,所以你想在Table 3中定位任何一个值,
这样计算:Table 3起始值 + X * 4
我们跟踪到这一行,它将位移值移入EDX,EDX在Table 3中所对应的值将和
INT 3所在的地址值相加。
005C5EF9 。 8B95 20F3FFFF MOV EDX,DWORD PTR SS:[EBP-CE0]
当 EDX= 2A
在下一行 EAX 被赋予Table 3起始值
005C5EFF 。 A1 881A5E00 MOV EAX,DWORD PTR DS:[5E1A88]
在我的机器里 3E6870就是Table 3的起始值
INT 3的地址值是406218,在第三行她被赋给ECX,然后在第四行和EIP相加。
005C5F0A > 。 030C90 ADD ECX,DWORD PTR DS:[EAX+EDX*4]
Table 3起始值+位移2A x 4 给出了这个INT 3在Table 3中对应的值。
新的EIP= 406218+[EAX+EDX*4]=40621C
如果我在子进程中写下JMP 40621C 来代替INT3,就搞定了。
看子进程如图

这里是我修复第一个INT 3。

右击鼠标选择 NEW ORIGIN HERE在 406217 然后运行。

这是子进程中的第二个INT 3 (40622E)。
如果我们返回父进程,它通过这个API 完成对第一个INT 3的处理
005C5F41 FF15 80E05D00 CALL DWORD PTR DS:[<&KERNEL32。SetThreadC>; \SetThreadContext
这是和GetThreadContext正好相反的API ,GetThreadContext读取EIP。现在通过SetThreadContext写入新的EIP,改变子进程的EIP为40621C然后继续运行。
这就是父进程的工作方式,运行父进程去研究第二个INT 3。
停在数学运算的开始

上一页 1 2 3 4 5 6 下一页 |