Ask
че за таблица разделов в пе файле?
Ask
где конкретно написано что перед таблицей секций байты левые могут быть
Eugene
https://docs.microsoft.com/en-us/windows/win32/debug/pe-format#section-table-section-headers
Я ж тебе ту же самую ссылку прислал!
Eugene
И выдержку, где написано, что section table идёт сразу после заголовков.
Anonymous
Anonymous
Сейчас пришлю настоящую ссыль
Anonymous
страница 62
Ask
нам искать и качать эту книгу?
Anonymous
#book https://konyakov.ru/pubs/books/kris-kaspersky-r_i_p/kris-kaspersky-15.pdf
Ask
и че не так? написано что у кого кривые руки неправильно высчитывают начало таблицы секции
JeisonWi
Советую вместо чтения этого взять примеры и слайды от Ange Albertini (corkami)
JeisonWi
Он лет 10(?) назад создал хороший наборчик
JeisonWi
https://github.com/corkami/pocs/tree/master/PE
JeisonWi
https://github.com/corkami/pics/tree/master/binary/pe101
0neAn0ther
Да, Крис Каспреский четкий был спец. Мало таких. Жаль что безвременно ушел.
Anonymous
Есть ли хорошее описание import table кроме MSDN ?
Eugene
Загугли. Такая инфа должна находиться элементарно.
Eugene
Подскажите, как указать в асм-вставке GCC, что входной регистр изменяется? Грубо говоря, asm volatile( "cld\n\t" "rep movsl\n\t" : : "S"(src), "D"(dst), "c"(count) ); Я не могу прописать "esi", "edi", "ecx" в списке clobbers, что делать-то?
Eugene
И ещё вопрос: как указать метку, которая используется внутри asm-вставки? Скажем, asm( "test %eax, %eax\n\t" "jz zero\n\t" "inc %eax\n\t" "zero:\n\t" ); Сделать вот эту zero уникальной. Чтоб не случилось так, что метка с таким же именем объявлена где-то ещё.
Eugene
В доке пишут, что нет способа указать, что входной регистр изменяется, если не указать его в списке выходных параметров. Но что мне там указывать? Я же не могу написать в списке выходных параметров просто "S", "D", "c" без скобок. А указывать во входных просто "r" и в асме писать mov %0, %%esi и т.д. — это тоже как-то тупо (лишние пересылки туда-сюда, и кстати, не факт, что получится, может тупо не хватить регистров, если их будет больше, чем 3). Можно сохранить и восстановить эти регистры (push/pop) внутри асм-вставки, но это тоже лишние танцы с бубном. Тут ещё один вопрос рождается: если я указал в clobbers callee-save регистры, мне же не нужно их сохранять/восстанавливать, верно (точнее говоря, я надеюсь), компилятор сделает это сам?
Anonymous
только что сделал если кому надо берите )
Aiwan \ (•◡•) / _bot
только что сделал если кому надо берите )
z:\masm32\include\windows.inc берите кому надо, только что скопировал ))))
Anonymous
а я вручную делал под fasm
Aiwan \ (•◡•) / _bot
а чего тогда не полностью? было бы замечательно
bilka00
а разве в фасме нет этих инклудов?
Aiwan \ (•◡•) / _bot
с этими структурами вроде нет. там по библиотекам идет все
Aiwan \ (•◡•) / _bot
Anonymous
я буду дополнять этот файл
bilka00
ух, надо будет собрать все в кучу
bilka00
а то я по привычке играю в посчитай байты для смещения
Anonymous
хехе
Eugene
Обьяви фиктивную переменную и привяжи к ней регистр как выходной параметр
Хочешь сказать, что компилер её заоптимизирует и ничего не будет генерить код?
Vladimir
Это же просто директива, говорящая компилятору, что состояние регтстра меняется
Eugene
Ну да, они удаляются (уже при -O1, остаются только при -O0).
Eugene
Но я надеялся, что есть более красивый выход. Может, модификаторы какие-то.
Eugene
Спасибо за идею (хотя ведь думал же об этом, но не стал даже пробовать).
Eugene
А почему не использовать локальные метки? Ну типа "test eax,eax; jz 1f; inc eax; 1:"
Да, я в итоге так и сделал. В принципе, 10 шт всегда хватит :))
Dmitrij
Да, я в итоге так и сделал. В принципе, 10 шт всегда хватит :))
Если нужно больше 10, - то логику меток/переходов организовать должным образом и всё: 1: jmp 2f 2: jmp 3f 3: jmp 4f 4: jmp 5f 5: jmp 6f 6: jmp 7f 7: jmp 8f 8: jmp 9f 9: jmp 1f; OR jump to 1b ? 1: jmp 2f 2:
Eugene
Если нужно больше 10, - то логику меток/переходов организовать должным образом и всё: 1: jmp 2f 2: jmp 3f 3: jmp 4f 4: jmp 5f 5: jmp 6f 6: jmp 7f 7: jmp 8f 8: jmp 9f 9: jmp 1f; OR jump to 1b ? 1: jmp 2f 2:
Такую логику можно сделать проще: jmp 1f 1: jmp 1f 1: jmp 1f 1: jmp 1f 1: jmp 1f 1: jmp 1f Я говорю про случаи, когда метки и jump'ы переплетены. Но это крайне редкие случаи. И тут скорее встанет вопрос именования, т.к. по номерам будет сложно ориентироваться.
Dmitrij
Такую логику можно сделать проще: jmp 1f 1: jmp 1f 1: jmp 1f 1: jmp 1f 1: jmp 1f 1: jmp 1f Я говорю про случаи, когда метки и jump'ы переплетены. Но это крайне редкие случаи. И тут скорее встанет вопрос именования, т.к. по номерам будет сложно ориентироваться.
В макросах есть такой ещё приём (чтобы имена генерились с числом соответствующему проходу парсера - чтобы при разворачивании макроса не было конфликтов в именах лэйблов, если не ошибаюсь - применимо к GCC/GAS): .macro my_macro my_label\@: .endm \@ - будет заменено числом
Anonymous
visual studio compiler в чем ошибка? __asm { push ax push edi push ecx lahf cld xor al, al mov edi, dword ptr [Address]; mov ecx, dword ptr [size]; rep stosb sahf pop ecx pop edi pop ax }
Anonymous
он ругается на mov ecx,dword ptr [size]
Anonymous
не понимаю просто
Anonymous
error C2400: синтаксическая ошибка во встроенном коде на языке ассемблера в "второй операнд"; обнаружено "]
Anonymous
точки запятые я убирал тоже ругается делал так mov ecx,[size] тоже ругается
Anonymous
может я так даже подумал mov ecx,size но тоже ругается
Eugene
Что такое size, как он объявлен?
Anonymous
DWORD Size = POINTER_PE_SECTION_TABLE->SizeOfRawData; DWORD Address = POINTER_PE_SECTION_TABLE->Misc.PhysicalAddress;
Eugene
А, ну size — это зарезервированное слово, скорее всего. Переименуй.
Eugene
Или нет, разный регистр первой буквы.
Eugene
Сначала с заглавной напиши попробуй.
Anonymous
тоже пробовал ругается
Eugene
Что именно пробовал?
Anonymous
переименовать в заглавные
Eugene
[Size] с заглавной?
Anonymous
да
Eugene
Тогда поменяй имя вообще.
Anonymous
yes)
Anonymous
спасибо) видимо size это да
Anonymous
prefetch не очень понял что именно в кеш загружает опкоды операндов ?
Anonymous
https://www.felixcloutier.com/x86/prefetchh
Eugene
Почему опкоды-то? Загружает кэш линию данными из памяти.
Eugene
Если ты знаешь, что будешь читать эти данные позже, можешь заранее загрузить в кэш данные.
Eugene
Правда, во многих случаях спекулятивная выборка сделает это за тебя. Но иногда загрузка вручную помогает.
Anonymous
а почему тогда загружается один байт
Anonymous
используется m8
Anonymous
я не ошибаюсь размер кеша в x86 это 64 байта да ?
Eugene
Не кэша, а линии.
Eugene
используется m8
Спросите у Intel'а :) Этот размер не имеет значения. Мы просто указываем нужный нам байт, а грузится всё равно целая линия. Везде при работе с кэшем указывается адресация m8 (clflush[opt], cldemote, clwb, prefetch*). Плюс размер линии не фиксирован теоретически, его можно определить через cpuid, например. Практически же он всегда (ну или почти всегда) = 64 байтам на x86.
Eugene
; Get cache line size in EAX proc GetCacheLineSize push ebx mov eax,80000000h cpuid ; get max ext. leaf level (EAX) mov ecx,80000006h cmp eax,ecx jb @F mov eax,ecx cpuid ; cache size = ECX [0..7] movzx eax,cl jmp .ok @@: mov eax,1 cpuid ; cache size for CLFLUSH = EBX [8..15] * 8 movzx eax,bh shl eax,3 .ok: pop ebx ret endp
Anonymous
спасибо)
Marsel
есть ли какая программа или утилита чтобы узнать точный размер файла до бита???