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

 eXeL@B —› Программирование —› RvaToFileOffset
. 1 . 2 . >>
Посл.ответ Сообщение


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

Создано: 08 августа 2006 13:06 · Поправил: Hellspawn
· Личное сообщение · #1

всем известен стандартный метод перевода RVA в offset

if ((RVA>=Section.rva) and (RVA<=Section.rva+Section.physical_size)) then
z:=Section.physical_offs+RVA-Section.rva;

но я тут наткнулся на файл, в котором этом метод даёт не правильный результат, как
следствие пе-ид пишет "Not a valid PE file", пе-туулз падает с ошибкой, да и пе-едитор не блещет,
файл в атаче собственно вопрос - как исправить функцию, чтобы норм переводилось?
и интересно было бы услышать причину этого, как мне кажется там опять замуты с размером секции
и выравниванием...

0881_08.08.2006_CRACKLAB.rU.tgz - TestDebugger.EXE

-----
[nice coder and reverser]




Ранг: 271.5 (наставник), 12thx
Активность: 0.150
Статус: Участник
Packer Reseacher

Создано: 08 августа 2006 13:15 · Поправил: theCollision
· Личное сообщение · #2

Out of range ! - ты об этом?

Более того, хотел дизасмить точку входа и PE тулз вылетел )) прикольно. Но олли в норме скушала!

-----
My love is very cool girl.




Ранг: 54.9 (постоянный)
Активность: 0.020
Статус: Участник

Создано: 08 августа 2006 13:15
· Личное сообщение · #3

Hellspawn
А у меня PEID пишет "nSPack 2.2 -> North Star/Liu Xing Ping"




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

Создано: 08 августа 2006 13:20 · Поправил: Hellspawn
· Личное сообщение · #4

xShadow пишет:
А у меня PEID пишет "nSPack 2.2 -> North Star/Liu Xing Ping"


не знаю че у тебя за пе-ид, у меня PEiD 2006 + пробовал голым 0.94

theCollision пишет:
Out of range ! - ты об этом?

Более того, хотел дизасмить точку входа и PE тулз вылетел )) прикольно. Но олли в норме скушала!


да об этом...

и вообще был задан конкретный вопрос... не надо флейма

-----
[nice coder and reverser]




Ранг: 271.5 (наставник), 12thx
Активность: 0.150
Статус: Участник
Packer Reseacher

Создано: 08 августа 2006 13:24 · Поправил: theCollision
· Личное сообщение · #5

