Как искать Entry Point в образе полученном мэпированием

Тема в разделе "WASM.BEGINNERS", создана пользователем _sheva740, 20 мар 2010.

  1. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Добрый день.
    Читаю статьи о написании вируса.
    Вопрос: как получить адрес Entry Point в образе файла полученном мепированием файла на диске?
    Везде делают так ...
    Код (Text):
    1. нашел файл
    2. ...
    3. call GlobalAlloc
    4. mov dword ptr pImgf,eax
    5. ...
    6. call ReadFile
    7. ...
    8.  
    9. mov edi,pImgf
    10. mov ebx,pImgf
    11.  
    12. add ebx,dword ptr [edi+28h]; в [edi+28h]=1000h + [pImgf]
    13. add ebx,dword ptr [edi+34h]; в ebx=400000h + 1000h=401000h + [pImgf]
    Но по адресу 401000h + [pImgf] - совсем не то что надо.
    Так нужно искать в том случае если файл загружен.

    Подскажите - как искать Entry Point у файла который на диске?
     
  2. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    разобрать PE-формат...
     
  3. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    нет ну чем-то же отличается нахождение точки входа у файла на диске и у файла загруженного в память?
    Подскажите, пожалуйста, хоть куда копать.
     
  4. d2k9

    d2k9 Алексей

    Публикаций:
    0
    Регистрация:
    14 сен 2008
    Сообщения:
    325
    Читай доки по РЕ формату - есть на васме.
     
  5. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    pMap+ImageNtHeader(pMap)->OptionalHeader.AddressOfEntryPoint
     
  6. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    да читаю вот Billy Belcebu
    там он складывает 400000h + 1000h
    читаю TermoSINteZ Практика. Синтез вируса
    там тоже

    может чего пропустил, дак подскажите пожалуйста.
     
  7. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    KeSqueer
    спасибо!
     
  8. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Вот еще на cracklab.ru нашел, может кому надо...


    Как найти EP место в файле, назовем этот адрес REP.
    - Берем наш экзешник.
    - Читаем по адресу 3Ch dword число - это адрес заголовка PE,
    - прибавляем к этому числу 28h и читаем по получившемуся адресу снова dword (это будет виртуальный адрес EP (VEP) (без imagebase).
    - надо перебрать атрибуты всех секций (длина заголовка секции - 28h), число секций хранится по адресу заголовка PE+6, надо считать word.
    - Теперь нужен адрес заголовка первой секции: его получаем складывая адрес заголовка PE, константу 18h и word по адресу (адрес заголовка PE+14h).
    - Теперь читаем атрибуты первой секции: нам нужен будет VOffSet(0Ch), VSize(08h), Roffset(14h). В скобках указаны смещения относительно адреса заголовка этой секции, читать каждый раз dword.
    - А потом определяем, физический адрес EP (REP).
    Если (VEP - VOffset < VSize) and (VEP - VOffset >= 0) тогда наш REP = VEP - VOffset + Roffset, а если нет, то надо искать REP в следующих секциях.
     
  9. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    не надо ничего хардкодить... все, что вам может понадобиться, есть в PE-заголовке... не только смещение EntryPoint, но и таблица импорта кстати)))
     
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    _sheva740
    Секции выравниваются в памяти на границу страницы. Есть некоторые редкие исключения, как например шадов(Win32k.sys но тут намеренно это сделано, хотя спорный вопрос..). Вобщем перещитывайте размер либо проецируйте как образ.
     
  11. at0s

    at0s New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2009
    Сообщения:
    91
    _sheva740
    на диске (если в 0 секции)

    dh --- dos_header
    peh --- pe_header

    Код (Text):
    1. in = fopen(infilename,"rb") ))
    2. fread (&dh, 1, sizeof(dh), in );
    3. fseek(in, dh.PEOFFS, SEEK_SET);
    4. fread (&peh, sizeof(peh), 1, in);
    5. for(i = 0; i < peh.NumofObjects; i++ )
    6.           m = fread(&obj_entry[i], sizeof(obj_entry[i]), 1, in);
    7.  
    8. fis_entry[0] = peh.EntrypointRVA;  + obj_entry[0].fis_offset - obj_entry[0].section_rva;
    9. это и есть  точка входа у файла на диске
     
  12. reader323

    reader323 New Member

    Публикаций:
    0
    Регистрация:
    8 июл 2009
    Сообщения:
    134
    Clerk
    неплохо бы иногда перещитывать свои посты, грамотей ;)
     
  13. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    reader323
    Пока следишь за ошибками, можно утерять мысль :)
     
  14. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    reader323
    http://www.wasm.ru/forum/viewtopic.php?id=32386
    Неплохо былобы поиск использовать, а не создавать стопяцот одинаковых тем.
    На счёт постов - у тебя они все пустые(бесполезны), какието выкрики из толпы не по теме.
     
  15. Flint_ta

    Flint_ta New Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    312
    _sheva740
    ты пытаешься прочитать ImageBase и EntryPoint по смещениям от начала файла. А нужно 28h и 34h отсчитывать от PE заголовка.
    От начала файла по смещению 3ch лежит dword - смещение PE заголока от начала файла ) (нихера не понятно сказал))) )
    Код (Text):
    1. mov edi,pImgf
    2. mov ebx,pImgf
    3.  
    4. add ebx, 3ch
    5. mov ebx, dword ptr ds:[ebx] ; Получили смещение PE от начала файла
    6. add ebx,edi ; получили адрес PE в памяти
    Вот только теперь относительно полученного адреса считывай dwordы по смещениям 28h и 34h
     
  16. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Flint_ta
    Спасибо!
     
  17. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Столкнулся с такой проблемой
    В студии 2008 собрал простое win- приложение
    Скопировал(мепировал) его в пимять и пытаюсь найти в памяти его Entry Point.
    Все методы поиска Entry Point так или иначе завязанны на величине
    [IMAGE_SECTION_HEADER STRUCT].PointerToRawData - offset-а от начала файла до первого байта секции.

    Но тут сталкиваюсь с тем что у exe-шек из 2008 студии в первой секции .textbss
    ee PointerToRawData =0!?

    [​IMG]


    Вы стаким не встречались? Как тогда быть?!!!
     
  18. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Секция содержит неинициализированные данные и не занимает места в файле, только и всего. Под такую секцию выделяется память, которая обнуляется.
     
  19. FLASH300

    FLASH300 New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2008
    Сообщения:
    72
    A если так ?

    Код (Text):
    1. errorp proc pFile1:DWORD
    2.               mov eax,pFile1
    3.               cmp word ptr [eax],"ZM"
    4.               jne XRASb1
    5.               ;assume eax : ptr IMAGE_DOS_HEADER    
    6.               ;находим PE заголовок
    7.               mov ebx,(IMAGE_DOS_HEADER ptr [eax]).e_lfanew ;eax+3Ch
    8.               add ebx,eax
    9.               cmp word ptr [ebx],"EP"
    10.               jne XRASb1
    11.               ;assume ebx : ptr IMAGE_NT_HEADERS
    12.               ;загрузим число секций
    13.               movzx ecx,(IMAGE_NT_HEADERS PTR [ebx]).FileHeader.NumberOfSections
    14.               test ecx,ecx
    15.               je XRASb1
    16.               mov edi,(IMAGE_NT_HEADERS PTR [ebx]).OptionalHeader.AddressOfEntryPoint
    17.               ;найдем начало таблицы секций
    18.               lea esi,[ebx+sizeof IMAGE_NT_HEADERS]
    19.               ;assume esi : ptr IMAGE_SECTION_HEADER
    20.            @@:mov edx,(IMAGE_SECTION_HEADER ptr [esi]).VirtualAddress
    21.               cmp edx,edi
    22.               jnb XRASb1 ;ошибка если RVA секции больше RVA точки входа
    23.               add edx,(IMAGE_SECTION_HEADER ptr [esi]).SizeOfRawData
    24.               cmp edx,edi
    25.               jnb @F ;нашли если RVA внутри секции
    26.               add esi,sizeof IMAGE_SECTION_HEADER  ;к следующей секции
    27.               loop @B
    28.        XRASb1:jmp XRASb
    29.            @@:;cmp dword ptr (IMAGE_SECTION_HEADER ptr [esi]).Name1,"xet." ;SectionName .tex(t)
    30.               ;jne XRASb              
    31.               add eax,(IMAGE_SECTION_HEADER ptr [esi]).PointerToRawData ;получить указатель на секцию
    32.               sub edi, (IMAGE_SECTION_HEADER ptr [esi]).VirtualAddress  ;получить смещение внутри секции
    33.               add eax,edi ;получить указатель на точку входа
    34.               nop
    35.               nop
    36.               nop        
    37.         XRASb: ;ошибка
    38. ret
    39. errorp endp
     
  20. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    FLASH300
    Большое спасибо - хорошая идея! Действительно выход!!!