IDA BP based frame

Тема в разделе "WASM.RESEARCH", создана пользователем PaCHER, 26 янв 2007.

  1. PaCHER

    PaCHER New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    852
    Есть DLL во всех функциях которой статическая база EBP.
    стандартное начало функции c распознаной базой сегмента:
    arg_1C = dword ptr 20h
    arg_2A = word ptr 2Eh
    arg_34 = dword ptr 38h
    arg_3C = dword ptr 40h

    arg_XX Можно переименовать в понятную переменную

    из под этой функции вызываются езе 500 функций, у которых тажа база

    lea edx, [ebp+arg_51C6]
    jmp ds:off_990DEF74[eax*4]

    off_990DEF74:
    dd offset loc_9910982B
    dd offset sub_99108C52
    dd offset sub_991096E6
    dd offset sub_9910B0A1
    dd offset sub_9910B2A9

    ВОПРОС: Как втолдычить иде чтоб она распознавала все функции относительно материнской базы (другими словами чтоб подхватила для всех материнский Stack frame), или хотябы когда выбираеш распознать аргументы относительно базы подхватывала измененные имена, тоесть если есть arg_1C=dword ptr 20h она распознавала как hFile1=dword ptr 20h
     
  2. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    насколько я помню в статье юзается такая фича
    http://hexblog.com/2005/11/stealth_plugin_1.html
     
  3. PaCHER

    PaCHER New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    852
    Asterix
    Чтото похожее но не работает, может изза того что там описан метот в отладке. А у меня просто образ, и нужно какимто образом все функции привязать к одному и томуже Stack frame, чтоб один раз там проименовать переменные, и во всех функциях будут теже названия
     
  4. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    В данном случае похоже Ида просто неправильно сконвертировала адреса переходов в отдельные функции. На самом деле sub_99108C52 и т.д. - это всё еще продолжение главной функции. Проще всего это исправить так:
    1) ставишь якорь (Alt-L) сразу за неправильно определенным концом главной функции (скорее всего это у тебя будет sub_99108C52)
    2) находишь самую последнюю из функций (скорее всего последняя запись в jump table) и переходишь в ее конец.
    3) андефайнишь (U) всё это дело.
    4) тут же определяешь настоящее окончание функции (E)
    5) можно теперь сконвертировать все разандефайнутое обратно в код.
     
  5. PaCHER

    PaCHER New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    852
    reverser
    Не все так просто
    1) Если так ундефайнить то нужно уже весь код
    2) Функций больше 500 они идут не по порядку, и разбросаны по разным частям кода, тоесть не все в одном месте.
    lea edx, [ebp+arg_51C6]
    jmp ds:off_990DEF74[eax*4]
    endp.

    ...
    some procedures
    ...

    off_990DEF74:
    dd offset loc_9910982B
    dd offset sub_99108C52
    dd offset sub_991096E6
    dd offset sub_9910B0A1
    dd offset sub_9910B2A9

    3) Есть такиеже материнские подфункции из под которых опятьже вызываются еще 100-150 функций такимже методом

    Мне нужно полностю все функции закрепить за одной базой (тогда я смогу отредактировать Stack frame как мне понравится), так как значение EBP не изменяется ни в одной функции или поразмечать подфункции как
    Start of function chunk for MATHER_FUNC
    End of function chunk for MATHER_FUNC
    Тогда ида определяет все нормально, только у меня она всего 3 подфункции сама распознала.
     
  6. PaCHER

    PaCHER New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    852
    Вобщем отвечаю сам по своей проблеме если вдруг ктонибудь наткнется на туже проблему.
    Оказывается все решается как всегда элементарно, в моем случае через использование IDA структур.

    1) открываем окно со структурой, нажимаем ins создаем новую структуру
    00000000 wasm struc ; (sizeof=0x38)
    00000000 AAA dd ?
    00000004 BBB dd ?
    00000008 CCC dd ?
    0000000C field_C dd ?
    00000010 field_10 dd ?
    00000014 field_14 dd ?
    00000018 field_18 dd ?
    0000001C field_1C dd ?
    00000020 field_20 dd ?
    00000024 field_24 dd ?
    00000028 field_28 dd ?
    0000002C field_2C dd ?
    00000030 field_30 dd ?
    00000034 field_34 dd ?
    00000038 wasm ends

    2) выделяем необходимый код

    Код (Text):
    1.        mov     eax, [ebp+0]
    2.                 push    edx
    3.                 mov     edx, [ebp+10h]
    4.                 sub     edx, 4
    5.                 push    edx
    6.                 add     edx, [ebp+525Ah]
    7.                 call    sub_6
    8.                 pop     dword ptr [ebp+10h]
    9.                 pop     edx
    10.                 mov     eax, [ebp+4]
    11.                 push    edx
    12.                 mov     edx, [ebp+10h]
    13.                 sub     edx, 4
    14.                 push    edx
    15.                 add     edx, [ebp+525Ah]
    16.                 call    sub_6
    17.                 pop     dword ptr [ebp+10h]
    18.                 pop     edx
    19.                 mov     eax, [ebp+8]
    20.                 push    edx
    21.                 mov     edx, [ebp+10h]
    22.                 sub     edx, 4
    23.                 push    edx
    24.                 add     edx, [ebp+525Ah]
    25.                 call    sub_6
    3. Жмем T и выбираем из списка нужную структуру нужный регистр относительно которого будет применена структура и жмем ок и получаем понятный код
    Код (Text):
    1.        mov     eax, [ebp+wasm.AAA]
    2.                 push    edx
    3.                 mov     edx, [ebp+wasm.field_10]
    4.                 sub     edx, 4
    5.                 push    edx
    6.                 add     edx, [ebp+(wasm.field_18+5242h)]
    7.                 call    sub_6
    8.                 pop     [ebp+wasm.field_10]
    9.                 pop     edx
    10.                 mov     eax, [ebp+wasm.BBB]
    11.                 push    edx
    12.                 mov     edx, [ebp+wasm.field_10]
    13.                 sub     edx, 4
    14.                 push    edx
    15.                 add     edx, [ebp+(wasm.field_18+5242h)]
    16.                 call    sub_6
    17.                 pop     [ebp+wasm.field_10]
    18.                 pop     edx
    19.                 mov     eax, [ebp+wasm.CCC]
    20.                 push    edx
    21.                 mov     edx, [ebp+wasm.field_10]
    22.                 sub     edx, 4
    23.                 push    edx
    24.                 add     edx, [ebp+(wasm.field_18+5242h)]
    25.                 call    sub_6