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 文件,一个进程内核对象和最少一个线程. 进程 ...
随机推荐
- CCIE路由实验(2) -- BGP选路原则
BGP路径属性分为4类: 公认必遵(Well-Known Mandatory):BGP更新报文中必须包含的,且必须被所有BGP厂商实现所能识别的,包括ORIGIN,AS-PATH和Next_Hop 1 ...
- mongoose 数据库操作 - 分页
使用mongoose 加入分页方法,临时还没发现什么更好的方法,我使用的方法是,直接在源代码中加入 找到 node_modules/mongoose/lib/model.js打开这个文件.里面加入这段 ...
- java--从控制台读入一些数据
学一些东西应该,学以致用: 现在我开始使用流的办法从控制台读取数据 import java.io.*; public class Demo2{ public static void main(Stri ...
- gethostbyname() -- 用域名或主机名获取IP地址
#include <netdb.h> #include <sys/socket.h> struct hostent *gethostbyname(const char * ...
- Starting the application on Mac does not work(拷贝platforms到不同的位置,才能解决问题),还可设置DYLD_PRINT_LIBRARIES=1 观察动态库
In some rare cases it can happen that the application does not launch and there is no reaction after ...
- android handler looper thread
在线程中调用包含创建handler方法的时候,会报错,提示: “need call Looper.prepare()” -- 在创建之前,调用Looper.prepare()方法来创建一个looper ...
- 仿StackOverflow开发在线问答系统
仿StackOverflow开发在线问答系统 [第二期11月9日开课]使用Python Flask Web开发框架实现一套类似StackOverflow的在线问答平台LouQA,具备提问,回答,评论点 ...
- 基于visual Studio2013解决C语言竞赛题之0805成绩输出
题目
- CEOI2014 day1 task3 Question
题目 传送门. 算法 以下描述都举这个例子:\(x\)是\(11\),\(y\)是\(5\). 算法1 把\(x\)和\(y\)化成二进制,最多\(10\)位,那么\(x=1011_2\),\(y=0 ...
- MySQL如何查询LINESTRING数据
我有一个提交的命名crm_geo_org,具有以下结构 ipoid INTEGER 11 NOT NULL PRIMARY KEY beginip INTEGER 14 NOT NULL UNSIGN ...