Собственно проблема....
Насколько знаю скайп работает через 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
а событие захвата так и непроиходит.... Уже второй день голову ломаю где неправ,..
помогите кто чем сможет
