Сейчас на форуме: asfa, _MBK_, Adler, bartolomeo (+8 невидимых)

 eXeL@B —› Вопросы новичков —› Вычисление точки входа от начала EXE
Посл.ответ Сообщение

Ранг: 5.9 (гость)
Активность: 0.020
Статус: Участник

Создано: 28 августа 2012 15:19
· Личное сообщение · #1

Скажите как это можно сделать? Ничего в примерах не нашёл.
Думаю что примерно так:
Читаем 28h РЕ заголовка получаем смещение точки входа относительно ImageBase
Из РЕ заголовка читаем адрес ImageBase (34h)
Сложив эти две величины получаем Точку входа в загруженном файла.
Потом нужно по очереди просматривать все секции. И проверять попадает ли она в адрес точки входа.
Вот тут то я, кажется, уже сильно усложняю....




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 28 августа 2012 15:27
· Личное сообщение · #2

ну смотря, что нужно сделать можно отмапить файл так, что просто потом перейти
на смещение +address EP, или как у вас, перевести виртуальный адрес в файловое смещение
и imagebase здесь не обязательно использовать. Rva и Va - чем отличаются?

-----
[nice coder and reverser]




Ранг: 5.9 (гость)
Активность: 0.020
Статус: Участник

Создано: 28 августа 2012 15:30 · Поправил: ekkl
· Личное сообщение · #3

Не, мне нужно именно файловое смещение.
Только что в винхексе просчитал "вручную". получилось. Только там секция кода шла первой.
ПС. Точка входа мне тоже нужна.
Rva Насколько понимаю адрес относительно виртуального адреса загрузки
va просто смещение от начала файла???



Ранг: 301.4 (мудрец), 194thx
Активность: 0.170.01
Статус: Участник

Создано: 28 августа 2012 15:36 · Поправил: Veliant
· Личное сообщение · #4

Читаешь адрес EP из заголовка. Дальше перечисляешь секции, пока не найдешь ту которой принадлежит адрес. Вычитаешь из своего адреса виртуальный адрес начала секции и прибавляешь физический. Собственно это основной метод




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 28 августа 2012 15:37
· Личное сообщение · #5

ekkl виртуальный адрес или смещение в памяти. но я лучше бы отпамил (CreateFileMapping) файл с флагом SEC_IMAGE, так будет проще. а ещё лучше вручную это сделать, тогда переводы не будут нужны.

-----
[nice coder and reverser]




Ранг: 617.3 (!), 677thx
Активность: 0.540
Статус: Участник

Создано: 28 августа 2012 15:41 · Поправил: Vovan666
· Личное сообщение · #6

Что-то типа такого

Code:
  1. mov edx,[FileVA] ;FileVA загруженный в память exe
  2.  
  3.       add edx,[edx.IMAGE_DOS_HEADER.e_lfanew] ;3ch
  4.       mov eax,d[kudapisat] ; Куда нужно записать
  5.       sub eax,[edx.IMAGE_NT_HEADERS.OptionalHeader.ImageBase] ;34h
  6.       add edx, 0F8h
  7. loop_sections3:
  8.          mov ebx, [edx+0Ch]
  9.          add ebx, [edx+8]
  10.          sub ebx, eax
  11.          jns encrypted_section3
  12.          add edx, 28h
  13.          jmp loop_sections3
  14. encrypted_section3:
  15.          mov ebx, [edx+0Ch]
  16.          sub eax, ebx
  17.          add eax, [edx+14h]
  18. mov edi,eax
  19. add edi,FileVA
  20. mov ecx,razmer
  21. mov esi, chegopisat
  22. rep movsb


| Сообщение посчитали полезным: ekkl


Ранг: 392.8 (мудрец), 108thx
Активность: 0.260.01
Статус: Участник
REVENGE сила, БеХоЦе могила

Создано: 28 августа 2012 16:50 · Поправил: Maximus
· Личное сообщение · #7

1. Загружаем файл (надо говорить как?), можно первые байт 1000
2. Задаем структуры:
Code:
  1. type
  2.    TSections = array [0..0] of TImageSectionHeader;
  3. var
  4.    ImageNtHeaders: PImageNtHeaders;
  5.    PSections: ^TSections;
  6.  
  7. ImageNtHeaders := pointer(Buffer + dword(PImageDosHeader(Buffer)._lfanew));
  8. PSections := pointer(pchar(@(ImageNtHeaders.OptionalHeader))+ImageNtHeaders.FileHeader.SizeOfOptionalHeader);


3. Вычисляем в какой секции находится наша точка:
Code:
  1. function SectionByRVA(dwRVA: DWORD):ShortInt;
  2. var i:Integer;
  3. begin
  4.   Result:=-1;
  5.   for i:=0 to ImageNtHeaders.FileHeader.NumberOfSections-1 do
  6.   begin
  7.     if (dwRVA >= PSections[i].VirtualAddress) and (dwRVA < PSections[i].VirtualAddress+PSections[i].Misc.VirtualSize)
  8.       then
  9.         begin
  10.           Result:=i;
  11.           exit;
  12.         end;
  13.   end;
  14. end;


4. Вычисляем смещение:
Code:
  1.          nSec:=SectionByRVA(dword(BaseAddress)-ImageNtHeaders.OptionalHeader.ImageBase);
  2.          if nSec<>-1 then begin
  3.             Result:=dword(BaseAddress)-ImageNtHeaders.OptionalHeader.ImageBase-PSections[nSec].VirtualAddress+PSections[nSec].PointerToRawData;
  4.             end;
  5.          end;
  6.  
  7. BaseAddress - наш адрес


-----
StarForce и Themida ацтой!




Ранг: 5.9 (гость)
Активность: 0.020
Статус: Участник

Создано: 28 августа 2012 19:17
· Личное сообщение · #8

Всем спасибо. Потихоньку разбрираюсь.
Но я кодирую на пуребейсике. Придется перевести.
Vovan666, тихо спрошу
Code:
  1.  mov edx,[FileVA] ;FileVA загруженный в память exe

А что такое d?
На асме давно не кодил и подобная запись не совсем знакома...



Ранг: 617.3 (!), 677thx
Активность: 0.540
Статус: Участник

Создано: 28 августа 2012 19:19 · Поправил: Vovan666
· Личное сообщение · #9

ekkl пишет:
На асме давно не кодил и подобная запись не совсем знакома...

Code:
  1. equ dword ptr


просто код брал из какого-то своего проекта, код практически не причесывал


 eXeL@B —› Вопросы новичков —› Вычисление точки входа от начала EXE
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати