IDA & DirectDraw

Тема в разделе "WASM.RESEARCH", создана пользователем punxer, 5 ноя 2009.

  1. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Доброго времени суток. Подскажите как звставить иду распознавать вызовы этого интерфейса.
    Пробовал сделать во флирте сигнатуры с ddraw.lib, получилось только из либы, что с масмом идёт, но толку нет. Ида не нашла совпадений.

    наппример.
    Код (Text):
    1. if ( (*((int (__stdcall **)(_DWORD, _DWORD, _DWORD))lpDD->lpVtbl + 20))(lpDD, hWnd, 19) < 0 )
    очевидно что это lpDD->SetCooperativeLevel(тратата).
    lpDD в хексрейсе распознаёт как IDirectDraw7*
    lpVtbl как struct IDirectDraw7::IDirectDrawVtbl*.


    вопрос 2. пример.
    Код (Text):
    1.  devmode = (unsigned int)&v4 ^ ps;
    2.   memset(&DisplayDevice, 0, 0x1A8u);
    3.   DisplayDevice.cb = 424;
    4.   memset(&Dst, 0, 0x1A8u);
    5.   Dst = 424;
    6.   EnumDisplayDevicesA = *(int (__stdcall **)(_DWORD, _DWORD, _DWORD, _DWORD))EnumDisplayDevicesA;
    7.   EnumDisplayDevicesA(0, 0, &DisplayDevice, 0);
    8.   EnumDisplayDevicesA(0, 1, &Dst, 0);
    9.   memset(&DevMode, 0, 0x9Cu);
    10.   DevMode.dmSize = 156;
    11.   DevMode.dmFields = (DWORD)((char *)loc_5C001E + 2);
    12.   *(_DWORD *)&DevMode.dmOrientation = 0;
    13.   *(_DWORD *)&DevMode.dmPaperLength = 0;
    14.   DevMode.dmBitsPerPel = 16;
    15.   DevMode.dmDisplayFrequency = 60;
    16.   DevMode.dmPelsWidth = 640;
    17.   DevMode.dmPelsHeight = 480;
    18.   memset(&v4, 0, 0x9Cu);
    19.   v9 = 480;
    20.   ChangeDisplaySettingsExA = *(int (__stdcall **)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD))ChangeDisplaySettingsExA;
    21.   v10 = 156;
    22.   v11 = (char *)loc_5C001E + 2;
    23.   v12 = 0;
    24.   v13 = -480;
    25.   v14 = 16;
    26.   v15 = 60;
    27.   v16 = 640;
    как её доказать, что:
    Код (Text):
    1.   v9 = 480;
    2.   ChangeDisplaySettingsExA = *(int (__stdcall **)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD))ChangeDisplaySettingsExA;
    3.   v10 = 156;
    4.   v11 = (char *)loc_5C001E + 2;
    5.   v12 = 0;
    6.   v13 = -480;
    7.   v14 = 16;
    8.   v15 = 60;
    9.   v16 = 640;
    -это есть поля v4, что имеет тип такойже как и DevMode.
     
  2. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    С DirectX не разбирался, на первый вопрос ответа не знаю. По поводу второго вопроса: для начала попробовать в режиме дизассемблера в стековых переменных (встать на имя переменной и нажать Enter) объявить переменную, соответствующую v4, структурой (Alt+Q), после чего переоткрыть окно декомпилятора (чтобы он переанализировал функцию). Если не поможет, можно встать в окне декомпилятора на объявление переменной, нажать 'y' (горячая клавиша, соответствующая в дизассемблере Edit->Functions->Set function type) и ввести объявление переменной в Си-стиле.
     
  3. tex32

    tex32 New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2009
    Сообщения:
    202
    Изучи содержимое файла pat, там нет ни одной виртуальной функции, значит в сигнатуре тоже не будет. Там только то, что можно импортировать из ddraw.dll

    Тебе нужна утилита TILIB. Она позволяет создать файлик til. Моя тема http://wasm.ru/forum/viewtopic.php?id=34995, нет ответов, значит её нет у людей.
     
  4. tex32

    tex32 New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2009
    Сообщения:
    202
    Как IDA узнала, что функция ShellExecute имеет 3 аргумента?
    Информация об именах, количестве аргументов и т.д. импортируемых функций берется из IDS файлов. Эти файлы запакованы и требуют специальных утилит для работы. Остальная информация о типах находится в TIL файлах.
     
  5. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    struct IDirectDraw7::IDirectDrawVtbl. или ты про другое?
    tex32
    спасибо. бум искать.
     
  6. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Код (ASM):
    1. struct IDirectDrawVtbl
    2. {
    3. QueryInterface dd ?
    4. AddRef dd ?
    5. Release dd?
    6. и тратата дальше
    7. CreateSurface dd ?
    8. }
    Щас нет иды под рукой, по памяти пишу.
     
  7. tex32

    tex32 New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2009
    Сообщения:
    202
    punxer что за программу изучаешь?
     
  8. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    tex32
    Работёнка подвернулась. Ресурсы гамы повытаскивать.
     
  9. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    tex32
    А что тогда в файлах sig?
     
  10. tex32

    tex32 New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2009
    Сообщения:
    202
    Игра древняя, если такие интерфейсы, как ДД7 использует. Поищи по интернету, возможно её уже разбирали. Скажи хотя бы как игра называется.

    Сигнатуры.
     
  11. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Код (Text):
    1. .text:0045C570 InitDirectSound proc near               ; CODE XREF: InitGame+96p
    2. .text:0045C570                 push    NULL            ; LPUNKNOWN
    3. .text:0045C572                 push    offset lpDS     ; LPDIRECTSOUND *
    4. .text:0045C577                 push    NULL            ; LPGUID
    5. .text:0045C579                 call    j_DirectSoundCreate ; Call Procedure
    6. .text:0045C57E                 test    eax, eax        ; Logical Compare
    7. .text:0045C580                 jge     short loc_45C594 ; Jump if Greater or Equal (SF=OF)
    8. .text:0045C582                 push    1Ah
    9. .text:0045C584                 push    offset aErrorDirectsou ; "Error DirectSoundCreate in dsoundcore.c"...
    10. .text:0045C589                 call    LogPrint        ; Call Procedure
    11. .text:0045C58E                 add     esp, 8          ; Add
    12. .text:0045C591                 xor     eax, eax        ; Logical Exclusive OR
    13. .text:0045C593                 retn                    ; Return Near from Procedure
    14. .text:0045C594 ; ---------------------------------------------------------------------------
    15. .text:0045C594
    16. .text:0045C594 loc_45C594:                             ; CODE XREF: InitDirectSound+10j
    17. .text:0045C594                 mov     eax, lpDS       ; LPDIRECTSOUND lpDS
    18. .text:0045C594                                         ; lpDS dd ?
    19. .text:0045C599                 mov     edx, hWnd
    20. .text:0045C59F                 mov     ecx, [eax]
    21. .text:0045C5A1                 push    1
    22. .text:0045C5A3                 push    edx
    23. .text:0045C5A4                 push    eax
    24. .text:0045C5A5                 mov     eax, [ecx+IDirectSoundVtbl.SetCooperativeLevel] ; QueryInterface dd ?
    25. .text:0045C5A5                                         ; Add dd ?
    26. .text:0045C5A5                                         ; Release dd?
    27. .text:0045C5A5                                         ; ...
    28. .text:0045C5A5                                         ; SetCooperativeLevel dd ?
    29. .text:0045C5A5                                         ; ...
    30. .text:0045C5A8                 call    eax             ; Indirect Call Near Procedure
    31. .text:0045C5AA                 test    eax, eax        ; Logical Compare
    32. .text:0045C5AC                 jge     short loc_45C5C0 ; Jump if Greater or Equal (SF=OF)
    33. .text:0045C5AE                 push    20h
    34. .text:0045C5B0                 push    offset aErrorSetcooper ; "Error SetCooperativeLevel DSound in dso"...
    35. .text:0045C5B5                 call    LogPrint        ; Call Procedure
    36. .text:0045C5BA                 add     esp, 8          ; Add
    37. .text:0045C5BD                 xor     eax, eax        ; Logical Exclusive OR
    38. .text:0045C5BF                 retn                    ; Return Near from Procedure
    39. .text:0045C5C0 ; ---------------------------------------------------------------------------
    40. .text:0045C5C0
    41. .text:0045C5C0 loc_45C5C0:                             ; CODE XREF: InitDirectSound+3Cj
    42. .text:0045C5C0                 mov     eax, TRUE
    43. .text:0045C5C5                 retn                    ; Return Near from Procedure
    44. .text:0045C5C5 InitDirectSound endp
    Псевдокод.

    Код (Text):
    1. BOOL __cdecl InitDirectSound()
    2. {
    3.   BOOL result; // eax@2
    4.  
    5.   if ( j_DirectSoundCreate(NULL, &lpDS, NULL) >= 0 )
    6.   {
    7.     if ( (*((int (__stdcall **)(_DWORD, _DWORD, _DWORD))lpDS->lpVtbl + 6))(lpDS, hWnd, 1) >= 0 )
    8.     {
    9.       result = TRUE;
    10.     }
    11.     else
    12.     {
    13.       LogPrint("Error SetCooperativeLevel DSound in dsoundcore.cpp", 32);
    14.       result = FALSE;
    15.     }
    16.   }
    17.   else
    18.   {
    19.     LogPrint("Error DirectSoundCreate in dsoundcore.cpp", 26);
    20.     result = FALSE;
    21.   }
    22.   return result;
    23. }
    как быть с этим: lpDS->lpVtbl + 6?
     
  12. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    Установить lpVtbl тип IDirectSoundVtbl*.
     
  13. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    punxer
    прога - новоматик чтоли?:)
     
  14. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Rustem
    нет
    reverser
    каким образом.

    Вот что есть.
    Код (Text):
    1. 00000000 IDirectSoundVtbl struc ; (sizeof=0x2C, standard type)
    2. 00000000 QueryInterface  dd ?                    ; offset
    3. 00000004 AddRef          dd ?                    ; offset
    4. 00000008 Release         dd ?                    ; offset
    5. 0000000C CreateSoundBuffer dd ?                  ; offset
    6. 00000010 GetCaps         dd ?                    ; offset
    7. 00000014 DuplicateSoundBuffer dd ?               ; offset
    8. 00000018 SetCooperativeLevel dd ?                ; offset
    9. 0000001C Compact         dd ?                    ; offset
    10. 00000020 GetSpeakerConfig dd ?                   ; offset
    11. 00000024 SetSpeakerConfig dd ?                   ; offset
    12. 00000028 Initialize      dd ?                    ; offset
    13. 0000002C IDirectSoundVtbl ends
    Код (Text):
    1. 00000000 IDirectSound    struc ; (sizeof=0x4, standard type)
    2. 00000000 lpVtbl          dd ?                    ; struct  offset
    3. 00000004 IDirectSound    ends
    Код (Text):
    1. .text:0045C570 InitDirectSound proc near               ; CODE XREF: InitGame+96p
    2. .text:0045C570                 push    NULL            ; LPUNKNOWN
    3. .text:0045C572                 push    offset lpDS     ; LPDIRECTSOUND *
    4. .text:0045C577                 push    NULL            ; LPGUID
    5. .text:0045C579                 call    j_DirectSoundCreate ; Call Procedure
    6. .text:0045C57E                 test    eax, eax        ; Logical Compare
    7. .text:0045C580                 jge     short loc_45C594 ; Jump if Greater or Equal (SF=OF)
    8. .text:0045C582                 push    1Ah
    9. .text:0045C584                 push    offset aErrorDirectsou ; "Error DirectSoundCreate in dsoundcore.c"...
    10. .text:0045C589                 call    LogPrint        ; Call Procedure
    11. .text:0045C58E                 add     esp, 8          ; Add
    12. .text:0045C591                 xor     eax, eax        ; Logical Exclusive OR
    13. .text:0045C593                 retn                    ; Return Near from Procedure
    14. .text:0045C594 ; ---------------------------------------------------------------------------
    15. .text:0045C594
    16. .text:0045C594 loc_45C594:                             ; CODE XREF: InitDirectSound+10j
    17. .text:0045C594                 mov     eax, lpDS
    18. .text:0045C599                 mov     edx, hWnd
    19. .text:0045C59F                 mov     ecx, [eax]
    20. .text:0045C5A1                 push    1
    21. .text:0045C5A3                 push    edx
    22. .text:0045C5A4                 push    eax
    23. .text:0045C5A5                 mov     eax, [ecx+IDirectSoundVtbl.SetCooperativeLevel]
    24. .text:0045C5A8                 call    eax             ; Indirect Call Near Procedure
    25. .text:0045C5AA                 test    eax, eax        ; Logical Compare
    26. .text:0045C5AC                 jge     short loc_45C5C0 ; Jump if Greater or Equal (SF=OF)
    27. .text:0045C5AE                 push    20h
    28. .text:0045C5B0                 push    offset aErrorSetcooper ; "Error SetCooperativeLevel DSound in dso"...
    29. .text:0045C5B5                 call    LogPrint        ; Call Procedure
    30. .text:0045C5BA                 add     esp, 8          ; Add
    31. .text:0045C5BD                 xor     eax, eax        ; Logical Exclusive OR
    32. .text:0045C5BF                 retn                    ; Return Near from Procedure
    33. .text:0045C5C0 ; ---------------------------------------------------------------------------
    34. .text:0045C5C0
    35. .text:0045C5C0 loc_45C5C0:                             ; CODE XREF: InitDirectSound+3Cj
    36. .text:0045C5C0                 mov     eax, TRUE
    37. .text:0045C5C5                 retn                    ; Return Near from Procedure
    38. .text:0045C5C5 InitDirectSound endp
    Так тож ничо. Суть в том, что б HexRays показал вызов так lpDS->SetCooperativeLevel.
    Кстате есть сигнатурки от IDA 5.3 c крыэлаба, если кому нужны пишите в личку. Или ищите на краклабе.
     
  15. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    как назначить тип IDirectSoundVtbl* не могу догнать.

    Код (Text):
    1. .data:0063D2BC dword_63D2BC    dd ?                    ; DATA XREF: probably_surf_release+26Br
    2. .data:0063D2BC                                         ; probably_surf_release+27Cw ...
    3. .data:0063D2C0 ; LPDIRECTSOUND lpDS
    4. .data:0063D2C0 lpDS            dd ?                    ; DATA XREF: InitDirectSound+2o
    5. .data:0063D2C0                                         ; InitDirectSound:loc_45C594r ...
    6. .data:0063D2C4                 db    ? ;               ; DATA XREF: sub_4B3880:loc_4B456Fr
    7. .data:0063D2C4
     
  16. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Ещё вопрос почему тут:
    Код (Text):
    1. .text:0045C5A5                 mov     eax, [ecx+18h]
    а в декомпилере:
    Код (Text):
    1. lpDS->lpVtbl + [b]6[/b]))(lpDS, hWnd, 1)
     
  17. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Бл*.., почему 6 и 18h
     
  18. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Последние два тупняка отпали, сорри
     
  19. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    Кнопочка Y. Или райт-клик из декомпилятора.
     
  20. reversecode

    reversecode Guest

    Публикаций:
    0
    сколко книг по IDA
    и в итоге никто ничего не читает
    даже зайти на оффициальный сайт иды и разобрать примеры никто не удосуживался
    .....
    думают скачали IDA, запустили и все...