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

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

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

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

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

XP测试通过

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

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

原文地址:https://www.cnblogs.com/findumars/p/5277531.html