zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    AttributeError: 'DatasetV1Adapter' object has no attribute 'group_by_window'版本兼容问题解决
    Jupyter kernel管理
    AttributeError: module 'tensorflow_core._api.v2.nn' has no attribute 'rnn_cell' tensorflow版本兼容问题-解决
    在虚拟机Linux中安装VMTools遇到的问题-小结
    VuGen总结
    Controller控制器
    事物
    loadrunner参数化
    编写get和post请求
    loadrunner组成
  • 原文地址:https://www.cnblogs.com/findumars/p/5277531.html
Copyright © 2011-2022 走看看