Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
21 / 21 / 3
Регистрация: 29.04.2010
Сообщений: 444
1

Найти адрес начала и конца (для каждой секции), чтобы можно было произвести чтение/запись

25.02.2012, 15:41. Показов 1834. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
в структуре IMAGE_SECTION_HEADER есть такое поле: PointerToRawData, в котором находится RVA начала секции. Но если файл загружается не PE-загрузчиком, а загружается с диска, то при обращении по этому адресу будет или access violantation или же мы не туда обратимся. Нужно RVA преобразовать в файловое смещение.
как это можно сделать?

Добавлено через 18 минут
Задача по сути такая. Найти адрес начала и конца (для каждой секции), чтобы можно было произвести чтение/запись оттуда. Кстати, можете подсказать, сколько всего в файле секций? 16? или же их количество не ограничено и может быть вручную установлено при линковке?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.02.2012, 15:41
Ответы с готовыми решениями:

Запись ОС на диск (собственно, с учётом того, чтобы с диска в последующем можно было произвести установку ОС)
Здравствуйте. Мне очень стыдно за незнание такой простой вещи, но тем не менее рано или поздно с...

Структуры. Вывести информацию по победителю в каждой секции и найти средний бал по каждой секции
Ведомости про участников конкурса содержат следующую информацию: фамилию,имя,секцию,набранный...

Найти и вывести информацию о победителе в каждой секции. Найти средний балл каждой секции.
Добрый вечер, друзья) Прошу помочь с кодом, а именно с функцией search_winner. Совсем запутался,...

Сколько надо произвести выстрелов, чтобы можно было ожидать в среднем 80 попаданий в цель?
Вероятность поражения цели при одном выстреле равна 0,4. Сколько надо произвести выстрелов, чтобы...

3
4174 / 1824 / 218
Регистрация: 06.10.2010
Сообщений: 4,111
25.02.2012, 16:49 2
Нужно RVA преобразовать в файловое смещение.
как это можно сделать?
Загрузи файл в память так, как это делает загрузчик. Пример на фасме я уже выкладывал. Могу привести код на Delphi если хочешь.
Кстати, можете подсказать, сколько всего в файле секций? 16?
Количество секций хранится в заголовке PE
1
21 / 21 / 3
Регистрация: 29.04.2010
Сообщений: 444
25.02.2012, 22:08  [ТС] 3
а ты можешь в 2ух словах объяснить как PE-загрузчик загружает в память файл? не код пояснить, а именно сам алгоритм загрузки, если не трудно.

Добавлено через 3 часа 15 минут
Уже нашёл документацию, читаю)))

Добавлено через 45 минут
Цитата Сообщение от murderer Посмотреть сообщение
Загрузи файл в память так, как это делает загрузчик. Пример на фасме я уже выкладывал. Могу привести код на Delphi если хочешь.

Количество секций хранится в заголовке PE
сейчас начал внимательно читать твой код. Некоторое немножко непонятно:
Assembler
1
2
3
4
5
6
7
8
9
invoke GetModuleFileNameW,0,filename,2048
  invoke CreateFileW,filename,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,0,0
  mov    ebx,eax
  invoke ReadFile,ebx,MZHeader,sizeof.MZHeader,i,0
  invoke SetFilePointer,ebx,[MZHeader.OffsetToPEHeader],0,FILE_BEGIN
  invoke ReadFile,ebx,PEHeader,sizeof.PEHeader,i,0
  mov    eax,[PEHeader.NumOfRVAandSizes]
  shl    eax,3
  invoke ReadFile,ebx,DirectoryTable,eax,i,0
Вот тут идёт обращение PEHeader.NumOfRVAandSizes
И эта структура PEHeader определена так:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
PEHeader:
  .PESignature               rd 1
  .CPU_Type                  rw 1
  .Count_of_section          rw 1
  .TimeStamp                 rd 1
  .COFFTablePointer          rd 1
  .COFFTableSize             rd 1
  .NTHeaderSize              rw 1
  .Flags                     rw 1
  .Magic                     rw 1
  .LinkMajor                 rb 1
  .LinkMinor                 rb 1
  .SizeOfCode                rd 1
  .SizeOfInitData            rd 1
  .SizeOfUnInitData          rd 1
  .EntryPointRVA             rd 1
  .BaseOfCode                rd 1
  .BaseOfData                rd 1
  .ImageBase                 rd 1
  .ObjectAlign               rd 1
  .FileAlign                 rd 1
  .OSMajor                   rw 1
  .OSMinor                   rw 1
  .USERMajor                 rw 1
  .USERMinor                 rw 1
  .SubSysMajor               rw 1
  .SubSysMinor               rw 1
  .Reserved                  rd 1
  .ImageSize                 rd 1
  .HeaderSize                rd 1
  .FileCheckSum              rd 1
  .SubSystem                 rw 1
  .DLLFlags                  rw 1
  .StackReserveSize          rd 1
  .StackCommitSize           rd 1
  .HeapReserveSize           rd 1
  .HeapComitSize             rd 1
  .LoaderFlags               rd 1
  .NumOfRVAandSizes          rd 1
