![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Перевод структуры Си на Pas
Burmistroff © (2002-06-03 21:46:00)Помогите пожалуйста перевести с Си на Pas:
Имеется структера
typedef structIMAGE_IMPORT_DESCRIPTOR {
union{
DWORD Characteristics;
DWORD OriginalFirstThunk;
} u;
DWORD TimeDateStamp;
DWORD ForwarderChain;
DWORD Name;
DWORD FirstThunk;
} IMAGE_IMPORT_DESCRIPTOR;
Возникает вопрос:
1) что такое union?
2) реальный размер структуры 20 байт, но по моим подсчетам получается 24. Откуда берутся лишние 4 байта?
Благодарю за помошь
Cobalt (2002-06-14 07:27:00) [1]А вы не путаете содержимое файла и содержимое памяти?
Burmistroff (2002-06-05 15:20:00) [2]> cdaDmitriy
OK
> KSergey
Т.е. переменная типа ^IMAGE_THUNK_DATA имеет адрес (допустим) $4000. Причём в памяти по этому адресу (от $4000 до $4003) лежат четыре байта {75 32 F5 77}. Т.е. это данные массива IMAGE_THUNK_DATA.
Так вот, если верить словам автора http://www.wasm.zite.ru/tuts/petut06.shtmlи http://ddcrack.myetang.com/material/pe_tutorial/pe-tut6.htm, этот адрес является указателем на другой массив. Опытным путём мне удалось установить адрес этого массива - $4122. Т.е. если бы всё было верно, то массив ^IMAGE_THUNK_DATA интерпритировался бы как {00 00 22 41}. Вот я и думаю, может в слове union и заложен алгоритм правильной интерпритации данных, ибо в исходниках на Си нет не каких хитрых преобразований полученного адреса (надо полагать что у них он "читается" сразу как надо).
KSergey (2002-06-05 12:21:00) [3]Не понятно что значит "соответсвуют в памяти байты {75 32 F5 77}" Это адреса, данные или что? И как они соотносятся с {22 41 00 00}? Я что-то никак не скорелирую. Выразитесь яснее, пожалуйста
cdaDmitriy (2002-06-05 09:23:00) [4]>> Burmistroff
КОГДА ДОВЕДЕШЬ до "ума" эту задачу пришли мне исходники
если не жалко. Или вопросы более детально на email
Burmistroff (2002-06-04 23:09:00) [5]Благодарю за помощь.
Тогда, если я не ошибаюсь, структура
typedef struct IMAGE_THUNK_DATA {
union {
uint8_t* ForwarderString;
uint32_t* Function;
uint32_t Ordinal;
PIMAGE_IMPORT_BY_NAME AddressOfData;
} u1;
} IMAGE_THUNK_DATA;
будет выглядеть вот так:
IMAGE_THUNK_DATA = packed record
u1: packed record
case integer of
0: (ForwarderString: PByte);
1: (Function_: PDWORD);
2: (Ordinal: DWORD);
3: (AddressOfData: PIMAGE_IMPORT_BY_NAME);
end;
end;
Но возникает проблема:
Если все верно, тогда каким то образом если этой структуре соответсвуют в памяти байты {75 32 F5 77}, должно получаться, что AddressOfData = {22 41 00 00} (или $4122), однако этого не происходит. Может ли все дело быть в этом "union" или ошибка где-то в другм месте?
cdaDmitriy (2002-06-04 11:49:00) [6]>> Burmistroff
Твоя почта не работает У меня есть примеры использования
IMAGE_IMPORT_DESCRIPTOR
если хочешь пришли запрос на мою почту
vuk (2002-06-04 00:33:00) [7]to paul_shmakov:
Полностью поддерживаю. Я сначала так и написал, но потом подумал, что packed в данном случае будет лишним.
paul_shmakov (2002-06-03 23:50:00) [8]только советую packed record использовать. здесь это не критично, но обчно бывает полезно.
vuk (2002-06-03 22:38:00) [9]union - объединение в C. В паскале объединению соответствует запись с вариантной частью.
IMAGE_IMPORT_DESCRIPTOR = record
u : record
case integer of
0 : (Characteristics : DWORD);
1 : (OriginalFirstThunk : DWORD);
end;
TimeDateStamp : DWORD;
ForwarderChain : DWORD;
Name : DWORD;
FirstThunk : DWORD;
end;