重点:1、如何将一段代码和一个变量分别注入一个程序。2、硬件断点。
0x00
首先还是先运行程序明白程序运行过程,然后重载,通过堆栈寻找NEG窗口调用函数。
重载后运行函数到正常,然后暂停程序。
ALT+k查看堆栈,找到NEG窗口调用函数。
发现上图所指的函数是一个Dialog对话窗口调用,那块可能NEG窗口就是通过它调用的。下断点,然后调试。发现此处是程序主体,开始结束三个主体窗口的调用处,不能简单直接nop,继续跟进。
0x01:
**方法,查看到程序上方刚好有一个je跳转可以跳过call函数,先手动绕过第一次和第三次的NEG跳转,然后让第二次跳转实习。那么**就可以手动添加一段类似if的语句,通过计数器,当计数器等于二时不跳转,不等于2时跳转。
首先在程序的数据段找到一个用于填充的无用数据,然后下硬件写入断点,先检查程序运行时是否会修改这个数据,如果不会把他作为我们的变量存储地址。
测试发现不会,那么我们记下这个地址。
0x02
打内嵌补丁。在代码段找一段用于填充的无用代码段,利用插件修改本代码段的代码为我们的**代码:
0x437d6e:
inc byte ptr [445e80]
cmp byte ptr [445e80],2
jnz 4203ba
lea ecx,dword ptr ss:[esp+0x4c]
jmp 42037f
最后汇编,保存两处修改。