sizeof.PEHeader=$-PEHeader
как написано тут (хотя я до конца не въехал в статью) http://www.rsdn.ru/article/baseserv/peloader.xml, нужно сначала обратиться к PE-заголовку. а он немножко иначе выглядит, а именно так:
Assembler
1
2
3
4
5
IMAGE_NT_HEADERS STRUCT
  Signature         DWORD                   ?
  FileHeader        IMAGE_FILE_HEADER       <>
  OptionalHeader    IMAGE_OPTIONAL_HEADER32 <>
IMAGE_NT_HEADERS ENDS
Если тебе не составит труда, выложи всё-таки пример на Delphi И если не трудно, на словах по пунктам поясни как надо сделать правильно. И ещё. на последок. Я гуглил свою проблему и вот на что наткнулся:
ссылка на форум
Здесь в 3ем сообщении пишут: "holod
Загрузка вручную морально устарела. Это плохие способы, приводящие к проблемам совместимости, ибо загрузка выполняется не системным загрузчиком, таким образом многие нюансы не учитываются или весьма трудно решаются. Следует использовать вызов нэйтивного загрузчика с эмуляцией файлов/секций и пр.". Эта загрузка вручную, про которую ты сейчас говоришь или нет?
0
4174 / 1824 / 218
Регистрация: 06.10.2010
Сообщений: 4,111
27.02.2012, 19:23 4
код

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
uses
  Windows,Messages;
 
type
  TMZHeader= packed record
              MZSignature:               word;
              BytesOnLastPage:           word;
              PagesInFile:               word;
              NumberOfRelocationEntries: word;
              ParagraphsInHeader:        word;
              MinimumMemory:             word;
              MaximumMemory:             word;
              Initial_SS:                word;
              Initial_SP:                word;
              CheckSum:                  word;
              Initial_IP:                word;
              Initial_CS:                word;
              RelocationTableOffset:     word;
              OverlayNumber:             word;
              FirstRelocOffset:          word;
              OverlayNum:                word;
              Reserved:                  dword;
              OEMInfo:                   array[0..23] of char;
              OffsetToPEHeader:          dword;
            end;
  TPEHeader= packed record
              PESignature:                dword;
              CPU_Type:                   word;
              Count_of_section:           word;
              TimeStamp:                  dword;
              COFFTablePointer:           dword;
              COFFTableSize:              dword;
              NTHeaderSize:               word;
              Flags:                      word;
              Magic:                      word;
              LinkMajor:                  byte;
              LinkMinor:                  byte;
              SizeOfCode:                 dword;
              SizeOfInitData:             dword;
              SizeOfUnInitData:           dword;
              EntryPointRVA:              dword;
              BaseOfCode:                 dword;
              BaseOfData:                 dword;
              ImageBase:                  dword;
              ObjectAlign:                dword;
              FileAlign:                  dword;
              OSMajor:                    word;
              OSMinor:                    word;
              USERMajor:                  word;
              USERMinor:                  word;
              SubSysMajor:                word;
              SubSysMinor:                word;
              Reserved:                   dword;
              ImageSize:                  dword;
              HeaderSize:                 dword;
              FileCheckSum:               dword;
              SubSystem:                  word;
              DLLFlags:                   word;
              StackReserveSize:           dword;
              StackCommitSize:            dword;
              HeapReserveSize:            dword;
              HeapComitSize:              dword;
              LoaderFlags:                dword;
              NumOfRVAandSizes:           dword;
             end;
  TDirectoryTable=record
                  ExportTableRVA:             dword;
                  ExportDataSize:             dword;
                  ImportTableRVA:             dword;
                  ImportDataSize:             dword;
                  ResourceTableRVA:           dword;
                  ResourceDataSize:           dword;
                  ExceptionTableRVA:          dword;
                  ExceptionDataSize:          dword;
                  SecurityTableRVA:           dword;
                  SecurityDataSize:           dword;
                  FixUpTableRVA:              dword;
                  FixUpDataSize:              dword;
                  DebugTableRVA:              dword;
                  DebugDataSize:              dword;
                  DescriptionRVA:             dword;
                  DescriptionDataSize:        dword;
                  MachineSpecificRVA:         dword;
                  MachnineDataSize:           dword;
                  TLSRVA:                     dword;
                  TLSDataSize:                dword;
                  LoadConfigRVA:              dword;
                  LoadConfigDataSize:         dword;
                  Reserved2:                  int64;
                  IATRVA:                     dword;
                  IATDataSize:                dword;
                  Reserved3:                  array[0..2] of int64;
                  end;
  TObjectTable   =array [0..high(integer) div 40-1] of packed record
                                                       ObjectName:      array[0..7] of char;
                                                       VirtualSize:     dword;
                                                       SectionRVA:      dword;
                                                       PhysicalSize:    dword;
                                                       PhysicalOffset:  dword;
                                                       Reserved:        array[0..11] of byte;
                                                       ObjectFlags:     dword;
                                                       end;
  TImportDirectory=array [0..high(integer) div 20-1] of record
                                                ImportLookUp:   dword;
                                                TimeDateStamp:  dword;
                                                ForwardChain:   dword;
                                                NameRVA:        PChar;
                                                AddresTableRVA: dword;
                                                end;
