Что значит сабж? Можно сделать случайный вызов функций WinAPI, но они все равно будут все отображены в таблице импорта? Вне зависимости от того, будут ли каждая из них вызываться или нет. И как сделать фейковую таблицу импорта?
Ну, если делать на уровне исходников С/С++, то тут достаточно добавить следующую строчку в код, и функция попадет в таблицу импорта и не будет вызвана: Code (Text): static void* ptr = (void*)ApiName;
В самом простом случае делаешь список апишек, выбираешь псевдослучайные элементы из списка, вставляешь такой шаблон кода (как я описал) куда-нить в исходники, профит. Более сложные генераторы используют правила, например вместе с CreateFile будут добавляться ReadFile или WriteFile и CloseHandle, тк наличие в импорте CreateFile без остальных апишек будет выглядить подозрительно. Это канеш утрированный пример, но все же должно быть понятно.
Фасм может рандом сид высосать из внешнего файла и подтянуть согласно ему случайных апи в секцию virtual, так они автоматически попадут в импорт.
В плюсах можно "высосать" сид например захешировав строки из__DATE__ и __TIME__. Но проще сделать например скрипт на Питоне, который всё нагенерит.
А, это на уровне исходников... Я просто думал, что можно сделать так, что бы при каждом новом запуске уже откомпилированного приложения была новая таблица импорта --- Сообщение объединено, Feb 29, 2020 --- А зачем такие сложные способы получения случайного числа, если просто можно вызвать GetTickCount?
Такое нужно только для одной цели - сбить аверский эвристик по импорту. В импорт генерится шум, в более сложном случае этим можно сбить и динамику.
Я в своем пакере брал инклюды фасма, а при каждой упаковке генерил рандом импорт из них ... еще заблеченые импорты убирал котороые pe studio блечит
Еще вариант брать прям из таблицы импорта, например питоном генерить и парсить таблицы импорта с помощью библиотеки pefile. Еще вариант взять импорты из файлов Rohitab Api Monitor, там, если ничего не путаю, все импорты в формате xml прописаны, включая типы параметров и возврата функций.
piligmindo, ptr должен использоваться, иначе компоновщик удалит эту переменную из ехе при оптимизации. Code (C): static void TouchAPI (HINSTANCE hinst) { LPVOID x; DWORD i; static LPCVOID ptr[] = { CreateFile, WriteFile, ReadFile, ... }; if (!hinst) { for (x=NULL, i=0; i<sizeof(ptr)/sizeof(ptr[0]); i++) x ^= ptr[i]; printf ("%p", x); } } int WINAPI _tWinMain (HINSTANCE hInstance, ...) { TouchAPI (hInstance); ... }
Но в Асме можно нагенерить ерунды вида invoke CreateFile,1,2,3.. , а в Си такой фокус не пройдет (без асм-вставок и подобного). Надо более правдоподобно кодить. Просто в таблицу импорта левых апи насовать - не вариант, авер может заметить, что в коде их нет, а в импорте есть, и влепить детект.
Code (Text): #pragma comment(linker, "/INCLUDE:ApiPtr") EXTERN_C CONST PVOID ApiPtr = (PVOID)MessageBoxW;
апну тему Данный код у меня вызывает ошибки с lnk2019 неразрешенный внешний символ. Чисто на вин апи пишу Случаем, не имеет зависимости от crt?
Мне вот нравится, неразрешенный внешний символ у него. Какой символ? Почему нельзя сразу проблему в одном сообщении описывать? Тут все телепаты, кроме меня, или что?
Скрин не прикрепился почему-то https://prnt.sc/wgs40k --- Сообщение объединено, Jan 5, 2021 --- в целом решил void* ptr = (void*)ApiName; Убираем static и все норм
Да, видимо это CRT, я уже давно не использовал студию, но вангую, что это функции инициализации thread local storage для потоков. Это на самом деле странно, тк статическая переменная не должна быть thread local по-умолчанию. Но я по студии не шарю, может кто-то еще подскажет, почему компилятор генерирует вызовы этих функций в твоей точке входа на использование static-переменных.
потому что студия гуан, я ее иногда юзаю, но много раз говорил - там этот црт везде и всюду суют. У меня 2015 стоит, там static не зависим от црт (в другом коде, этот не пробовал), и он не должен быть зависим, это же особенность чисто языка. Но М$ не знает, куда еще свою ерунду с телеметрией всунуть.