令人崩溃抓狂的错误,怎么才能抓到它?
阿呆_ 2010-12-21 02:07:42 为公司项目写了一个加壳工具,加壳后的程序使用自我调试的方法实现运行时动态加密解密代码页。
壳的思路也很简单:
当加壳后的程序运行时首先解密壳代码的IAT表和真正壳入口地址然后跳转到壳入口继续执行, 壳入口处判断用户权限, 如果是非Administrator, 则判断是否正被调试器调试, 如果是则随机跳到任意内存地址执行(引起程序或系统崩溃), 否则用CreateProcess启动自身另一副本并调试执行它, 并在需要的时候动态解密/加密副本进程中的代码块。
如果是Administrator权限, 则判断当前系统是32位还是64位, 根据不同系统解密/解压壳中保存的32位或64位exe程序并保存到当前目录下一个临时文件中并运行它然后等待。 这个exe的功能非常简单, 它列出当前session中已经运行并且可以被访问的相应32位或64位进程, 然后随机挑选一个进程打开, 解密/解压/重定向exe中保存的调试器代码到目的进程空间, 然后创建一个远程线程并退出。 退出后exe文件会由主程序删除。 而远程线程的32位或64位代码则开始调试主程序,并在需要的时候动态加密/解密主程序代码块。
加壳基本上可以说成功了, 用debug版的壳代码加壳的程序运行非常流畅, 不管是普通win32程序还是service程序都没有错误, 如果用的是release版的壳代码, 对service程序加壳后在64bit win7下会出现非常令人抓狂的错误, 即第一次运行成功, stop后再start则超时失败, 如果再start又成功, 再次stop->start又失败,... , 测试几十次后发现加壳后的service程序非常精确地呈现50%成功率, 而且是第1,3,5,7...次启动肯定成功,第2,4,6,8...次启动必然失败。
为了找到哪里出现问题我在壳代码中加入了log功能, 输出一些关键信息到c:\logs\下的某个文件中, 再次编译后发觉不管加壳哪种程序, 运行就没失败过, 次次成功。 而一旦移去log代码后release版壳代码加壳后的service程序又呈现那种精确的50%成功率。
崩溃...
到底该如何找到这个该死的错误? 跪求思路...