执行该exe,会出现三个窗口,目标是去除第一个和第三个Nags。
程序相对复杂,因此选择直接将程序跑起来,然后弹出第一个Nags时点击暂停,查看堆栈的调用情况,毕竟函数的调用全靠堆栈进行的,所以可以看到经历了哪些堆栈的调用。在程序暂停在第一个窗口弹出的时候暂停。
然后查看堆栈调用情况。
认真观察其函数名字,被框出来的函数应该是真正执行dialog的地方。
在其调用地址0x42039A下断点。
重载程序,执行到断点处,然后在单步执行,程序确实弹出了第一个窗口,说明调用入口函数没找错。
继续点击执行,发现还是回到了这个地方。说明剩余的两个窗口也是在这里作为调用的入口。
那么想要去除掉第一个和第三个就不能只是简单地nop或者jmp了。选择采用另外编写一段汇编代码来指定什么时候才会执行该语句,从而控制程序流程的执行。 选取0x445E80作为控制流程的flag位。
再找一块空闲的text地址,在其上写入汇编代码。
选择将je这条指令进行修改,因为其是本身就是判断指令。但是要注意,因为选择的写入汇编代码位置距离该点位置属于长指令跳转,代码会偏长,将会覆盖下一条指令,所以在上面的汇编代码在编写时还需要考虑加上下一条指令的内容,以保证代码的完整性。
到此就完成了,选择保存一下。
运行exe,只出现了第二个窗口,成功。