刚刚在看软件破解教程,看到一个人说怎么怎么破解软件。然后突然想到,许多软件破解其实不用修改出flag或者找注册算法。只要对话框不出来,软件照常好用就可以了。OK,基于这个原理,试试用DLL注入插接API的方法RIP破解软件。

首先是对话框弹出机理。先写了个MFC程序,然后跑一跑,在运行中按着DoModel()一路F11下去,跟进了CWnd::CreateDialogIndirectPreamA云云的一个函数里面(名字忘记了)。然后就是一个API调用了。(__IMP__Creat…肯定是调用别的DLL的函数了)API内容看不到……我晕。编译一个Release版的出来,然后上Ollydbg。经过跟踪,确定了窗体句柄是在USER32.CreateDialogIndirectPreamAorW里面生成的。如果没有窗体句柄呢?

貌似有两种可能,一种是没事,对话框没了。一种是报错。按照试验,Readbook至少是没事情的。哈哈,这样简单多了。整理下顺序,基本就可以做RIP破解了。

首先是用OllyDbg等等软件定位USER32.CreateDialogIndirectPreamAorW(其实USER32.CreateDialogIndirectPreamA更好,如果只用这个的话比较好确定参数类型)。然后下断点,跑到软件里面触发窗口广告……然后记录对话框的模板位置,调试的任务就结束了。因为没有啥要判断的东西,这个应该说简单到顶点了。

然后写一个DLL注入程序,运行目标程序并且Suspend。然后注入DLL,挂接API。详细参看windows核心编程,现在我们假定挂接了USER32.CreateDialogIndirectPreamA。现在有了一个自主的处理函数,只要在里面判断模板是否为特定模板就好……这个是module的一个res,理论上不是动态生成的,所以位置不变。而且一个对话框一个模板,很好认不会出错。如果是特定模板就返回NULL,否则正常调用。这样程序的提示框就永远弹不出来了。

这个其实是将软件的对话框禁止技术搬到了API层去实现,由于API层代码相对稳定,通用性强,所以破解相对简单。不过也是有代价的。如果软件无法生成对话框会导致出错……这个就没戏了。而且要写注入程序(可以写个注入的模板,或者一次写好可以多次用……),毕竟不是直接运行程序,使用不大方便。而且速度会受影响,如果程序里面对话框满天飞的话……