Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 29.04.2010, 18:16
kleop kleop вне форума
Прохожий
 
Регистрация: 12.03.2010
Сообщения: 2
Репутация: 10
По умолчанию Skype & DirectSoundCreate проблема сплайсинг

Собственно проблема....
Насколько знаю скайп работает через DirectSound c 3 версии. Пытаюсь перехватить событие DirectSoundCreate и DirectSoundCreate8 для дальнейшего захвата звука методом сплайсинга.
Насколько известно DirectSoundCreate выполняется при старте скайпа, соотвественно хук должен быть поставлен до загрузки скайпа.
Хук ставлю через
Код:
SetWindowsHookEx(WH_GETMESSAGE, p, h, 0);
(может в этом проблема, ставить он позже чем вызываеться DirectSoundCreate, но врядли так как на момент загрузки длл dsound ещё неподключен.)
пробовал с других программ захватывать waveout, всё гуд, а директикс никак нейдёт.

Потом в длл'ке

в зоне
Код:
initialization
begin
  // сравниваем идентификатор процесса, в который нас загрузили,
  // с идентификатором skype.exe
  if GetModuleHandle(nil)=GetModuleHandle('Skype.exe') then
  begin
    IsSmth:=false;
    CreateThread(nil, 0, @WorkWithSkype, pointer(12345), 0, thID);
  end;
end;

процедура WorkWithSkype
Код:
procedure WorkWithSkype(thrVar: integer) ;
begin
  AssignFile(f,'Log.txt'); 
  {$I-}
  Append(f);
  {$I-}
  if IOResult<>0 then 
  begin
    MessageBox(0,'Ошибка создания файла Log.txt','Skype',MB_OK);
  end;
  WriteLn(f,'We are in skype!'+inttostr(GetModuleHandle(nil))+' - '+inttostr(GetModuleHandle('Skype.exe'))); // запись в файл строки с символами перевода строки
  // replace api functions
  InterceptFunctions;
  OwThr:=true;
  CloseFile(f); // закрыть файл
end;

собственно функция сплайсинга InterceptFunctions
Код:
//подмененые функции
function HDirectSoundCreate(lpGuid: PGUID; out ppDS: IDirectSound; pUnkOuter: IUnknown): HResult; stdcall;
begin
    AssignFile(f,'D:\Work\Other\Delphi\NetWork\simkl tray\mp3Save\Log.txt'); // привязка названия к переменной
    {$I-}
    Append(f); // создать новый файл
    {$I-}
    if IOResult<>0 then // если ошибка открытия (напр. файла нет)
    begin
      MessageBox(0,'Ошибка создания файла Log.txt','Skype',MB_OK);
    end;
    WriteLn(f,'DirectFSoundCreate hooked'); // запись в файл строки с символами перевода строки
    CloseFile(f); // закрыть файл
    Result:=0;
end;

function HDirectSoundCreate8(pcGuidDevice: PGUID; out ppDS8: IDirectSound8; pUnkOuter: IUnknown): HResult; stdcall;
begin
    AssignFile(f,'D:\Work\Other\Delphi\NetWork\simkl tray\mp3Save\Log.txt'); // привязка названия к переменной
    {$I-}
    Append(f); // создать новый файл
    {$I-}
    if IOResult<>0 then // если ошибка открытия (напр. файла нет)
    begin
      MessageBox(0,'Ошибка создания файла Log.txt','Skype',MB_OK);
    end;
    WriteLn(f,'DirectFSoundCreate8 hooked'); // запись в файл строки с символами перевода строки просто чтобы убедится что мы тут были.
    CloseFile(f); // закрыть файл
    Result:=0;
end;

procedure InterceptFunctions;
var modul:HMODULE;
begin
  modul:=GetModuleHandle('dsound.dll');
  if (modul=0) then modul:=LoadLibrary('dsound.dll');
  DAuOut:=GetProcAddress(modul,'DirectSoundCreate');
  DAuOut8:=GetProcAddress(modul,'DirectSoundCreate8');

  if (DAuOut=nil)
  then Writeln(f,'DirectSoundCreate in dsound.dll was not found')
  else Writeln(f,'DirectSoundCreate in dsound.dll was found');
  if (DAuOut8=nil)
  then Writeln(f,'DirectSoundCreate8 in dsound.dll was not found')
  else Writeln(f,'DirectSoundCreate8 in dsound.dll was found');

  // replace directx
  jump.instr_push := $68; //push
  jump.instr_ret := $C3; // ret

  //replace Direct Sound with out buf
  if (DAuOut<>nil) then
  begin
    IsSmth:=true;
  //replace DirectSoundCreate function
    jump.arg := @HDirectSoundCreate;
    ReadProcessMemory(GetCurrentProcess(),DAuOut,@Dold, sizeof(OldCode),Writen);
    Writeln(f,'DAuOut read: '+inttostr(Writen));
    WriteProcessMemory(GetCurrentProcess(), DAuOut, @jump, sizeof(jmp_far), Writen);
    Writeln(f,'DAuOut write: '+inttostr(Writen));

  end;

  if (DAuOut8<>nil) then
  begin
    IsSmth:=true;
  //replace DirectSoundCreate8 function
    jump.arg := @HDirectSoundCreate8;
    ReadProcessMemory(GetCurrentProcess(),DAuOut8,@Dold8, sizeof(OldCode),Writen);
    Writeln(f,'DAuOut8 read: '+inttostr(Writen));
    WriteProcessMemory(GetCurrentProcess(), DAuOut8, @jump, sizeof(jmp_far), Writen);
    Writeln(f,'DAuOut8 write: '+inttostr(Writen));
  end;
end;

записи
Код:
  type
  jmp_far = packed record
    instr_push : BYTE;  //здесь будет код инструкции push
    arg : Pointer;         //аргумент push
    instr_ret : BYTE;    //здесь будет код инструкции ret
  end;
  OldCode = packed record
  One: dword;
  two: word;
 end;

собственно где грабли то?,.....
в файле получаю
We are in skype!4194304 - 4194304
DirectSoundCreate in dsound.dll was found
DirectSoundCreate8 in dsound.dll was found
DAuOut read: 6
DAuOut write: 6
DAuOut8 read: 6
DAuOut8 write: 6

а событие захвата так и непроиходит.... Уже второй день голову ломаю где неправ,..
помогите кто чем сможет
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:57.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter