3 问题描述 在win7x64用我们自己的工具生成的程序,启动以后打开,视频,音频,播放时没声音 ,期望是有声音的
4 bug定位,bug 相关的代码主要是两大块,一个是驱动,一个是dll. 驱动在进程创建的时候把dll注入到进程中。首先测试生成不同选项的程序,测试在什么选项下会触发这个bug,最后定位到一个和注入 功能有关,,这个注入功能有个flag标记,去掉这个flag在测试,ok . 查找整个解决方案里,那些定位用到了这个宏,排除不相关的,最后定位到一个ShouldOpenProcessBeDenied 函数,这个函数是决定是否拒绝打开这个进程,把日志打开运行,查看日志,大意是 注入 pid 0xXXX c:\windows\system32\audiodg.exd 打开 pid:0xXXX C:\Program Files (x86)\Internet Explorer\iexplorer.exe 失败,渴望权限0x00000040 ,对应PROCESS_DUP_HANDLE , 现在知道大概原因,iexplorer 在保护桌面里,外部的audiodg.exe 要打开iexplorer.exe ,需要一个PROCESS_DUP_HANDLE的权限。而这个权限在被驱动中被移除了
然后因为有注入OpenProcess NtOpenProcess NtAlpcOpenSenderProcess,需要看一下audiodg 打开ie时候,走了那个分支,返回的错误是多少,重新对ShouldOpenProcessBeDenied函数下断点,运行,中断后查看堆栈,然后看到外层栈有调用openProcess,而且发现这个函数没有被hook,用的是原始的ntdll中的函数。
现在问题是这个函数为什么没有hook上。
是注入的问题还是dll的问题(注入后移除了),用procxp 扫描audiodg.exe 看不到模块,接着用pchunter扫描,看到模块都是微软自己的模块,并没有注入的模块。安装公司其他产品,其中有一款看到有注入的dll库。(不好意思,不愿透露公司的东西,略)
到底哪里有问题,在dll中添加断点,杀掉audiodg.exe,win+r +audiodg.exe,断下来,发现注入后背卸载了。调用了LdrUnloadDll ,上层函数FreeLibary , Hook FreeLibary ,定义个全局变量,检查到调用这个模块的程序若是audiodg.exe ,并且是要卸载的模块是xx.dll的话,返回真。额,没调用。强制结束,看样子这样不行。试试,LdrUnloadDll,重启,还是不行,太多了,都走不动。
然后把这个dll改成另外一个注入的dll名,重启后,发现注入了。要是当时能反过来测试一下,就更好了,后来反过来测的结果是仍然不能注入。看来驱动注入的时候有问题。 InjectLibary入口处添加代码 若有程序名中包含audiodg.exe ,就中断下载,表示要往这个audiodg.exe 中注入dll库。 注入过程可参考 ,总得来说就是在目标进程中申请一块空间,放自定义的NtTestAlert的代码shellcode , 用来hook NTDLL中的NtTestAlert代码,自定义的NtTestAlert 通过自定义函数注入函数调用LdrLoadDll 加载dll.
代码成功注入后,需要切进程,先通过.process 0 0 ,查找到目标进程的EPROCESS , 然后通过!process /i /p EPROCESS 值,回车后提示按g,运行,在次停在后,加载符号,hook NtTestAlert就可以调试了
调试到NtLoadDll函数,发现调用失败,返回值0xC0000428 , STATUS_INVALID_IMAGE_HASH means Windows cannot verify the digital signature for this file. A recent hardware or software change might have installed a file that is signed incorrectly or damaged, or that might be malicious software from an unknown source. 好像是数字签名有关系,要关个什么标志,现在还不清楚。
总结:问题总是负责的,一个表面现象像是露出水面的冰山。解决问题应该是有个思维链的,指导你最终找到根本原因,而不是总是去解决表面问题。
我所遇见的bug 系列1 win7在生成的程序里,播放音频时没声音