【Delphi】XP下的进程静音技术

来源:互联网 发布:张艺兴团宠 知乎 编辑:程序博客网 时间:2024/05/20 18:45

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

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

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

 

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

XP测试通过

unit FlashMute;interfaceuses  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;implementationfunction 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;


 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 欠钱的确还不起怎么办 生完孩孑后手发账握不死手怎么办 工作调动没啥消息怎么办 裁剪刀老是推歪怎么办 衣服上粘胶水了怎么办 衣服钻掉了有胶怎么办 衣服上贴纸掉了怎么办 裤子沾上502胶水怎么办 衣服上沾泡沫胶怎么办 衣服上面滴上502怎么办 502胶水弄衣服上怎么办 裤子上粘了胶怎么办 胶水滴在衣服上怎么办 衣服上有502胶水怎么办 衣服上面粘了胶怎么办 衣服上的胶干了怎么办 凌晨4点到火车站怎么办 运管罚款没钱交怎么办 郑州地铁票没买怎么办 遇到吸毒者拦路威胁要钱怎么办 开车遇见拦路要钱的怎么办 高速上有人拦车怎么办 马路上有人拦车怎么办 苹果手机下截软件要钱怎么办 孩子在学校问同学要钱怎么办 在学校被同学要钱怎么办 把人家店砸了要怎么办 外汇出金不到账怎么办 把罚款单弄丢了怎么办 在12306买不到下铺怎么办有 地铁票买反了怎么办 香港买错特惠票怎么办 到达迪拜t3 后怎么办 海藻面膜调多了怎么办 被鸡爪子抓伤了怎么办 被鸡抓伤肿了怎么办 护士电子化没有激活码怎么办 窗帘盒螺丝掉了怎么办 窗帘的环扣掉了怎么办 门式起重吊装行车脱轨怎么办 在日本丢了东西怎么办