Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.04.2010, 18:22   #1
kleop
 
Регистрация: 12.03.2010
Сообщений: 9
По умолчанию 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

а событие захвата так и непроиходит.... Уже второй день голову ломаю где неправ,..
помогите кто чем сможет
kleop вне форума Ответить с цитированием
Старый 29.04.2010, 21:01   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

После крооспостинга (4 ТЕМЫ!!!) читать даже не хочется то что тут вы написали
BOBAH13 вне форума Ответить с цитированием
Старый 29.04.2010, 22:14   #3
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...а мне непонятна цель захвата потока/
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 29.04.2010, 22:46   #4
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

1.
Код:
{$I-}
    Append(f); // создать новый файл
    {$I-}
Интересный метод отключения ошибок {$I+} надо заканчивать.

2. InterceptFunctions находится в .dll файле, который был загружен и которых хранит функцию обработчика WH_GETMESSAGE хука ? (иначе .dll файл будет выгружен из памяти (только вашего процесса, без глобального хука)). Вообщем ладно, объяснять долго технику, надеюсь вы в курсе как API функции перехватывать надо, если есть сомнения по данному поводу прошу уточнить в последующем вопросе, иначе будем биться без толку.

3. Вижу это
Код:
// replace directx
  jump.instr_push := $68; //push
  jump.instr_ret := $C3; // ret
Сразу возникает вопрос, в памяти выходит следующее
Код:
push 00000000h
ret
Собственно Вы в курсе что есть push ? может вам нужен был не push, а call ? замените push на call (ну найдите оп код). Т.е. передадим управление процессора в процедуру по указанному адресу.

4. Не понял, вы что решили монополию устроить в DirectSound API на целевой машине ? Почему не вызываете старый обработчик в вашей функции-хуке (HDirectSoundCreate, HDirectSoundCreate8). Надо в теле процедуры перехватчике вызывать код по оригинальному адресу.

Вообщем есть над чем подумать. Ждем ответа и комментариев.
BOBAH13 вне форума Ответить с цитированием
Старый 30.04.2010, 00:09   #5
kleop
 
Регистрация: 12.03.2010
Сообщений: 9
По умолчанию

1. Виноват, провтыкал но оно на решение не влияет
2. да, описал выше что всё что ниже то в дллке. Да, вкурсе как перехвачивать , и да, вкурсе когда выгружается дллка, У меня она загружаеться при получении getmessage и выгружается когда приложение закрывается.
3.
Емм.. jmp_far это запись, и в память она записывается по очереди,. т.е. так как была создана.
т.е. сначала пишется
Цитата:
jump.instr_push
потом
Цитата:
jump.arg
потом
Цитата:
jump.instr_ret
запись сооствественно происходит в
Цитата:
WriteProcessMemory
и вот запись
Цитата:
jmp_far = packed record
instr_push : BYTE; //здесь будет код инструкции push
arg : Pointer; //аргумент push
instr_ret : BYTE; //здесь будет код инструкции ret
end;
поэтому здесь всё правильно

4. (HDirectSoundCreate, HDirectSoundCreate8). это просто для теста,.. там будет вызываться оригинальный обработчик, но мне хотябы увидеть до та функция вызываеться,... Т.е. смысл писать всю функцию если не уверен что она вызовется... Т.е. тестовая программа.

А вообщем система кажись рабочая., просто скайп такой умный что на windwdows 7 вроде решил выводить звук не через directsound а через WASAPI,, директикс был на windows XP.. соотвественно я неперепроверив страдал фигней 2 дня..... А так спасибо за ответ, если есть пожелания то рад буду выслучать))
kleop вне форума Ответить с цитированием
Старый 30.04.2010, 00:17   #6
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
3.
Емм.. jmp_far это запись, и в память она записывается по очереди,. т.е. так как была создана.
Спасибо Кэп Алееее, вчитайтесь: вы понимаете разницу между ассемблер командой push и call ? В вашем правильном варианте, вы кладете 32х разрядный адрес в стек (push address) и выпрыгиваете из функции (ret), а надо вызывать функцию по адресу (call address) и потом только выпрыгивать из функции (ret).
BOBAH13 вне форума Ответить с цитированием
Старый 30.04.2010, 01:05   #7
kleop
 
Регистрация: 12.03.2010
Сообщений: 9
По умолчанию

не ну я ж функцию заменяю а не какое-то значение,.. не смотрел но если это функцию то там должен быть call иначе этот вариант бы не работал, неправда ли?....
kleop вне форума Ответить с цитированием
Старый 30.04.2010, 09:42   #8
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Вы наверное издеваетесь. У вас в коде написано push address ret. (ваша структура). Это НЕ ВЫЗЫВАЕТ функцию перехватчик, а просто кладет в стек адрес функции перехватчика и выходит из текущей функции. Не не понятно ? Вам нужно заменить оп код push на оп код call

Цитата:
бы не работал, неправда ли?....
А сейчас мол работает все на ура ? То то я и смотрю что вы здесь спрашиваете, раз все работает.

Edit:
Ладно видимо вы не хотите читать 3е сообщение с ответом, пойдем другим путем. Ваши функции перехватчики HDirectSoundCreate и HDirectSoundCreate8 хоть раз срабатывают ?
BOBAH13 вне форума Ответить с цитированием
Старый 30.04.2010, 12:15   #9
kleop
 
Регистрация: 12.03.2010
Сообщений: 9
По умолчанию

HDirectSoundCreate8 эти не вызываются потому как программа на самом деле не вызывает их. Потом при перехвате любой другой функции(loadlibrary, coinitialize и ит.д...) всё прекрасно работает. Всё перехвачивается, и записывается лог. А теперь вопрос, как оно работает если нету команды call? да, я понимаю что надо вызвать call чтобы вызвала функцию перехватчик. Если бы оно непахало то я б недумаю изменил код,. а так мне просто интересно почему же оно работает

или вот статья по сплайсинг и там тоже про call речи не идёт...
kleop вне форума Ответить с цитированием
Старый 30.04.2010, 14:54   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вы сами понимаете как оно работает?
(я понимаю, и знаю чем оно грозит)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Skype & DirectSoundCreate сплайсинг невыходит kleop Win Api 1 29.04.2010 21:51
Skype & DirectSoundCreate сплайсинг невыходит kleop Win Api 0 29.04.2010 18:22
Сплайсинг Doom_Rooster Общие вопросы Delphi 0 17.04.2010 20:34
TForm & TImage & PNG & Прозрачность delphi_beginner Общие вопросы Delphi 7 19.09.2009 08:46