Проще паренной репы! АБЫДНО, думал трюк! (( аж до слез, шо за 5 мин. :`-(
Секции гляди все понятно, размер физических данных

-----
My love is very cool girl.





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

Создано: 08 августа 2006 13:33
· Личное сообщение · #6

я понимаю, что 11 - это слишком мало (0000101B - не попадает в первую секцию), но тут весь замут в выравнивании nt.OptionalHeader.FileAlignment=$200 а оффсет первой секции $110, наверное надо сделать так,

If (Section.physical_offs<nt.OptionalHeader.FileAlignment) and (nt.OptionalHeader.FileAlignment=$200)
then z:=RVA-Section.rva;

и проверять это для 1-ой секции... хотелось бы выслушать мнение знатоков ПЕ

-----
[nice coder and reverser]




Ранг: 66.8 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 08 августа 2006 13:35 · Поправил: UsAr
· Личное сообщение · #7

наверное все PointerToRawData нужно сначала выравнивать на нижнюю границу FileAlignment, а SizeOfRawData на верхнюю




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

Создано: 08 августа 2006 14:08
· Личное сообщение · #8

почитал пару статей и запутался окончательно значит так

SizeOfRawData: DWORD;
// Количество инициализирующих данных (помещаемых в
// начало секции из исходного файла при ее создании); округлено
// вверх до FileAlignment
...
FileAlignment: DWORD;
// Для любой секции данные, помещаемые в нее, находятся в исходном
// файле по смещению, кратному этому числу

значит в исходном файле было

Name: VOffset: VSize: ROffset: RSize: Flags: Scan:
a \0 00001000 00003000 00000118 00000011 E0000060 code
a \1 00004000 00001EB0 00000200 00000B64 E0000060 d/i

а станет

Name: VOffset: VSize: ROffset: RSize: Flags: Scan:
a \0 00001000 00003000 00000200 00000000 E0000060 code
a \1 00004000 00001EB0 00000200 00000B64 E0000060 d/i

??? чёт совсем мозги от отдыха поплавились

-----
[nice coder and reverser]




Ранг: 66.8 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 08 августа 2006 14:12 · Поправил: UsAr
· Личное сообщение · #9

Hellspawn, ты перепутал =)
Name: VOffset: VSize: ROffset: RSize: Flags: Scan:
a \0 00001000 00003000 00000000 00000200 E0000060 code
a \1 00004000 00002000 00000200 00000C00 E0000060 d/i





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

Создано: 08 августа 2006 14:26 · Поправил: Hellspawn
· Личное сообщение · #10

ой точно я ж говорю хорошо отдохнул...

ща провёл эксперименты с файлом
1) ROffset=0 RSize=200 | файл не запускается
2) ROffset=200 RSize=0 | файл не запускается
3) ROffset=100 RSize=100 | файл запускается и все утилиты с ним работают корректно

кто-нить объяснит почему?

-----
[nice coder and reverser]




Ранг: 66.8 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 08 августа 2006 14:34 · Поправил: UsAr
· Личное сообщение · #11

похоже что ROffset не может быть равен 0, если сделать ROffset=1 RSize=200, то все работает =)

update
точно, если ROffset = 0, то загрузчик думает что эта секция не содержит данных из файла, а полностью выделяется как виртуальная и забивается нулями




Ранг: 199.6 (ветеран), 12thx
Активность: 0.10
Статус: Участник
www.uinc.ru

Создано: 08 августа 2006 14:37 · Поправил: DrGolova
· Личное сообщение · #12

PointerToRawData выравнивается в меньшею сторону до 0х200 (маска 0x1ff) - это захардкодено в РЕ загрузчике. Причем если он изначально 0, то секция не грузится, потому штааа это bss. А если больше нуля, то выравнивается и грузится.




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

Создано: 08 августа 2006 15:00
· Личное сообщение · #13

ладно, я алго поправил, теперь вроде всегда правильно определяет... хотя всё может быть,
всем спасибо

-----
[nice coder and reverser]




Ранг: 271.5 (наставник), 12thx
Активность: 0.150
Статус: Участник
Packer Reseacher

Создано: 08 августа 2006 15:06
· Личное сообщение · #14

Hellspawn
А есть еще?

-----
My love is very cool girl.





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

Создано: 08 августа 2006 15:11
· Личное сообщение · #15

theCollision пишет:
А есть еще?


что ещё? если странные файлы, то у меня было несколько где пе-ид вылетал с ошибкой)
правда искать надо, у меня такой хлам на харде...

-----
[nice coder and reverser]





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 09 августа 2006 11:59
· Личное сообщение · #16

theCollision запакуй что нибудь WinUpack или NsPack и будет тебе их сколько угодно.

-----
Yann Tiersen best and do not fuck





Ранг: 251.8 (наставник), 17thx
Активность: 0.120
Статус: Участник
Seeker

Создано: 09 августа 2006 22:15 · Поправил: =TS=
· Личное сообщение · #17

PE_Kill
прикол в том, что у меня в плаге нормально импорты смотрелись во всех WinUpack до этого файла

ДОБАВЛЕНО
Блин, оказывается по этой ссылке скачался какой-то левый файл . Алго отрабатывает нормально...
(Это походу NsPack)

ДОБАВЛЕНО2
Hellspawn, не путай людей , нафик ты файлы перезалил? Залей ОБА...

-----
DREAMS CALL US





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

Создано: 09 августа 2006 23:09 · Поправил: Hellspawn
· Личное сообщение · #18

=TS= - ты почаще на улицу выходи, проветривайся! иногда помогает..
вот второй файлик, тут весь подвох с импортами...

c417_09.08.2006_CRACKLAB.rU.tgz - 111.EXE

-----
[nice coder and reverser]





Ранг: 251.8 (наставник), 17thx
Активность: 0.120
Статус: Участник
Seeker

Создано: 09 августа 2006 23:12 · Поправил: =TS=
· Личное сообщение · #19

Hellspawn пишет:
=TS= - ты почаще на улицу выходи, проветривайся! иногда помогает


Я скачал файл -- был WinUpack. Скачал еще раз -- там уже NsPack... Может глюканул сайт...

-----
DREAMS CALL US





Ранг: 251.8 (наставник), 17thx
Активность: 0.120
Статус: Участник
Seeker

Создано: 10 августа 2006 00:54
· Личное сообщение · #20

По файлу 111.exe
Там RVA FirstChunk = 0x857f11e8
Кто скажет, как с ТАКОГО RVA получается оффсет 1E8?

ЗЫ. Если в файле поправить на 0x000011e8, то импорты видны, НО ФАЙЛ НЕ РАБОТАЕТ!

-----
DREAMS CALL US





Ранг: 218.9 (наставник), 42thx
Активность: 0.160
Статус: Участник
dotnet

Создано: 10 августа 2006 03:22
· Личное сообщение · #21

0x857f11e8

-----
have a nice day





Ранг: 251.8 (наставник), 17thx
Активность: 0.120
Статус: Участник
Seeker

Создано: 10 августа 2006 09:46
· Личное сообщение · #22

Nimnul
Блин, значение я знаю, ты скажи лучьше как оно получается!

-----
DREAMS CALL US





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

Создано: 10 августа 2006 13:34 · Поправил: Hellspawn
· Личное сообщение · #23

хорошо бы было услышать мнение гуру, знатоков ПЕ формата... а то тут прям мистика какая-то
может разработчикам винупак написать? А то намутили что-то

-----
[nice coder and reverser]





Ранг: 61.7 (постоянный)
Активность: 0.050
Статус: Участник
я

Создано: 10 августа 2006 14:46
· Личное сообщение · #24

насчет 111.exe я попробую ответить

RawOffset 1 и 3 секции = 10h. виртуальные же адреса их разные, т.е. одни и те же raw-данные загрузятся по 2 ( или 3, если с учетом загловка) разным адресам (1 и 3 секции).
загрузите 111.exe в ольке и сдампите. в дампе будет 3 заголовка (MZ + PE) - первый это родной по смещению 0, второй это 1 секция (10h выровенная до 0) и третий заголовой (RawOffset тоже 10h и выровенный до 0)

как быть с импортом? RVA импорта - 000C1EE указывает в правильное место т.е. в 3 секцию, которая загрузится по адресу 000C000

то есть реально в файле импрт лежит так 000C1EE-000C000 (rva последней секции), а не 000001FE как считает PETools например. те.е

иначе говоря до тгого как переводить RVA в Offset надо оффсет выровнять в меньшую сторону до 200h

вроде так. кажись нигде я не ошибся




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

Создано: 10 августа 2006 14:50 · Поправил: Hellspawn
· Личное сообщение · #25

BaGiE
до этого мы дошли (rvatooffset - универсальный, спасибо за это =TS=), импорт лежит по адресу 1EE, дальше хуже...
как писал =TS= Там RVA FirstChunk = 0x857f11e8 =( т.е. надо отбросить часть
0x857f11e8 and 0000FFFF = 11E8 тогда всё более менее норм.. но интересно, как поступает ОС в данном случае? я пока не знаю, как исправить алго так, чтобы в этом файле (да и в других) импорт показывался нормально...

-----
[nice coder and reverser]





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 10 августа 2006 15:10
· Личное сообщение · #26

Hellspawn если ты юзаешь CreateFileMapping, то можешь юзать его так:
CreateFileMapping(hFile, nil, PAGE_READONLY or SEC_IMAGE, 0, 0, nil); Тогда файл разместится в памяти так как если бы его грузил виндовый лоадер. Тогда функции типа OffsetToRva не понадобятся и ты получишь нормальный файл. Но тогда тебе чувствую много придется переписывать. Но может это стоит того? Я столкнулся с примерно такой же ситуацией, когда проект был написан на 50%. Но я решился на переделку, исправлял всё за 3 дня но теперь я абсолютно доволен.

-----
Yann Tiersen best and do not fuck





Ранг: 61.7 (постоянный)
Активность: 0.050
Статус: Участник
я

Создано: 10 августа 2006 15:11
· Личное сообщение · #27

откуда ты взял 0x857f11e8!!!!!! он равен 000011E8 и указывает на первую секцию...



Ранг: 66.8 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 10 августа 2006 15:19 · Поправил: UsAr
· Личное сообщение · #28

[...]




Ранг: 61.7 (постоянный)
Активность: 0.050
Статус: Участник
я

Создано: 10 августа 2006 15:19
· Личное сообщение · #29

а потому что FirstChunk в этом файле не dword а word. те.е старшая часть слова 0x857f11e8! ,те. эти тупые 0x857fxxxx на диске указываеют в другую секцию!!!! т.е. они являеются ДРУГОЙ секцией а когда файл загрузится то загрузчик грузит тока этот word, а не весь dword т.к. секция уже закончилась и понятно что в памяти будет не 0x857f11e8, а 0x000011E8!!!




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

Создано: 10 августа 2006 15:20 · Поправил: Hellspawn
· Личное сообщение · #30

IMP:=PIMAGE_IMPORT_DESCRIPTOR(pointer(FP+dd));
dd=1EE и после этого
imp.FirstThunk = 857f11e8 т.е. получается выезд на 2 байта... хм =\ что-то неправильно в структуре?

адд

я понял, теперь вопрос как исправить?

-----
[nice coder and reverser]



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


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