Форум программистов, компьютерный форум, киберфорум
Низкоуровневое программирование
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/15: Рейтинг темы: голосов - 15, средняя оценка - 5.00
14 / 14 / 8
Регистрация: 26.09.2007
Сообщений: 919

Преобразование адресов

19.12.2023, 21:04. Показов 3427. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть приложение, я смотрел в IDA его адресация начинаеться с 0x10000.

Функция main() этого приложения в IDA по адресу 0x00038460

Я отнял 38460 - 10000 (hex) и получил линейный адрес 28460 - как этот линейный адрес преобразовать в СЕГМЕНТ:СМЕЩЕНИЕ? То есть xxxx:xxxx.

Добавлено через 13 минут
Так же для этой программы IDA в заголовке пишет

Program Entry Point (CS:EIP) 1:0003A574h

Как перевести адрес в сегмент- смещение?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.12.2023, 21:04
Ответы с готовыми решениями:

Вычисление адресов
Вычислить адреса: 1) mov bx, ss:; 2) jmp ; 3) mov al, byte ptr. При вычислении адреса считать: DS=0010h, SS=1000h,...

Преобразование списка адресов
Возникли трудности, не могу решить задачу с переводом адресов в числа. Есть файл с таким содержанием: (данные разделены пробелами, я...

NAT Преобразование сетевых адресов
Всем известно понятие NAT (Network address translation) Преобразование сетевых адресов. Давайте разберёмся подробнее. Самый задаваемые...

3
267 / 199 / 30
Регистрация: 26.11.2022
Сообщений: 859
19.12.2023, 22:01
Цитата Сообщение от kurlyak Посмотреть сообщение
СЕГМЕНТ:СМЕЩЕНИЕ
Цитата Сообщение от kurlyak Посмотреть сообщение
CS:EIP
Это для реального режима процессора? вы уверены?
вы походу запутались в режимах работы процессора.
CS:EIP это для 32х битного защищённого режима работы. этот адрес нельзя просто так преобразовать в сегмент:смещение
1
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
22.12.2023, 10:43
Цитата Сообщение от kurlyak Посмотреть сообщение
его адресация начинаеться с 0x10000.
Это о relocation base address в таблице объектов LE/LX файла?

Object Table
======================================== ======================================
object 1: virtual memory size = 00007E03H
relocation base address = 00010000H
object flag bits = 00002045H
object page table index = 00000001H
# of object page table entries = 00000008H
reserved = 00000000H
flags = READABLE|EXECUTABLE|PRELOAD|BIG
Windows Batch file
1
..\binnt64\wdump .\ctags.exe
Кликните здесь для просмотра всего текста
Code
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
load module length                                   = 0000B900H
 
                      Linear EXE Header (OS/2 V2.x) - LE                      
==============================================================================
file offset = 0000B900H
 
byte order (0==little endian, 1==big endian)      =       00H
word order       "                "               =       00H
linear EXE format level                           = 00000000H
cpu type                                          =     0002H
os type (1==OS/2, 2==Windows, 3==DOS4, 4==Win386) =     0001H
module version                                    = 00000000H
module flags                                      = 00000200H
# module pages                                    = 00000009H
object # for initial EIP                          = 00000001H
initial EIP                                       = 00002DD0H
object # for initial ESP                          = 00000002H
initial ESP                                       = 000071B0H
page size                                         = 00001000H
last page size (LE)/page shift (LX)               = 00000DF4H
fixup section size                                = 00001124H
fixup section checksum                            = 00000000H
loader section size                               = 0000005EH
loader section checksum                           = 00000000H
object table offset                               = 000000C4H
# of objects in module                            = 00000002H
object page map offset                            = 000000F4H
object iterated data map offset                   = 00000000H
offset of resource table                          = 00000118H
# of resource entries                             = 00000000H
offset of resident name table                     = 00000118H
offset of entry table                             = 00000121H
offset of module directive table                  = 00000000H
# of module directives                            = 00000000H
offset of fixup page table                        = 00000122H
offset of fixup record table                      = 0000014AH
offset of import module name table                = 00001245H
# of entries in import module name table          = 00000000H
offset of import procedure name table             = 00001245H
offset of per-page checksum table                 = 00000000H
offset of enumerated data pages                   = 0000CB48H
# of pre-load pages                               = 00000000H
offset of non-resident names table (rel file)     = 00000000H
size of non-resident names table                  = 00000000H
non-resident names table checksum                 = 00000000H
object # for automatic data object                = 00000002H
offset of the debugging information               = 00000000H
size of the debugging information                 = 00000000H
# of instance pages in the preload section        = 00000000H
# of instance pages in the demand load section    = 00000000H
size of heap (for 16-bit apps)                    = 00000000H
size of stack                                     = 00005000H
Module Flags = PROGRAM | WINDOWCOMPAT
 
                                 Object Table                                 
==============================================================================
object  1: virtual memory size             = 00007E03H
          relocation base address          = 00010000H
          object flag bits                 = 00002045H
          object page table index          = 00000001H
          # of object page table entries   = 00000008H
          reserved                         = 00000000H
          flags = READABLE|EXECUTABLE|PRELOAD|BIG
 
object  2: virtual memory size             = 000071B0H
          relocation base address          = 00020000H
          object flag bits                 = 00002043H
          object page table index          = 00000009H
          # of object page table entries   = 00000001H
          reserved                         = 00000000H
          flags = READABLE|WRITABLE|PRELOAD|BIG
 
                             Resident Names Table                             
==============================================================================
ordinal 0000: ctags
 
                               Fixup Page Table                               
==============================================================================
  0:00000000       1:000003B8       2:000006CF       3:0000090D
  4:00000929       5:00000B13       6:00000D12       7:00000E1C
  8:00000FCE       9:000010FB
Это адрес начала объекта, исходя из которого компоновщик проставил адресные ссылки в файле.
Если загрузчику удастся загрузить все объекты по тем адресам, которые указаны в таблице объектов, то загрузчик может копировать содержимое страниц программы из файла без изменений.
Если адреса в итоге будут другие, то загрузчик должен модифицировать ссылки по таблице Fixup, чтобы адреса соответствовали фактическим.
0
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6206 / 2441 / 402
Регистрация: 29.07.2014
Сообщений: 3,174
Записей в блоге: 4
22.12.2023, 20:51
Лучший ответ Сообщение было отмечено Mikl___ как решение

Решение

Цитата Сообщение от kurlyak Посмотреть сообщение
Как перевести адрес в сегмент- смещение?
Адресация памяти зависит от режима работы CPU:

• в 16-бит реальном(RM) CS:IP = сегмент:смещение.
Память физическая. Всего 16 сегментов по 64КБ = 1МБ памяти.

• в 32-бит защищённом(PM) CS:EIP = селектор:смещение.
Память виртуальная, адрес логический/линейный. Адресация с нуля и до 232 байт = 4ГБ.
Всё линейное пространство считается одним вирт.сегментом, который делится на 4-КБайтные страницы.
В сегментных регистрах хранятся "селекторы" (а не номера сегментов как в RM), которые указывают на дескрипторы в глобальной таблице GDT. Защита регионов памяти 2-уровневая - это биты в дескрипторах (воздействуют на весь сегмент), и биты в записях отдельных страниц PTE (Page Table Entry).

Когда CPU переходит в PM, система создаёт служебные таблицы для поддержки вирт.памяти. Эти таблицы использует позже "транслятор адреса" в блоке управления памятью MMU (Memory Management Unit в процессоре). Если режим х32, то таких таблиц всего 2: PageDirectoryTable(PDT) и PageTable(PT). Каждая из них имеет свои записи "Entry", PDE и PTE соответственно.



Таблица PDT одна и в её 1024 записях PDE лежат указатели на 1024 таблиц PT, в которых (в свою очередь) тоже по 1024 записи PTE, каждая из которых описывает уже конкретный фрейм физ.памяти. Младшие 12-бит вирт.адреса выделяются под смещение байта внутри указанного фрейма. Размеры вирт.страниц и фреймов физ.памяти ОЗУ всегда одинаковы, и в дефолте равны 4КБ. Таким образом, именно на уровне записей PTE адрес вирт.страниц превращается в номер-фрейма PFN физ.памяти "Physical Frame Number".



Обслуживаящие MMU процедуры имеют базу всех фреймов, где ведётся их учёт на предмет занят/свободен. Когда в базе PFN заканчиваются свободные фреймы, занятые могут временно выгружаться на диск в файл подкачки "Pagefile" - собственно это и создаёт иллюзию наличия 4ГБ памяти, хотя в реале ОЗУ может быть меньше, например 512МБ.

Отладчик WinDbg имеет несколько расширений для просмотра структур вирт и физ.памяти.
Например !memusage с ключом(8) дампит базу PFN по такой схеме:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
0: kd> !memusage 8
loading PFN database (100% complete)
Compiling memory usage data (99% Complete).
             Zeroed:    266 (  1064 kb)
               Free:      2 (     8 kb)
            Standby: 220613 (882452 kb)
           Modified:  25074 (100296 kb)
    ModifiedNoWrite:    123 (   492 kb)
       Active/Valid: 275669 (1102676 kb)
         Transition:     43 (   172 kb)
                Bad:      0 (     0 kb)
            Unknown:      0 (     0 kb)
              TOTAL: 521790 (2087160 kb)
Записи PTE в ядре описывает структура _MMPTE, а значит и её можно просмотреть её в отладчике. Структура имеет всего одно безымянное поле(u), которое необходимо раскрыть. Команда отладчика dt (DisplayType) имеет пару интересных ключей: -b рекурсивно раскрывает все вложенные структуры, а –v возвращает кол-во элементов и размеры структур:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
0: kd> dt _mmpte
nt!_MMPTE
   +0x000 u     : <unnamed-tag>
;------------------
0: kd> dt _mmpte u.
nt!_MMPTE
   +0x000 u  :
      +0x000 Long         : Uint8B
      +0x000 VolatileLong : Uint8B
      +0x000 Hard         : _MMPTE_HARDWARE
      +0x000 Flush        : _HARDWARE_PTE
      +0x000 Proto        : _MMPTE_PROTOTYPE
      +0x000 Soft         : _MMPTE_SOFTWARE
      +0x000 TimeStamp    : _MMPTE_TIMESTAMP
      +0x000 Trans        : _MMPTE_TRANSITION
      +0x000 Subsect      : _MMPTE_SUBSECTION
      +0x000 List         : _MMPTE_LIST
Как видим, MMPTE является контейнером для 8-ми вложенных структур, а для нас интересны только 3 из них:
• Hard – описывает типичный фрейм в физ.памяти,
• Proto – прототип PFN для расшаренных фреймов,
• Soft – фрейм выгружен в файл-подкачки на диск.

Чтобы определить тип записи PTE, диспетчер проверяет в каждой из этих структур бит(0) "Valid". Он может быть выставлен в единицу только в одной из 8-ми структур, а в остальных будет сброшен – так диспетчер понимает, с фреймом какого типа имеет дело:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
0: kd> dt _MMPTE u.Hard.
nt!_MMPTE
   +0x000 u       :
      +0x000 Hard    :
         +0x000 Valid           : Pos 0,  1  Bit
         +0x000 Dirty1          : Pos 1,  1  Bit
         +0x000 Owner           : Pos 2,  1  Bit
         +0x000 WriteThrough    : Pos 3,  1  Bit
         +0x000 CacheDisable    : Pos 4,  1  Bit
         +0x000 Accessed        : Pos 5,  1  Bit
         +0x000 Dirty           : Pos 6,  1  Bit
         +0x000 LargePage       : Pos 7,  1  Bit
         +0x000 Global          : Pos 8,  1  Bit
         +0x000 CopyOnWrite     : Pos 9,  1  Bit
         +0x000 Unused          : Pos 10, 1  Bit
         +0x000 Write           : Pos 11, 1  Bit
         +0x000 PageFrameNumber : Pos 12, 36 Bits
         +0x000 reserved1       : Pos 48, 4  Bits
         +0x000 SoftwareWsIndex : Pos 52, 11 Bits
         +0x000 NoExecute       : Pos 63, 1  Bit
В записи "Soft", которая описывает сброшенный в подкачку фрейм имеется 2 поля под указатель на PageFile.sys. Здесь нужно учитывать, что системы класса Win могут иметь макс.16 файлов подкачки (хотя на практике используется только один), поэтому 4-битное поле "PageFileLow" в структуре MMPTE.Soft хранит номер файла, а 32-битное "PageFileHigh" – это индекс выгруженного фрейма в нём:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
0: kd> dt _MMPTE u.Soft.
nt!_MMPTE
   +0x000 u       :
      +0x000 Soft    :
         +0x000 Valid                : Pos 0,  1  Bit
         +0x000 PageFileLow          : Pos 1,  4  Bits
         +0x000 Protection           : Pos 5,  5  Bits
         +0x000 Prototype            : Pos 10, 1  Bit
         +0x000 Transition           : Pos 11, 1  Bit
         +0x000 UsedPageTableEntries : Pos 12, 10 Bits
         +0x000 InStore              : Pos 22, 1  Bit
         +0x000 Reserved             : Pos 23, 9  Bits
         +0x000 PageFileHigh         : Pos 32, 32 Bits
Для просмотра записей-страниц отладчик имеет специальное расширение !pte. В качестве аргумента, команда ожидает вирт.адрес страницы, а из выхлопной трубы выдаёт нам детали связанного с ней фрейма. В данном случае TC интересует EntryPoint 0x0003A574, который и отправим аргументом:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
0: kd> !pte 0003A574
                                           VA 000000000003a574
PXE at FFFFF6FB7DBED000     PPE at FFFFF6FB7DA00000     PDE at FFFFF6FB40000010     PTE at FFFFF68000002000
contains 00C000000B8B7867   contains 0110000060B3A867   contains 1E000000288A3867   contains A3300000644B3867
pfn b8b7      ---DA--UWEV   pfn 60b3a     ---DA--UWEV   pfn 288a3     ---DA--UWEV   pfn 644b3     ---DA--UW-V
 
;//---------------------------------------------------------
;//------------- Флаги защиты [ ---DA—UWEV ] ---------------
;//---------------------------------------------------------
0x200  C  -  Copy on Write.  
0x100  G  -  Global.  
0x080  L  -  Large page (большой фрейм, флаг только в PDE)  
0x040  D  -  Dirty (изменённый)
0x020  A  -  Accessed (был доступ) 
0x010  N  -  Cache disabled (некэшируемый)
0x008  T  -  Write-through (сквозная запись на диск)
0x004  U  K  Owner (владелец, user\kernel)  
0x002  W  R  Writeable или Read-only
0x001  V  -  Valid (вилидная запись)
       E  -  Execute page. Для платформ без аппаратного бита NX, всегда отображается буква E.
Я тестирую на х64, а потому к таблицам PDT и PT транслятора добавились ещё 2 таблицы вернего уровня PXE+PPE. Так-же видим номера фреймов PFN и флаги. Например таблица PDT лежит в физ.фрейме 0x228A3 и т.д. Поскольку младшие 12-бит вирт.адреса 0x0003A574 отводятся под смещение внутри 4КБ страницы, значит обнулив их получим номер вирт.страницы 0x0003A000, которая отображается во-фрейм 0x644b3 (см.последний столбец PTE).

Или ещё эксперимент..
Запустим любое приложение (у меня pass.exe) и запросим у WinDbg инфу о нём.
Далее, получив адрес каталога процесса "DirBase", отправим его расширению !vtop, что подразумевает "Virtual-To-Physical". В хвосте можно запросить и конкретный адрес внутри тестового приложения, пусть это будет дефолтная база РЕ-файлов в памяти 0x00400000:
Code
1
2
3
4
5
6
7
8
0: kd> !vtop 37588000 400000
Amd64VtoP: Virt 00000000`00400000, pagedir 37588000
Amd64VtoP: PML4E  37588000
Amd64VtoP: PDPE   0eef6000
Amd64VtoP: PDE    6ae7a010
Amd64VtoP: PTE    4557b000
Amd64VtoP: Mapped phys 71068000
Virtual address 400000 translates to physical address 71068000 <-------
Здесь видим, что в данном случае вирт.адресу 0х0040000 соответствует физ.адрес 0x71068000. Если-же закрыть прожку и запустить её вновь, то с вероятность 99% физ.адрес уже изменится. Теперь можно запросить дамп памяти по физ.адресу, для чего предусмотрена команда отладчика !dc - упс.. и вправду попали в заголовок РЕ с сигнатурой "MZ":
Code
1
2
3
4
5
6
7
8
9
0: kd> !dc 71068000
#71068000  00805a4d 00000001 00100004 0000ffff  MZ..............
#71068010  00000140 00000000 00000040 00000000  @.......@.......
#71068020  00000000 00000000 00000000 00000000  ................
#71068030  00000000 00000000 00000000 00000080  ................
#71068040  0eba1f0e cd09b400 4c01b821 685421cd  ........!..L.!Th
#71068050  70207369 72676f72 63206d61 6f6e6e61  is program canno
#71068060  65622074 6e757220 206e6920 20534f44  t be run in DOS
#71068070  65646f6d 240a0d2e 00000000 00000000  mode...$........
А вообще с вирт.памятью связано множество системных таблиц, например древо VAD процесса "Virtual Address Descriptor", MDL "Memory Descriptor List", и некоторые другие. В библии М.Руссиновича в красках расписываются все их детали. Я когда-то писал софт для сбора инфы о PFN на конкретной машине, который цепляю в скрепку. Поскольку общее число физ.фреймов напрямую зависит от размера страниц и объёма установленной ОЗУ, то прожка считает их по такой схеме:

Вложения
Тип файла: zip PfnInfo.zip (1.0 Кб, 2 просмотров)
3
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.12.2023, 20:51
Помогаю со студенческими работами здесь

Преобразование сетевых адресов NAT
Помогите решить пожалуйста

Преобразование сетевых адресов NAT
Доброго времени суток, возникла проблема при настройке NAT/PAT на маршрутизаторе. Прикрепил файл с топологией. Суть проблемы в том,...

Преобразование сетевых адресов nat
В данной работе необходимо решить задачу вывода компьютеров локальной сети организации в интернет. Локальная сеть настроена в частной...

Преобразование сетевых адресов NAT
На схеме представлена локальную сеть, состоящая из 2х подсетей, организованных в виде дерева , соединенный с кластером Cluster0 ( данный...

Слишком строгий NAT (преобразование сетевых адресов).
Здравствуйте. Я решил поиграть в ГТА 4 по сети, и у меня пишет что слишком строгий NAT. У меня кабель подключён напрямую. Долгое гугление...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru