Доброго времени суток. Подскажите как звставить иду распознавать вызовы этого интерфейса. Пробовал сделать во флирте сигнатуры с ddraw.lib, получилось только из либы, что с масмом идёт, но толку нет. Ида не нашла совпадений. наппример. Код (Text): if ( (*((int (__stdcall **)(_DWORD, _DWORD, _DWORD))lpDD->lpVtbl + 20))(lpDD, hWnd, 19) < 0 ) очевидно что это lpDD->SetCooperativeLevel(тратата). lpDD в хексрейсе распознаёт как IDirectDraw7* lpVtbl как struct IDirectDraw7::IDirectDrawVtbl*. вопрос 2. пример. Код (Text): devmode = (unsigned int)&v4 ^ ps; memset(&DisplayDevice, 0, 0x1A8u); DisplayDevice.cb = 424; memset(&Dst, 0, 0x1A8u); Dst = 424; EnumDisplayDevicesA = *(int (__stdcall **)(_DWORD, _DWORD, _DWORD, _DWORD))EnumDisplayDevicesA; EnumDisplayDevicesA(0, 0, &DisplayDevice, 0); EnumDisplayDevicesA(0, 1, &Dst, 0); memset(&DevMode, 0, 0x9Cu); DevMode.dmSize = 156; DevMode.dmFields = (DWORD)((char *)loc_5C001E + 2); *(_DWORD *)&DevMode.dmOrientation = 0; *(_DWORD *)&DevMode.dmPaperLength = 0; DevMode.dmBitsPerPel = 16; DevMode.dmDisplayFrequency = 60; DevMode.dmPelsWidth = 640; DevMode.dmPelsHeight = 480; memset(&v4, 0, 0x9Cu); v9 = 480; ChangeDisplaySettingsExA = *(int (__stdcall **)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD))ChangeDisplaySettingsExA; v10 = 156; v11 = (char *)loc_5C001E + 2; v12 = 0; v13 = -480; v14 = 16; v15 = 60; v16 = 640; как её доказать, что: Код (Text): v9 = 480; ChangeDisplaySettingsExA = *(int (__stdcall **)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD))ChangeDisplaySettingsExA; v10 = 156; v11 = (char *)loc_5C001E + 2; v12 = 0; v13 = -480; v14 = 16; v15 = 60; v16 = 640; -это есть поля v4, что имеет тип такойже как и DevMode.
С DirectX не разбирался, на первый вопрос ответа не знаю. По поводу второго вопроса: для начала попробовать в режиме дизассемблера в стековых переменных (встать на имя переменной и нажать Enter) объявить переменную, соответствующую v4, структурой (Alt+Q), после чего переоткрыть окно декомпилятора (чтобы он переанализировал функцию). Если не поможет, можно встать в окне декомпилятора на объявление переменной, нажать 'y' (горячая клавиша, соответствующая в дизассемблере Edit->Functions->Set function type) и ввести объявление переменной в Си-стиле.
Изучи содержимое файла pat, там нет ни одной виртуальной функции, значит в сигнатуре тоже не будет. Там только то, что можно импортировать из ddraw.dll Тебе нужна утилита TILIB. Она позволяет создать файлик til. Моя тема http://wasm.ru/forum/viewtopic.php?id=34995, нет ответов, значит её нет у людей.
Как IDA узнала, что функция ShellExecute имеет 3 аргумента? Информация об именах, количестве аргументов и т.д. импортируемых функций берется из IDS файлов. Эти файлы запакованы и требуют специальных утилит для работы. Остальная информация о типах находится в TIL файлах.
Код (ASM): struct IDirectDrawVtbl { QueryInterface dd ? AddRef dd ? Release dd? и тратата дальше CreateSurface dd ? } Щас нет иды под рукой, по памяти пишу.
Игра древняя, если такие интерфейсы, как ДД7 использует. Поищи по интернету, возможно её уже разбирали. Скажи хотя бы как игра называется. Сигнатуры.
Код (Text): .text:0045C570 InitDirectSound proc near ; CODE XREF: InitGame+96p .text:0045C570 push NULL ; LPUNKNOWN .text:0045C572 push offset lpDS ; LPDIRECTSOUND * .text:0045C577 push NULL ; LPGUID .text:0045C579 call j_DirectSoundCreate ; Call Procedure .text:0045C57E test eax, eax ; Logical Compare .text:0045C580 jge short loc_45C594 ; Jump if Greater or Equal (SF=OF) .text:0045C582 push 1Ah .text:0045C584 push offset aErrorDirectsou ; "Error DirectSoundCreate in dsoundcore.c"... .text:0045C589 call LogPrint ; Call Procedure .text:0045C58E add esp, 8 ; Add .text:0045C591 xor eax, eax ; Logical Exclusive OR .text:0045C593 retn ; Return Near from Procedure .text:0045C594 ; --------------------------------------------------------------------------- .text:0045C594 .text:0045C594 loc_45C594: ; CODE XREF: InitDirectSound+10j .text:0045C594 mov eax, lpDS ; LPDIRECTSOUND lpDS .text:0045C594 ; lpDS dd ? .text:0045C599 mov edx, hWnd .text:0045C59F mov ecx, [eax] .text:0045C5A1 push 1 .text:0045C5A3 push edx .text:0045C5A4 push eax .text:0045C5A5 mov eax, [ecx+IDirectSoundVtbl.SetCooperativeLevel] ; QueryInterface dd ? .text:0045C5A5 ; Add dd ? .text:0045C5A5 ; Release dd? .text:0045C5A5 ; ... .text:0045C5A5 ; SetCooperativeLevel dd ? .text:0045C5A5 ; ... .text:0045C5A8 call eax ; Indirect Call Near Procedure .text:0045C5AA test eax, eax ; Logical Compare .text:0045C5AC jge short loc_45C5C0 ; Jump if Greater or Equal (SF=OF) .text:0045C5AE push 20h .text:0045C5B0 push offset aErrorSetcooper ; "Error SetCooperativeLevel DSound in dso"... .text:0045C5B5 call LogPrint ; Call Procedure .text:0045C5BA add esp, 8 ; Add .text:0045C5BD xor eax, eax ; Logical Exclusive OR .text:0045C5BF retn ; Return Near from Procedure .text:0045C5C0 ; --------------------------------------------------------------------------- .text:0045C5C0 .text:0045C5C0 loc_45C5C0: ; CODE XREF: InitDirectSound+3Cj .text:0045C5C0 mov eax, TRUE .text:0045C5C5 retn ; Return Near from Procedure .text:0045C5C5 InitDirectSound endp Псевдокод. Код (Text): BOOL __cdecl InitDirectSound() { BOOL result; // eax@2 if ( j_DirectSoundCreate(NULL, &lpDS, NULL) >= 0 ) { if ( (*((int (__stdcall **)(_DWORD, _DWORD, _DWORD))lpDS->lpVtbl + 6))(lpDS, hWnd, 1) >= 0 ) { result = TRUE; } else { LogPrint("Error SetCooperativeLevel DSound in dsoundcore.cpp", 32); result = FALSE; } } else { LogPrint("Error DirectSoundCreate in dsoundcore.cpp", 26); result = FALSE; } return result; } как быть с этим: lpDS->lpVtbl + 6?
Rustem нет reverser каким образом. Вот что есть. Код (Text): 00000000 IDirectSoundVtbl struc ; (sizeof=0x2C, standard type) 00000000 QueryInterface dd ? ; offset 00000004 AddRef dd ? ; offset 00000008 Release dd ? ; offset 0000000C CreateSoundBuffer dd ? ; offset 00000010 GetCaps dd ? ; offset 00000014 DuplicateSoundBuffer dd ? ; offset 00000018 SetCooperativeLevel dd ? ; offset 0000001C Compact dd ? ; offset 00000020 GetSpeakerConfig dd ? ; offset 00000024 SetSpeakerConfig dd ? ; offset 00000028 Initialize dd ? ; offset 0000002C IDirectSoundVtbl ends Код (Text): 00000000 IDirectSound struc ; (sizeof=0x4, standard type) 00000000 lpVtbl dd ? ; struct offset 00000004 IDirectSound ends Код (Text): .text:0045C570 InitDirectSound proc near ; CODE XREF: InitGame+96p .text:0045C570 push NULL ; LPUNKNOWN .text:0045C572 push offset lpDS ; LPDIRECTSOUND * .text:0045C577 push NULL ; LPGUID .text:0045C579 call j_DirectSoundCreate ; Call Procedure .text:0045C57E test eax, eax ; Logical Compare .text:0045C580 jge short loc_45C594 ; Jump if Greater or Equal (SF=OF) .text:0045C582 push 1Ah .text:0045C584 push offset aErrorDirectsou ; "Error DirectSoundCreate in dsoundcore.c"... .text:0045C589 call LogPrint ; Call Procedure .text:0045C58E add esp, 8 ; Add .text:0045C591 xor eax, eax ; Logical Exclusive OR .text:0045C593 retn ; Return Near from Procedure .text:0045C594 ; --------------------------------------------------------------------------- .text:0045C594 .text:0045C594 loc_45C594: ; CODE XREF: InitDirectSound+10j .text:0045C594 mov eax, lpDS .text:0045C599 mov edx, hWnd .text:0045C59F mov ecx, [eax] .text:0045C5A1 push 1 .text:0045C5A3 push edx .text:0045C5A4 push eax .text:0045C5A5 mov eax, [ecx+IDirectSoundVtbl.SetCooperativeLevel] .text:0045C5A8 call eax ; Indirect Call Near Procedure .text:0045C5AA test eax, eax ; Logical Compare .text:0045C5AC jge short loc_45C5C0 ; Jump if Greater or Equal (SF=OF) .text:0045C5AE push 20h .text:0045C5B0 push offset aErrorSetcooper ; "Error SetCooperativeLevel DSound in dso"... .text:0045C5B5 call LogPrint ; Call Procedure .text:0045C5BA add esp, 8 ; Add .text:0045C5BD xor eax, eax ; Logical Exclusive OR .text:0045C5BF retn ; Return Near from Procedure .text:0045C5C0 ; --------------------------------------------------------------------------- .text:0045C5C0 .text:0045C5C0 loc_45C5C0: ; CODE XREF: InitDirectSound+3Cj .text:0045C5C0 mov eax, TRUE .text:0045C5C5 retn ; Return Near from Procedure .text:0045C5C5 InitDirectSound endp Так тож ничо. Суть в том, что б HexRays показал вызов так lpDS->SetCooperativeLevel. Кстате есть сигнатурки от IDA 5.3 c крыэлаба, если кому нужны пишите в личку. Или ищите на краклабе.
как назначить тип IDirectSoundVtbl* не могу догнать. Код (Text): .data:0063D2BC dword_63D2BC dd ? ; DATA XREF: probably_surf_release+26Br .data:0063D2BC ; probably_surf_release+27Cw ... .data:0063D2C0 ; LPDIRECTSOUND lpDS .data:0063D2C0 lpDS dd ? ; DATA XREF: InitDirectSound+2o .data:0063D2C0 ; InitDirectSound:loc_45C594r ... .data:0063D2C4 db ? ; ; DATA XREF: sub_4B3880:loc_4B456Fr .data:0063D2C4
Ещё вопрос почему тут: Код (Text): .text:0045C5A5 mov eax, [ecx+18h] а в декомпилере: Код (Text): lpDS->lpVtbl + [b]6[/b]))(lpDS, hWnd, 1)
сколко книг по IDA и в итоге никто ничего не читает даже зайти на оффициальный сайт иды и разобрать примеры никто не удосуживался ..... думают скачали IDA, запустили и все...