Фейковая таблица импорта

Тема в разделе "WASM.BEGINNERS", создана пользователем piligmindo, 29 фев 2020.

  1. piligmindo

    piligmindo Member

    Публикаций:
    0
    Регистрация:
    31 дек 2018
    Сообщения:
    69
    Что значит сабж? Можно сделать случайный вызов функций WinAPI, но они все равно будут все отображены в таблице импорта? Вне зависимости от того, будут ли каждая из них вызываться или нет.

    И как сделать фейковую таблицу импорта?
     
  2. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.241
    Ну, если делать на уровне исходников С/С++, то тут достаточно добавить следующую строчку в код, и функция попадет в таблицу импорта и не будет вызвана:
    Код (Text):
    1. static void* ptr = (void*)ApiName;
     
    piligmindo нравится это.
  3. piligmindo

    piligmindo Member

    Публикаций:
    0
    Регистрация:
    31 дек 2018
    Сообщения:
    69
    А как, в таком случае, происходит автоматическая генерация всегда разной таблицы импорта?
     
  4. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.241
    В самом простом случае делаешь список апишек, выбираешь псевдослучайные элементы из списка, вставляешь такой шаблон кода (как я описал) куда-нить в исходники, профит. Более сложные генераторы используют правила, например вместе с CreateFile будут добавляться ReadFile или WriteFile и CloseHandle, тк наличие в импорте CreateFile без остальных апишек будет выглядить подозрительно. Это канеш утрированный пример, но все же должно быть понятно.
     
  5. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.954
    Фасм может рандом сид высосать из внешнего файла и подтянуть согласно ему случайных апи в секцию virtual, так они автоматически попадут в импорт.
     
    piligmindo нравится это.
  6. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.241
    В плюсах можно "высосать" сид например захешировав строки из__DATE__ и __TIME__. Но проще сделать например скрипт на Питоне, который всё нагенерит.
     
    piligmindo нравится это.
  7. piligmindo

    piligmindo Member

    Публикаций:
    0
    Регистрация:
    31 дек 2018
    Сообщения:
    69
    А, это на уровне исходников... Я просто думал, что можно сделать так, что бы при каждом новом запуске уже откомпилированного приложения была новая таблица импорта:)
    --- Сообщение объединено, 29 фев 2020 ---
    А зачем такие сложные способы получения случайного числа, если просто можно вызвать GetTickCount?
     
  8. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.241
    На этапе компиляции ты не можешь вызвать GetTickCount.
     
  9. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Такое нужно только для одной цели - сбить аверский эвристик по импорту. В импорт генерится шум, в более сложном случае этим можно сбить и динамику.
     
  10. sl0n

    sl0n Мамонт дзена **

    Публикаций:
    0
    Регистрация:
    26 сен 2003
    Сообщения:
    684
    Я в своем пакере брал инклюды фасма, а при каждой упаковке генерил рандом импорт из них ... еще заблеченые импорты убирал котороые pe studio блечит
     
  11. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.241
    Еще вариант брать прям из таблицы импорта, например питоном генерить и парсить таблицы импорта с помощью библиотеки pefile. Еще вариант взять импорты из файлов Rohitab Api Monitor, там, если ничего не путаю, все импорты в формате xml прописаны, включая типы параметров и возврата функций.
     
  12. piligmindo

    piligmindo Member

    Публикаций:
    0
    Регистрация:
    31 дек 2018
    Сообщения:
    69
    Проверил, это не работает... Даже если volatile добавить
     
  13. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.329
    piligmindo,
    ptr должен использоваться, иначе компоновщик удалит эту переменную из ехе при оптимизации.

    Код (C):
    1.  
    2. static void TouchAPI (HINSTANCE hinst)
    3. {
    4.     LPVOID x;
    5.     DWORD i;
    6.     static LPCVOID ptr[] =
    7.     {
    8.         CreateFile,
    9.         WriteFile,
    10.         ReadFile,
    11.         ...
    12.     };
    13.  
    14.     if (!hinst)
    15.     {
    16.         for (x=NULL, i=0; i<sizeof(ptr)/sizeof(ptr[0]); i++)
    17.             x ^= ptr[i];
    18.  
    19.         printf ("%p", x);
    20.     }
    21. }
    22.  
    23. int WINAPI _tWinMain (HINSTANCE hInstance, ...)
    24. {
    25.     TouchAPI (hInstance);
    26.  
    27.     ...
    28. }
    29.  
     
    Aiks и M0rg0t нравится это.
  14. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.574
    Но в Асме можно нагенерить ерунды вида invoke CreateFile,1,2,3.. , а в Си такой фокус не пройдет (без асм-вставок и подобного). Надо более правдоподобно кодить.
    Просто в таблицу импорта левых апи насовать - не вариант, авер может заметить, что в коде их нет, а в импорте есть, и влепить детект.
     
  15. hiddy

    hiddy Member

    Публикаций:
    0
    Регистрация:
    10 мар 2019
    Сообщения:
    82
    Код (Text):
    1. #pragma comment(linker, "/INCLUDE:ApiPtr")
    2. EXTERN_C CONST PVOID ApiPtr = (PVOID)MessageBoxW;
     
    Aiks нравится это.
  16. nullPtr

    nullPtr Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2020
    Сообщения:
    138
    апну тему

    Данный код у меня вызывает ошибки с lnk2019 неразрешенный внешний символ. Чисто на вин апи пишу
    Случаем, не имеет зависимости от crt?
     
  17. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.241
    Мне вот нравится, неразрешенный внешний символ у него. Какой символ? Почему нельзя сразу проблему в одном сообщении описывать? Тут все телепаты, кроме меня, или что?
     
    Aiks нравится это.
  18. nullPtr

    nullPtr Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2020
    Сообщения:
    138
    Скрин не прикрепился почему-то

    https://prnt.sc/wgs40k
    --- Сообщение объединено, 5 янв 2021 ---
    в целом решил
    void* ptr = (void*)ApiName;
    Убираем static и все норм
     
  19. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.241
    Да, видимо это CRT, я уже давно не использовал студию, но вангую, что это функции инициализации thread local storage для потоков. Это на самом деле странно, тк статическая переменная не должна быть thread local по-умолчанию. Но я по студии не шарю, может кто-то еще подскажет, почему компилятор генерирует вызовы этих функций в твоей точке входа на использование static-переменных.
     
  20. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.574
    потому что студия гуан, я ее иногда юзаю, но много раз говорил - там этот црт везде и всюду суют. У меня 2015 стоит, там static не зависим от црт (в другом коде, этот не пробовал), и он не должен быть зависим, это же особенность чисто языка. Но М$ не знает, куда еще свою ерунду с телеметрией всунуть.