第五章——演示版保护技术-去除警告窗口实例

   去除警告窗口意为将广告弹窗去除,去除的思路归根结底是:在不影响主程序的条件下,查找到警告窗口创建的位置将其跳过或者nop掉,显示窗口的函数主要有Messagebox、DialogBoxPara、ShowWindow、CreateWindowEx。还有一种去除的方式是通过消息断点的方式准根溯源到窗口创建的代码。
 
这里的实例是加密解密书上的实例程序,演示为了熟悉整个操作的思路和流程
源程序:
 
演示程序是一个调用了DialogBoxParamA函数来显示资源中的对话框
我们可以用eXeScope打开它,查找其对应的资源ID:

我们发现资源ID为121, 对应十六进制0x79. 根据这点打开W32Dasm去查看资源ID为0x79的汇编代码:

我们也是确实调用了DialogBoxParamA,但是这里不能简单的将DialogBoxParamA去除,因为DialogBoxParamA一般会和EndDialog配合使用,前者打开对话框,后者关闭对话框
函数原型:
int DialogBoxParam(
      HINSTANCE     hInstance,                        //句柄
      LPCTSTR           lpTemplateName,           //对话框ID
     HWND               hWndParent,                  //父窗口句柄
      DLGPROC         lpDialogFunc,                 //对话框处理函数指针
      PARAM             dwInitParam                  //初始化值
);
这里的最重要参数是lpDialogFunc,此参数制定了窗口回调的具体代码位置,在IDA中具体代码如下:
这里发现,调用主程序也是调用的DialogBoxParamA,并且窗口的ID为0x65,跟踪到这里我们总结出了两种修改方式:
  • 将0x00401051处代码push 0 修改为 Jmp 0X4010E5,直接定位到主程序执行位置,在OD中修改如下
  • 第二种方式,将警告框的代码修改为主程序的代码内容,修改回调函数地址和资源ID即可
    如果遇到对话框不是资源,也无法用三种断点断下,则可以尝试消息断点 WM_LBUTTONUP等等

猜你喜欢

转载自www.cnblogs.com/Tempt/p/10119704.html