var
  f,i,j:           dword;
  MZHeader:        TMZHeader;
  PEHeader:        TPEHeader;
  DirectoryTable:  TDirectoryTable;
  ImportDirectory: ^TImportDirectory;
  ObjectTable:     ^TObjectTable;
  s:               string;
  filename:        array[0..1023] of char;
 
  function wsprintfA(lpOut,lpFmt: PAnsiChar): dword;cdecl;varargs;external 'user32.dll';
 
begin
  //Открываем exe-файл
  GetModuleFileName(0,@filename,1024);
  f       :=CreateFile(@filename,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,0,0);
  //Считываем заголовок MZ
  ReadFile(f,MZHeader,sizeof(MZHeader),j,0);
  //Считываем заголовок PE
  SetFilePointer(f,MZHeader.OffsetToPEHeader,0,FILE_BEGIN);
  ReadFile(f,PEHeader,sizeof(PEHeader),j,0);
  //Считываем таблицу каталогов
  ReadFile(f,DirectoryTable,PEHeader.NumOfRVAandSizes shl 3,j,0);
  //Выделяем память под секции
  ObjectTable:=VirtualAlloc(0,PEHeader.ImageSize,MEM_COMMIT,PAGE_READWRITE);
  //Считываем таблицу секций
  ReadFile(f,ObjectTable^,PEHeader.Count_of_section*sizeof(ObjectTable^[0]),j,0);
 
  //Сччитываем в память секции так, чтобы RVA соответствовало действительности
  for i:=0 to PEHeader.Count_of_section-1 do
  begin
    SetFilePointer(f,ObjectTable^[i].PhysicalOffset,0,FILE_BEGIN);
    ReadFile(f,pointer(dword(ObjectTable)+ObjectTable^[i].SectionRVA)^,ObjectTable^[i].PhysicalSize,j,0);
  end;
 
  //Просматриваем импортируемые библиотеки
  i:=0;
  ImportDirectory:=pointer(dword(ObjectTable)+DirectoryTable.ImportTableRVA);
  while ImportDirectory^[i].AddresTableRVA<>0 do
  begin
      s:=s+PChar(dword(ImportDirectory^[i].NameRVA)+dword(ObjectTable))+#13+#10;
      inc(i);
  end;
 
  MessageBoxA(0,@s[1],0,0);
end.
1
27.02.2012, 19:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.02.2012, 19:23
Помогаю со студенческими работами здесь

Переделать чтобы можно было удалять вводимое количество элементов с конца списка
Здравствуйте, нужна помощь. у меня есть код для списка и отдельная функция для удаления одного из...

Внести изменение в программу «Часы» так, чтобы можно было произвести установку часов и минут
Добрый вечер Требуется сдать лабораторную, используя среду Lazarus. В данной среде вообще не...

Символьный массив: найти в каждой строке позицию начала и конца подстроки S(i)
дан символьный массив строк.найти в каждойстроке позицию начала и конец подстроки S(i). Тоесть,...

Сколько выстрелов ему следует произвести, чтобы с вероятностью, меньшей 0,2, можно было утверждать, что будет не более одного промаха?
Вероятность попадания в цель стрелком при одном выстреле равна 0,5. Сколько выстрелов ему следует...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru