XP下的进程静音技术(遍历进程,遍历输入模块,遍历输入函数,找到函数并HOOK) good
很多浏览器有这种功能,实现原理都是一样。发声源基本都来自Flash,比如Flash游戏啦,视频播放器啦等等
而Flash的发声都是通过winmm.dll::waveOutWrite函数来完成,所以,我们只要能“接管”这个函数就行了
下面的代码是以前写的一个模块,针对Flash的静音,代码写的比较粗糙 ^_^
注意,下面的代码仅仅针对Flash模块进行IAT Hook
XP测试通过
- unit FlashMute;
- interface
- uses
- Windows, SysUtils, Classes, StrUtils, TlHelp32, MMSystem;
- type
- TFlashMute = class
- private
- class var Flag: Boolean;
- public
- class function Modify_waveOutWrite: Boolean;
- class procedure Enable;
- class procedure Disable;
- end;
- implementation
- function MywaveOutWrite(hWaveOut: HWAVEOUT; lpWaveOutHdr: PWaveHdr; uSize: UINT): MMRESULT; stdcall;
- begin
- if TFlashMute.Flag then
- ZeroMemory(lpWaveOutHdr.lpData, lpWaveOutHdr.dwBufferLength);
- Result := waveOutWrite(hWaveOut, lpWaveOutHdr, uSize);
- end;
- { TFlashMute }
- class procedure TFlashMute.Disable;
- begin
- TFlashMute.Flag := True;
- end;
- class procedure TFlashMute.Enable;
- begin
- TFlashMute.Flag := False;
- end;
- class function TFlashMute.Modify_waveOutWrite: Boolean;
- var
- hSnapshot: THandle;
- ME32: TModuleEntry32;
- Found: Boolean;
- BaseAddr: DWORD;
- DosHeader: PImageDosHeader;
- NtHeader: PImageNtHeaders;
- ImportDesc: PImageImportDescriptor;
- ITD, ITD2: PImageThunkData;
- IIBN: PImageImportByName;
- mbi: TMemoryBasicInformation;
- begin
- Result := False;
- // 枚举当前进程模块列表,找到Flash?.ocx
- hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, GetCurrentProcessId);
- if hSnapshot <> INVALID_HANDLE_VALUE then
- begin
- ME32.dwSize := SizeOf(TModuleEntry32);
- Found := Module32First(hSnapshot, ME32);
- while Found do
- begin
- if ContainsText(ME32.szModule, 'Flash') then
- begin
- if SameText(ExtractFileExt(ME32.szModule), '.ocx') then
- begin
- BaseAddr := DWORD(@ME32.modBaseAddr^);
- DosHeader := @ME32.modBaseAddr^;
- NtHeader := Ptr(BaseAddr + DosHeader^._lfanew);
- // 遍历输入模块
- ImportDesc := Ptr(BaseAddr + NtHeader.OptionalHeader.DataDirectory[1].VirtualAddress);
- while ImportDesc^.Name <> 0 do
- begin
- ITD := PImageThunkData(BaseAddr + ImportDesc^.OriginalFirstThunk); // 指向函数名称RVA或函数序号
- ITD2 := PImageThunkData(BaseAddr + ImportDesc^.FirstThunk); // 指向函数地址
- // 遍历输入函数
- while ITD^.AddressOfData <> 0 do
- begin
- // 按函数名方式导入的函数
- if ITD^.AddressOfData and IMAGE_ORDINAL_FLAG <> IMAGE_ORDINAL_FLAG then
- begin
- IIBN := PImageImportByName(BaseAddr + ITD^.AddressOfData);
- // 找出 winmm.dll::waveOutWrite
- if SameText(string(PAnsiChar(@IIBN^.Name[0])), 'waveOutWrite') then
- begin
- if VirtualProtect(@ITD2^._Function, SizeOf(DWORD), PAGE_EXECUTE_READWRITE, @mbi.Protect) then
- begin
- ITD2^._Function := DWORD(@MywaveOutWrite);
- Result := True;
- end;
- Break;
- end;
- end;
- Inc(ITD);
- Inc(ITD2);
- end;
- if Result then
- Break;
- Inc(ImportDesc);
- end;
- end;
- end;
- if Result then
- Break;
- Found := Module32Next(hSnapshot, ME32);
- end;
- CloseHandle(hSnapshot);
- end;
- end;
http://blog.csdn.net/aqtata/article/details/8112092
XP下的进程静音技术(遍历进程,遍历输入模块,遍历输入函数,找到函数并HOOK) good的更多相关文章
- xp 下查看进程指令
xp 下快速查看进程及关联 exe 的指令,刚发现,还没有测试 win7 和 win10 支持不支持. wmic process where creationclassname="win32 ...
- Android中通过进程注入技术改动广播接收器的优先级
前言 这个周末又没有吊事,在家研究了怎样通过进程的注入技术改动广播接收器的优先级.关于这个应用场景是非常多的.并且也非常重要.所以就非常急的去fixed了. Android中的四大组件中有一个广播:B ...
- Android中通过进程注入技术修改广播接收器的优先级
前言 这个周末又没有吊事,在家研究了如何通过进程的注入技术修改广播接收器的优先级,关于这个应用场景是很多的,而且也很重要,所以就很急的去fixed了. Android中的四大组件中有一个广播:Broa ...
- delphi中获得进程列表或想要的进程(枚举进程、遍历进程)
一个常见的编程任务是枚举所有运行的"应用程序".Windows 任务管理器就是一个很好的例子.它用两种方式列出"应用程序".任务管理器的第一个选项卡列出桌面上的 ...
- Android中通过进程注入技术修改系统返回的Mac地址
致谢 感谢看雪论坛中的这位大神,分享了这个技术:http://bbs.pediy.com/showthread.php?t=186054,从这篇文章中学习到了很多内容,如果没有这篇好文章,我在研究的过 ...
- 遍历进程活动链表(ActiveProcessLinks)、DKOM隐藏进程
1.EPROCESS结构体 EPROCESS块来表示.EPROCESS块中不仅包含了进程相关了很多信息,还有很多指向其他相关结构数据结构的指针.例如每一个进程里面都至少有一个ETHREAD块表示的线程 ...
- 利用NtQuerySystemInformation函数遍历进程,遍历线程,获取线程挂起或运行状态
版权声明:专注于计算机网络安全学习 https://blog.csdn.net/u011672712/article/details/51586030 1 2 3 4 5 6 7 8 9 10 11 ...
- Python编程-多道技术和进程
一.多道技术 1.多路复用 操作系统主要使用来 记录哪个程序使用什么资源 对资源请求进行分配 为不同的程序和用户调解互相冲突的资源请求. 我们可将上述操作系统的功能总结为: 处理来自多个程序发起的多个 ...
- Windows提高_1.2遍历进程、遍历模块
进程 什么是进程? 通俗的来讲,进程就是一个运行中的程序,最少包含一个虚拟空间,通常是 4 GB大小,一组提供数据和代码的模块,通产是 dll 和 exe 文件,一个进程内核对象和最少一个线程. 进程 ...
随机推荐
- 提高mysql查询效率的六种方法
1,表设计一定要优化,冗余数据最少,少用连接查询.如果在实际应用中,使用了极其复杂的连接,子查询,则数据表的设计得要重新考虑了. 2,尽量用char而不是varchar,因为固定长度得string用起 ...
- Debian为程序添加一个开始菜单,debian添加sublime开始菜单.
下了一个 '绿色' 的程序,想要加到开始菜单里面. 怎么做呢? 我这里以sublime2做例 去http://www.sublimetext.com/2 下载了linux 64位, 解压放到了下面的文 ...
- C--全排列的实现(递归方法) 傻子也能看懂的
假设数组含有n个元素,则提取数组中的每一个元素做一次头元素,然后全排列除数组中除第一个元素之外的所有元素,这样就达到了对数组中所有元素进行全排列的得目的.[这句话才是重点!] 比如 1,2,3.的 ...
- 转:Android -- ActivityLifeCycleCallbacks
http://www.cnblogs.com/yydcdut/p/4945990.html 一个不常见类的使用,名字叫ActivityLifeCycleCallbacks 通常一个项目中有很多个act ...
- Spring Thread Pool 线程池的应用
Spring and Java Thread example 扫扫关注"茶爸爸"微信公众号 坚持最初的执着,从不曾有半点懈怠,为优秀而努力,为证明自己而活. Download it ...
- 调试出不来 断点不起作用 调试技巧 MyEclipse进不了调试
1:今天遇到了web项目调试总是不起作用,后来经人指点才知,当调试的断点仅仅是一个小圆圈时断点是不起作用的,这是可以重启下tomcat服务器再重新访问断点才会起作用,这是你会发现断点的小圆点左下角有个 ...
- Linux进程阻塞的相关知识
1.如果驱动程序无法立即满足要求,该如何响应? 当数据不可用时,用户可能调用read:或者进程试图写入数据,但因为输出缓冲区已满,设备还未准备好接受数据.调用进程通常不会关心这类问题,程序员只会简单调 ...
- Hough变换在opencv中的应用
霍夫曼变换(Hough Transform)的原理 霍夫曼变换是一种可以检测出某种特殊形状的算法,OpenCV中用霍夫曼变换来检测出图像中的直线.椭圆和其他几何图形.由它改进的算法,可以用来检测任何形 ...
- php导出excel数据
提供两种导出excel方法 1 最简单的导出excel header('Content-Type: application/vnd.ms-excel'); //设置文件类型 也可以将 vnd.ms ...
- STM32学习之路-LCD(3)<显示图片>
祝大家端午和六一快乐!原本今天是想歇息歇息的,可是实在无奈没什么事干.所以就来学习学习LCD显示图片的函数 函数是照搬奋斗的样例,算是些笔记吧.只是奋斗的样例凝视的不是非常具体.今天去看了正点原子的论 ...