Как добраться до Bound Import Table address ? есть впринципе кусок кода на тасме: Код (Text): mov edi,pPE assume edi:ptr IMAGE_NT_HEADERS mov eax,[edi].OptionalHeader.DataDirectory[sizeof IMAGE_DATA_DIRECTORY * IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].VirtualAddress обьясните как на фасм это переделать ? И подскажите саму суть данной инструкции
mov eax,[edi + IMAGE_NT_HEADERS.OptionalHeader.DataDirectory[sizeof IMAGE_DATA_DIRECTORY * IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].VirtualAddress]
Видимо что-то вроде Код (Text): mov edi,[pPE] mov eax,[edi+IMAGE_NT_HEADERS.OptionalHeader.DataDirectoryBoundImport.VirtualAddress] а суть данной инструкции как раз в получении адреса.
ну поэкспериментируйте sizeof в фасме не оператор, а реализуется макросами. далее непонятно как с индексами там. вы inc которым пользуетесь пропостите, ато это гадание на кофейной гуще. но общий принцип я вам сказал. всякие поля таблиц фасмом преобразуются в смещения от начала таблицы. вы можете рассчитать это смещение предварительно, например через макропернеменную
Инклюд сам делал из winnt.h, который брал c Microsoft Visual Studio, так что там впринципе с индексами все впорядке
да понятно, что вы его не выдумали сами. но как вам ответить если вы основываетесь на том, что есть только у вас? на основании того, чем пользуюсь я? думаете подойдет?
предположительно mov eax,[edi + IMAGE_NT_HEADERS.OptionalHeader.DataDirectory + IMAGE_DATA_DIRECTORY.sizeof * IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT + IMAGE_DATA_DIRECTORY.VirtualAddress] этот кусок IMAGE_DATA_DIRECTORY.sizeof поправьте как у вас sizeof структур организован.
mov edi,[pPE] mov eax,dword [edi + IMAGE_NT_HEADERS.OptionalHeader.DataDirectory + sizeof.IMAGE_DATA_DIRECTORY * IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT + IMAGE_DATA_DIRECTORY.VirtualAddress] в собранном виде: MOV EDI,DWORD PTR DS:[403332] MOV EAX,DWORD PTR DS:[EDI+FE] а должно быть: MOV EDI,DWORD PTR DS:[403332] MOV EAX,DWORD PTR DS:[EDI+D0]
да думаю тут по кофейной гуще гадать действительно не стоит. Где бы почитать про структуру IMAGE_DATA_DIRECTORY и несколько примеров на фасме
чтоб не морочить голову, в аттаче фасм инк, которым пользуюсь я (делал его не я, потому и спасибо не мне) и в котором тот метод, что указан выше проходит. только названия структур/полей скорректируйте. этот инк из ов хидера перештопан
mov eax,dword [edi+IMAGE_NT_HEADERS.OptionalHeader.DataDirectory+(sizeof.IMAGE_DATA_DIRECTORY*IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT+2)] вот это работает, только хз откуда взялись эти +2
ухх. ну возьмите по отдельности IMAGE_NT_HEADERS.OptionalHeader IMAGE_NT_HEADERS.OptionalHeader.DataDirectory sizeof.IMAGE_DATA_DIRECTORY IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT и посмотрите что из них у вас неправильно считается
LEA eax,dword [edi+IMAGE_NT_HEADERS.OptionalHeader] указывает на: Код (Text): Characteristics = EXECUTABLE_IMAGE|32BIT_MACHINE|RELOCS_STRIPPED|LINE_NUMS_STRIPPED|LOCAL_SYMS_STRIPPED LEA eax,dword [edi+IMAGE_NT_HEADERS.OptionalHeader.DataDirectory] указывает на: Код (Text): 00A40166 00 DB 00 00A40167 00 DB 00 00A40168 00000000 DD 00000000 ; Export Table address = 0 LEA eax,dword [edi+IMAGE_NT_HEADERS.OptionalHeader.DataDirectory+(sizeof.IMAGE_DATA_DIRECTORY)] Код (Text): 00A4016E 00 DB 00 00A4016F 00 DB 00 00A40170 802B0100 DD 00012B80 ; Import Table address = 12B80 00A40174 8C000000 DD 0000008C ; Import Table size = 8C (140.) и контрольный: mov eax,dword [edi+IMAGE_NT_HEADERS.OptionalHeader.DataDirectory+(sizeof.IMAGE_DATA_DIRECTORY*IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT)] указывает на: Код (Text): 00A401BE 00 DB 00 00A401BF 00 DB 00 00A401C0 60020000 DD 00000260 ; Bound Import Table address = 260 00A401C4 80000000 DD 00000080 ; Bound Import Table size = 80 (128.) т.е реально идет недобор в 2 байта структуры мои: Код (Text): [b]struct IMAGE_NT_HEADERS [/b] Signature dw ? FileHeader IMAGE_FILE_HEADER OptionalHeader IMAGE_OPTIONAL_HEADER ends [b]struct IMAGE_OPTIONAL_HEADER[/b] Magic dw ? ;->0x18 MajorLinkerVersion db ? ;->0x1A MinorLinkerVersion db ? ;->0x1B SizeOfCode dd ? ;->0x1C SizeOfInitializedData dd ? ;->0x20 SizeOfUninitializedData dd ? ;->0x24 AddressOfEntryPoint dd ? ;->0x28 BaseOfCode dd ? ;->0x2c BaseOfData dd ? ;->0x30 ImageBase dd ? ;->0x34 SectionAlignment dd ? ;->0x38 FileAlignment dd ? ;->0x3c MajorOperatingSystemVersion dw ? ;->0x40 MinorOperatingSystemVersion dw ? ;->0x42 MajorImageVersion dw ? ;->0x44 MinorImageVersion dw ? ;->0x46 MajorSubsystemVersion dw ? ;->0x48 MinorSubsystemVersion dw ? ;->0x4A Win32VersionValue dd ? ;->0x4C SizeOfImage dd ? ;->0x50 SizeOfHeaders dd ? ;->0x54 CheckSum dd ? ;->0x58 Subsystem dw ? ;->0x5C DllCharacteristics dw ? ;->0x5E SizeOfStackReserve dd ? ;->0x60 SizeOfStackCommit dd ? ;->0x64 SizeOfHeapReserve dd ? ;->0x68 SizeOfHeapCommit dd ? ;->0x6C LoaderFlags dd ? ;->0x70 NumberOfRvaAndSizes dd ? ;->0x74 DataDirectory rb (sizeof.IMAGE_DATA_DIRECTORY*16) ;->0x7C ends [b]struct IMAGE_DATA_DIRECTORY[/b] VirtualAddress dd ? Size dd ? ends
так, делаете так int3 mov eax,IMAGE_NT_HEADERS.OptionalHeader mov eax,IMAGE_NT_HEADERS.OptionalHeader.DataDirectory mov eax,sizeof.IMAGE_DATA_DIRECTORY mov eax,IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT компилите, пускаете и сморите в дебугере после каждой команды что у вас в еах (можно и по другому) делаете тоже через С(++) и сверяете. где числа разойдутся, там и проверяйте что вы криво наконвертили. или пользуйтесь инком доброй секретарши
да уж. Я кстати то и сделал в предыдущем посте своем. mov ничего не дал бы, а вот lea дало эффективные адреса смещения. Я кстати и структуры выложил. Вы не внимательный
думаете я все смещения на память знаю? скам mov eax,IMAGE_NT_HEADERS.OptionalHeader запишет в еах число, смещение от начала структуры и до указанного поля в байтах. и так по всем в порядке возрастания. а потом тупо считаете по Сшному хидеру (а лучше заставьте компилер посчитать за вас). где числа разойдутся, там и ошибка. 2 байта ошибки говорит, что вы гдето dw и dd перепутали. а все эти mov eax, ... просто чтоб уменьшить область поиска
LEA eax,dword [edi+IMAGE_NT_HEADERS.OptionalHeader] указывает на: указывает на Characteristics, а не на Magic, вот в чем вопрос. Дальше и ходить ненужно