很多浏览器有这种功能,实现原理都是一样。发声源基本都来自Flash,比如Flash游戏啦,视频播放器啦等等

而Flash的发声都是通过winmm.dll::waveOutWrite函数来完成,所以,我们只要能“接管”这个函数就行了

下面的代码是以前写的一个模块,针对Flash的静音,代码写的比较粗糙 ^_^

注意,下面的代码仅仅针对Flash模块进行IAT Hook

XP测试通过

  1. unit FlashMute;
  2. interface
  3. uses
  4. Windows, SysUtils, Classes, StrUtils, TlHelp32, MMSystem;
  5. type
  6. TFlashMute = class
  7. private
  8. class var Flag: Boolean;
  9. public
  10. class function Modify_waveOutWrite: Boolean;
  11. class procedure Enable;
  12. class procedure Disable;
  13. end;
  14. implementation
  15. function MywaveOutWrite(hWaveOut: HWAVEOUT; lpWaveOutHdr: PWaveHdr; uSize: UINT): MMRESULT; stdcall;
  16. begin
  17. if TFlashMute.Flag then
  18. ZeroMemory(lpWaveOutHdr.lpData, lpWaveOutHdr.dwBufferLength);
  19. Result := waveOutWrite(hWaveOut, lpWaveOutHdr, uSize);
  20. end;
  21. { TFlashMute }
  22. class procedure TFlashMute.Disable;
  23. begin
  24. TFlashMute.Flag := True;
  25. end;
  26. class procedure TFlashMute.Enable;
  27. begin
  28. TFlashMute.Flag := False;
  29. end;
  30. class function TFlashMute.Modify_waveOutWrite: Boolean;
  31. var
  32. hSnapshot: THandle;
  33. ME32: TModuleEntry32;
  34. Found: Boolean;
  35. BaseAddr: DWORD;
  36. DosHeader: PImageDosHeader;
  37. NtHeader: PImageNtHeaders;
  38. ImportDesc: PImageImportDescriptor;
  39. ITD, ITD2: PImageThunkData;
  40. IIBN: PImageImportByName;
  41. mbi: TMemoryBasicInformation;
  42. begin
  43. Result := False;
  44. // 枚举当前进程模块列表,找到Flash?.ocx
  45. hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, GetCurrentProcessId);
  46. if hSnapshot <> INVALID_HANDLE_VALUE then
  47. begin
  48. ME32.dwSize := SizeOf(TModuleEntry32);
  49. Found := Module32First(hSnapshot, ME32);
  50. while Found do
  51. begin
  52. if ContainsText(ME32.szModule, 'Flash') then
  53. begin
  54. if SameText(ExtractFileExt(ME32.szModule), '.ocx') then
  55. begin
  56. BaseAddr := DWORD(@ME32.modBaseAddr^);
  57. DosHeader := @ME32.modBaseAddr^;
  58. NtHeader := Ptr(BaseAddr + DosHeader^._lfanew);
  59. // 遍历输入模块
  60. ImportDesc := Ptr(BaseAddr + NtHeader.OptionalHeader.DataDirectory[1].VirtualAddress);
  61. while ImportDesc^.Name <> 0 do
  62. begin
  63. ITD := PImageThunkData(BaseAddr + ImportDesc^.OriginalFirstThunk);    // 指向函数名称RVA或函数序号
  64. ITD2 := PImageThunkData(BaseAddr + ImportDesc^.FirstThunk);           // 指向函数地址
  65. // 遍历输入函数
  66. while ITD^.AddressOfData <> 0 do
  67. begin
  68. // 按函数名方式导入的函数
  69. if ITD^.AddressOfData and IMAGE_ORDINAL_FLAG <> IMAGE_ORDINAL_FLAG then
  70. begin
  71. IIBN := PImageImportByName(BaseAddr + ITD^.AddressOfData);
  72. // 找出 winmm.dll::waveOutWrite
  73. if SameText(string(PAnsiChar(@IIBN^.Name[0])), 'waveOutWrite') then
  74. begin
  75. if VirtualProtect(@ITD2^._Function, SizeOf(DWORD), PAGE_EXECUTE_READWRITE, @mbi.Protect) then
  76. begin
  77. ITD2^._Function := DWORD(@MywaveOutWrite);
  78. Result := True;
  79. end;
  80. Break;
  81. end;
  82. end;
  83. Inc(ITD);
  84. Inc(ITD2);
  85. end;
  86. if Result then
  87. Break;
  88. Inc(ImportDesc);
  89. end;
  90. end;
  91. end;
  92. if Result then
  93. Break;
  94. Found := Module32Next(hSnapshot, ME32);
  95. end;
  96. CloseHandle(hSnapshot);
  97. end;
  98. end;

http://blog.csdn.net/aqtata/article/details/8112092

XP下的进程静音技术(遍历进程,遍历输入模块,遍历输入函数,找到函数并HOOK) good的更多相关文章

  1. xp 下查看进程指令

    xp 下快速查看进程及关联 exe 的指令,刚发现,还没有测试 win7 和 win10 支持不支持. wmic process where creationclassname="win32 ...

  2. Android中通过进程注入技术改动广播接收器的优先级

    前言 这个周末又没有吊事,在家研究了怎样通过进程的注入技术改动广播接收器的优先级.关于这个应用场景是非常多的.并且也非常重要.所以就非常急的去fixed了. Android中的四大组件中有一个广播:B ...

  3. Android中通过进程注入技术修改广播接收器的优先级

    前言 这个周末又没有吊事,在家研究了如何通过进程的注入技术修改广播接收器的优先级,关于这个应用场景是很多的,而且也很重要,所以就很急的去fixed了. Android中的四大组件中有一个广播:Broa ...

  4. delphi中获得进程列表或想要的进程(枚举进程、遍历进程)

    一个常见的编程任务是枚举所有运行的"应用程序".Windows 任务管理器就是一个很好的例子.它用两种方式列出"应用程序".任务管理器的第一个选项卡列出桌面上的 ...

  5. Android中通过进程注入技术修改系统返回的Mac地址

    致谢 感谢看雪论坛中的这位大神,分享了这个技术:http://bbs.pediy.com/showthread.php?t=186054,从这篇文章中学习到了很多内容,如果没有这篇好文章,我在研究的过 ...

  6. 遍历进程活动链表(ActiveProcessLinks)、DKOM隐藏进程

    1.EPROCESS结构体 EPROCESS块来表示.EPROCESS块中不仅包含了进程相关了很多信息,还有很多指向其他相关结构数据结构的指针.例如每一个进程里面都至少有一个ETHREAD块表示的线程 ...

  7. 利用NtQuerySystemInformation函数遍历进程,遍历线程,获取线程挂起或运行状态

    版权声明:专注于计算机网络安全学习 https://blog.csdn.net/u011672712/article/details/51586030 1 2 3 4 5 6 7 8 9 10 11 ...

  8. Python编程-多道技术和进程

    一.多道技术 1.多路复用 操作系统主要使用来 记录哪个程序使用什么资源 对资源请求进行分配 为不同的程序和用户调解互相冲突的资源请求. 我们可将上述操作系统的功能总结为: 处理来自多个程序发起的多个 ...

  9. Windows提高_1.2遍历进程、遍历模块

    进程 什么是进程? 通俗的来讲,进程就是一个运行中的程序,最少包含一个虚拟空间,通常是 4 GB大小,一组提供数据和代码的模块,通产是 dll 和 exe 文件,一个进程内核对象和最少一个线程. 进程 ...

随机推荐

  1. OGR SQL

    The OGRDataSource supports executing commands against a datasource via the OGRDataSource::ExecuteSQL ...

  2. Sql 增加字段(有些只能在ORACLE中运行)

    增加字段 alter table table_name add column_name varchar(200) 删除字段 ALTER TABLE table_NAME DROP COLUMN col ...

  3. Selenium Grid跨浏览器-兼容性测试

    Selenium Grid跨浏览器-兼容性测试 这里有两台机子,打算这样演示: 一台机子启动一个作为主点节的hub 和 一个作为次节点的hub(系统windows 浏览器为ie) ip为:192.16 ...

  4. C#反射 入门学习 01

    前言     获取方法的相关信息的两种形式 反射是一种允许用户获得类信息的C#功能,Type对象映射它代表的底层对象: 在.Net 中, 一旦获得了Type对象,就可以使用GetMethods()方法 ...

  5. Home键的获取监听,安卓4.0后就不能在onkeydown方法中获取了。怎么办。

    Android下得到Home键按下的消息   在Android下,并不能通过onKeyDown这样的事件来截获Home键的消息,其原因在Android的文档中已经明确的说过了 public stati ...

  6. 获取浏览器版本Asp.Net

    public static string GetBrowser() { HttpBrowserCapabilities bc = HttpContext.Current.Request.Browser ...

  7. cocos2d-x on wp8架构简单介绍

    1,基于C++的开发架构 支持3大移动平台以及3大桌面平台. 分为图形,声音,物理3大模块,另外还有脚本的导出. 在wp8/win32上的图形是基于d3d的,而在其它平台是基于opengl/openg ...

  8. TImage也有OnClick事件,可以当按钮使用,配上合适的图片(背景透明,效果前凸)更是几乎以假乱真

    本质上TImage与TSpeedButton没有什么区别,都是没有句柄的,但都可以执行OnClick事件.有空分析一下.

  9. premake在Ubuntu和GCC环境下创建简单的C++工程

    由于premake基于lua脚本,为了方便编辑lua脚本,我在emacs24中利用package system安装了lua-mode. 然后创建config.lua文件,填入下面这段,主要来自:htt ...

  10. Solr4.2迁移到新项目下异常:java.lang.NoSuchMethodError: org.apache.http.conn.scheme.Scheme.<init>

    由于业务调整,需要将solr搜索项目集成到另一个项目下成为一个模块,原项目运行异常,但是迁移到新项目后出现异常如下: 原因:引入的httpclient.jar冲突 解决方法:删除冲突的jar