|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Skype & DirectSoundCreate проблема сплайсинг
Собственно проблема....
Насколько знаю скайп работает через DirectSound c 3 версии. Пытаюсь перехватить событие DirectSoundCreate и DirectSoundCreate8 для дальнейшего захвата звука методом сплайсинга. Насколько известно DirectSoundCreate выполняется при старте скайпа, соотвественно хук должен быть поставлен до загрузки скайпа. Хук ставлю через Код:
SetWindowsHookEx(WH_GETMESSAGE, p, h, 0); пробовал с других программ захватывать 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 а событие захвата так и непроиходит.... Уже второй день голову ломаю где неправ,.. помогите кто чем сможет |