我所遇见的bug 系列1 win7在生成的程序里,播放音频时没声音

1 知识背景,需要具备基本的C/C++编程功能,能阅读c/++项目工程,了解注入的过程 ,了解基本的安全编程

2 需要的东东 注入的驱动及的程序,以及需要注入的dll

3 相关的工具 windbg win7x64虚拟机 pchunter64.exe procxp.exe

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库。 注入过程可参考 http://bbs.pediy.com/thread-208082.htm ,总得来说就是在目标进程中申请一块空间,放自定义的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. 好像是数字签名有关系,要关个什么标志,现在还不清楚。

总结:问题总是负责的,一个表面现象像是露出水面的冰山。解决问题应该是有个思维链的,指导你最终找到根本原因,而不是总是去解决表面问题。

  

  

时间: 2024-12-06 17:54:46

我所遇见的bug 系列1 win7在生成的程序里,播放音频时没声音的相关文章

算法系列之二十三:离散傅立叶变换之音频播放与频谱显示

算法系列之二十三:离散傅立叶变换之音频播放与频谱显示 算法系列之二十三离散傅立叶变换之音频播放与频谱显示 导语 什么是频谱 1 频谱的原理 2 频谱的选择 3 频谱的计算 显示动态频谱 1 实现方法 2 杂项说明 结果展示 导语 频谱和均衡器,几乎是媒体播放程序的必备物件,没有这两个功能的媒体播放程序会被认为不够专业,现在主流的播放器都具备这两个功能,foobar 2000的十八段均衡器就曾经让很多人着迷.在上一篇对离散傅立叶变换介绍的基础上,本篇就进一步介绍一下频谱是怎么回事儿,下一篇继续介绍

win8/win7中使用Git Extensions PuTTy模式提交时 git-credential-winstore.exe": No such file or directory 错误解决方案

参考:http://www.cnblogs.com/hlizard/p/3627792.html 报错类似以下错误 \"F:/GitExtensions/GitCredentialWinStore/git-credential-winstore.exe\" get: "F:/GitExtensions/GitCredentialWinStore/git-credential-winstore.exe": No such file or directory 解决方案

posix 线程(一):线程模型、pthread 系列函数 和 简单多线程服务器端程序

posix 线程(一):线程模型.pthread 系列函数 和 简单多线程服务器端程序 一.线程有3种模型,分别是N:1用户线程模型,1:1核心线程模型和N:M混合线程模型,posix thread属于1:1模型. (一).N:1用户线程模型 “线程实现”建立在“进程控制”机制之上,由用户空间的程序库来管理.OS内核完全不知道线程信息.这些线程称为用户空间线程.这些线程都工作在“进 程竞争范围”(process contention scope):各个线程在同一进程竞争“被调度的CPU时间”(但

MyBatis系列二 之 数据库列名于程序实体类中字段名称不一致

MyBatis系列二  之   数据库列名于程序实体类中字段名称不一致 情景:当数据库中的列名与我们程序实体类中的字段名称不一致         使用ResultMap节点配置信息  在映射文件中  mapper根节点下配置ResultMap节点信息 <resultMap type="Student" id="studentMapper"> <result column="sname" property="stunam

Prism4 文档翻译系列---第4章 模块化应用程序开发

模块化应用程序是指将一个应用程序拆分成一系列的可以组合的功能单元.一个客户端模块封装了应用程序的一部分,并且通常是一系列相关的关注点.它可以包含一个相关的组件的集合,就像用户界面,应用程序功能,和一些业务逻辑,以及一些应用程序基础模块,比如应用程序级的日至服务或者用户认证.模块之间是相互独立的但是可以通过松耦合的手段进行通信.模块化的应用程序是的开发.测试.部署和扩展变得更新容易. 例如,一个个人银行应用程序,用户可以使用各种各样的功能,比如账户间汇款,支付,从个人的界面中更新个人信息等.然而,

WIN7/8系统下程序接收不到WM_COPYDATA 消息的原因和解决

在WIN7/win8,如果发送消息的程序用户权限低于和接收消息的程序,则消 息无法传递.发送程序必须等于或者等于接收程序的权限.如发送与接收 是同一个用户,或者发送是管理员帐户,接收是是普通用户,这样就可以 成功. 以下内容摘自: http://blog.csdn.net/tian_jinping/article/details/12950077 正如我们前文所说,等级的划分,是为了防止以下犯上.所以,有了用户 界面特权隔离,一个运行在较低特权等级的应用程序的行为就受到了诸多 限制,它不可以:

Windows Azure系列 -《基础篇》- 计划程序

打开Windows Azure管理门户,在左侧边栏点击设置,展开计划程序页面,我们可以看到目前的作业情况: 在计划程序中,我们可以做的就是定制特定管理作业,并查看以往作业的执行情况. 点击作业集合,然后点击创建计划程序作业,即可创建你自己的作业, 在接下来的页面选择快速创建,填写作业名称并选择区域,点击下一步 在作业页面,填写作业的相关信息,包括名称.类型.方法等 确认重复周期和启动时间即可. 接下来就可以看到作业集合的状态, 以及可以查看各作业的执行情况,通过筛选可以有选择的查看所要关注的作业

win7如何设置一个程序的快捷键(比如截图)

win7如何设置一个程序的快捷键 win7下其实不用每次都用鼠标找到一个程序图标然后双击才能启动,对于一些小工具,可以设置快捷键来快速启动,以截图工具为例: 1,找到程序图标,无论是在开始菜单中还是在桌面,无论是程序本身还是快捷方式,找到就行 2,右击图标,选择属性,会出现以下对话框: 3,点击快捷键输入框,然后按下你想设置的快捷键.默认快捷键是 ctrl+alt+“你选择的键” 4,点击确认即可 win7如何设置一个程序的快捷键(比如截图)

Win7下生成SSH Key连接Github--(MsysGit)

ls -al ~/.ssh # Lists the files in your .ssh directory, if they exist We strongly recommend using an SSH connection when interacting with GitHub. SSH keys are a way to identify trusted computers, without involving passwords. The steps below will walk