masm rip + FindFileData

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

  1. proteus00

    proteus00 New Member

    Публикаций:
    0
    Регистрация:
    15 сен 2009
    Сообщения:
    4
    рипнул код, в котором имеется функа работы со структурой struct _WIN32_FIND_DATAA FindFileData. на си писать аналог вопрос 2 минут, но хочу решить именно на масме вопрос, т.к. это семпл самой менее объемной функи, а будут встречаться более сложные, в логике которых разбирать будет некогда и реверсить код на высокоуровневый язык, то хотелось бы просто корректно переобъявить все структуры, внести изменения в код и иметь сразу готовый рабочий код, не разбираясь в его полезной нагрузке.

    оригинал из ида
    [ASM]
    FindFileData = _WIN32_FIND_DATAA ptr -254h
    FileName = byte ptr -114h
    hFindFile = dword ptr -0Ch
    var_8 = dword ptr -8
    lpString = dword ptr 8

    push ebp
    mov ebp, esp
    sub esp, 258h
    push ebx
    push esi
    push edi
    push [ebp+lpString] ; lpString2
    mov edi, ds:lstrcpyA
    lea eax, [ebp+FileName]
    push eax ; lpString1
    call edi ; lstrcpyA
    push [ebp+lpString] ; lpString
    call ds:lstrlenA
    lea ebx, [ebp+eax+FileName]
    push offset inc_ ; "*.inc"
    push ebx ; lpString1
    call edi ; lstrcpyA
    lea eax, [ebp+FindFileData]
    push eax ; lpFindFileData
    lea eax, [ebp+FileName]
    push eax ; lpFileName
    call ds:FindFirstFileA
    [/ASM]

    оригинал из хекс-рейз
    [ASM]
    void *result; // eax@1
    CHAR *v2; // ebx@1
    int v3; // eax@1
    CHAR FileName[264]; // [sp+150h] [bp-114h]@1
    struct _WIN32_FIND_DATAA FindFileData; // [sp+10h] [bp-254h]@1
    HANDLE hFindFile; // [sp+258h] [bp-Ch]@1
    signed int v7; // [sp+25Ch] [bp-8h]@2

    lstrcpyA(FileName, lpString);
    v3 = lstrlenA(lpString);
    v2 = &FileName[v3];
    lstrcpyA(&FileName[v3], "*.inc");
    result = FindFirstFileA(FileName, &FindFileData);
    [/ASM]

    поскольку возникала ошибка какая-то при инклуде windows.inc и не хотеслоь из-за одной структуры подключать целый модуль, сразу объявил только структуру
    [ASM]
    _WIN32_FIND_DATAA struc ; (sizeof=0x140, standard type)
    dwFileAttributes dd ?
    ftCreationTime FILETIME <>
    ftLastAccessTime FILETIME <>
    ftLastWriteTime FILETIME <>
    nFileSizeHigh dd ?
    nFileSizeLow dd ?
    dwReserved0 dd ?
    dwReserved1 dd ?
    cFileName db 260 dup(?)
    cAlternateFileName db 14 dup(?)
    _padding db 2 dup(?)
    _WIN32_FIND_DATAA ends
    [/ASM]

    объявил все как в оригинале:
    FindFileData = _WIN32_FIND_DATAA ptr -254h
    ssFileName = byte ptr -114h
    hFindFile = dword ptr -0Ch
    var_8 = dword ptr -8
    ttlpString = dword ptr 8
    в итоге на прологе функции получил 254h буфер с нулями, далее только код

    объявил далее так:
    LOCAL FindFileData: _WIN32_FIND_DATAA
    ssFileName = byte ptr -114h
    hFindFile = dword ptr -0Ch
    var_8 = dword ptr -8
    ttlpString = dword ptr 8

    получаю вот что в дизасме компиленого модуля
    [ASM]
    FindFileData= _WIN32_FIND_DATAA ptr -140h
    lpString= dword ptr 8

    push ebp
    mov ebp, esp
    add esp, 0FFFFFEC0h
    push ebp
    mov ebp, esp
    sub esp, 258h
    push ebx
    push esi
    push edi
    push [ebp+lpString] ; lpString2
    mov edi, offset lstrcpyA
    lea eax, [ebp+FindFileData.cFileName]
    push eax ; lpString1
    call edi ; lstrcpyA
    push [ebp+lpString] ; lpString
    call lstrlenA
    lea ebx, [eax+ebp-114h]
    push offset inc_ ; "*.inc"
    [/ASM]
    с переменными распознаными лажа, локал порушила стек, балансировка на 140h не помагла, код из-за лишнего пролога Filename везде стал указывать не на буфер, а на поле записи FindData и т.д.

    как корректно объявить структуру и\или что вписать на прологе чтобы не трогать код и оставить функционал 1 в 1?
     
  2. Velheart

    Velheart New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    526
    Я когда чего рипал имел 2 версии базы -- одну рабочую, с именами и т.д., а в другой в опциях выставлял не делать имена стековым переменным, т.е. в листинге будут просто смещения, и потом реверсишь первую базу, а скрипты для рипа запускаешь во второй и никаких проблем не будет =)