第5章:演示版保护技术——警告窗口
将程序跑起来,多下断点,多看几遍代码流程。
程序的主流程非常的简单,两个对话框的出现也只是在 DialogBoxParamA() 中,该函数的参数:
查资料可知,第四个参数是指向对话框过程的指针,即回调函数,函数返回的消息与之对应会发生相应跳转调用相应的函数。
可以看到,下方有一个 EndDialog(),即关闭该窗口,再往后又会调用 DialogBoxParamA() ,可知又会开启一个窗口,即第二个窗口。因此不能在此处修改这个函数。
在该函数内部继续查看,下面这个函数会使用之前压入栈的回调函数作为参数:
上一个窗口出现并点击确定之后,会执行到回调函数,并调用结束窗口函数,然后调用 DialogBoxParamA() 函数再起一个窗口。
调用该函数之后,在内部再次调用 DialogBoxIndirectParamAorW(),该参数与第一个有不同:
因为他们的回调函数都是确定不变的,并且资源地址也是不变的,因此目前有两种方式跳过第一个窗口:
① 修改 DialogBoxIndirectParamAorW() 的参数
② 修改 DialogBoxParamA() 的参数
两种方法都可以绕过第一个窗口。