Долой импорт 2

Тема в разделе "LANGS.C", создана пользователем 2125b532408a4880, 3 окт 2011.

  1. 2125b532408a4880

    2125b532408a4880 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2011
    Сообщения:
    2
    для тех кто "не в теме" вводная статья
    http://www.xakep.ru/magazine/xa/080/116/1.asp
    с нее все начиналось

    утилита для удобного импорта по хешу еще в разработке но уже
    можно юзать

    правила

    файл x3j11.h всегда подключать последним пример
    #include <string.h>
    #include <stdlib.h>
    #include <conio.h>
    #include <windows.h>
    #include <shlwapi.h>
    #include "x3j11.h"
    если вы это забудете миллион ошибок гарантированны также помимо генерации
    файла x3j11.h не забывайте подключать заголовки к соответствующим библиоткам
    полтому что он их не подключает

    дальше хм если вы получите такую ошибку
    error C2914: 'boost::type_of::encode_start'
    значит вы нарвались на перегруженную функцию типа
    const char *strstr(const char *_Str, const char *_SubStr)
    char *strstr(char *_Str, const char *_SubStr)
    вообще лучше их избегать всегда в WINAPI налог есть
    но если код уже написан то открываем x3j11.h делаем
    quick search по символу strstr и видим такое
    Код (Text):
    1. X3J11_CallFunction(strstr,0x4e5cf9ed,0x967c28ff,__VA_ARGS__)
    надо заменить на
    Код (Text):
    1. X3J11_CallOverload(PCH(PCCH,PCCH),0x4e5cf9ed,0x967c28ff,__VA_ARGS__)
    дальше хм утилита генератор заголовка обрабатывает библиотеки
    так как в списке это значит что если первым идет ntdll.dll
    и в нем есть функция strstr а следом идет msvcrt.dll и в нем
    тоже есть strstr то импорт будет из ntdll.dll таким образом
    можно меняя порядок библиотек "тюнить" что откуда "брать"

    дальше пример переделки реальной программы sdbot'a
    компилим оптимизируем по размеру выходит 24.5 кб в списке импорта
    WS2_32.DLL, MSVCRT.DLL, WININET.DLL, KERNEL32.DLL,
    ADVAPI32.DLL, SHELL32.DLL
    запускаем утилиту пишем так же через запятую делаем
    двойной клик и видим два файла x3j11.h и x3j11.cpp
    добавляем их в проект пробуем скомпилировать ошибка
    error C2914: 'boost::type_of::encode_start' делаем клик по ошибке и видим
    что как раз на функции strstr проделываем то что обсуждалось в самом начале
    и пробуем скомпилить снова все успешно собралось смотри осталось только
    MSVCRT.DLL импортирующая одну функцию memset это неявный вызов компилятором
    для обнуления как правило массивов или переменных типа структур у нас это
    PROCESSENTRY32 pe32 = {0} такой код в самом начале WinMain правим на
    memset(&pe32, 0, sizeof(pe32)) компилим теперь таблица импорта вообще изчезла
    и .exe стал чуть меньше 24 кб но главное теперь весь импорт по хещу
    исходник этого бота я прикрепил а так же два варианта его компиляции с таблицей
    импорта и без также прикрепил утилиту генератор и несколько подбиблиотек boost
    исключительно компайл таймовые нужены для некоторой магии

    да кстати все это дело тестировалось на Visual C/C++ 2008 Professional
    Windows XP SP2 x86 так что если 2008 у вас есть пробовать лучше на нем

    чуть не забыл вызовите X3J11_Startup перед вызовами любых других функций

    библиотеки буста необходимые для сборки (1мб)
    http://slil.ru/31798581
    утилита и примеры
    http://slil.ru/31798603
     
  2. karabas_barabas

    karabas_barabas Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    168
    не ну нафига так тему палить, живи и радуйся, как говориться - ан нет, слил в паблик, хотя уже бы в первый левел васма залил , где мемберы с репой выкладывают в приват свои сорцы.
    К тому же тут много аверов тусуется на форуме , позаносят в свои базы сорцы и библиотеки boosta и ппц. :dntknw:
    p.s. vx-сцена еще жива ! )
     
  3. ziral2088

    ziral2088 New Member

    Публикаций:
    0
    Регистрация:
    16 авг 2009
    Сообщения:
    283
    написать свой noimport.c(h) религия не позволяет?
     
  4. fed184ef2d5d4b06

    fed184ef2d5d4b06 New Member

    Публикаций:
    0
    Регистрация:
    4 окт 2011
    Сообщения:
    16
    тут решены важные вещи
    1) типобезопасность это значит что не перепутаеш типы аргументов
    не передаш больше или меньше и переходники генерируются ожидающие
    правильные типы как у вызываемой функции и возвращаемое значение
    также правильного типа по сути переходник точная сигнатурная копия
    вызываемой функции
    2) правильная работа intellisense если навести указатель
    на имя функции покажет натоящую сигнатуру или когда открываеш
    скобочку показывает какие параметры нужны
    3) полностью прозрачная подмена макросы становятся активными
    только во время начала сборки
    4) генерирует правильный вызов для __cdecl __stdcall
    и __cdecl (variadic) функций это значит что помимо winapi (__stdcall)
    можно юзать msvcrt.dll (__cdecl) и variadic (sprintf...) функции

    прикреплю тут а то ссылка slil.ru скоро сдохнет
    утилита и примеры
     
  5. fed184ef2d5d4b06

    fed184ef2d5d4b06 New Member

    Публикаций:
    0
    Регистрация:
    4 окт 2011
    Сообщения:
    16
    [update]
    хотел залить и либы boost'а но файл 1.5 мб хрен закачаеш форум его принимает но ссылку на него не показывает что за хрень ?
     
  6. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    500К по-моему максимум
     
  7. fc2e002425ed46eb

    fc2e002425ed46eb New Member

    Публикаций:
    0
    Регистрация:
    8 окт 2011
    Сообщения:
    1
  8. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Мдааа, конфортно!)))
    Спасибо!
     
  9. 346bf57676v44x

    346bf57676v44x New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2011
    Сообщения:
    4
    пример
    Код (Text):
    1. #include <windows.h>
    2. #include "x3j11.h"
    3.  
    4. int main()
    5. {
    6.     X3J11_Startup();
    7.     MessageBox(0,0,0,0);
    8. }
    минимальный exe 2 кб получается из за включения кода поддержки выше будет расти только от явно написанного кода

    Код (Text):
    1. static volatile LONG lTreeLock;
    2.  
    3. PVOID __stdcall X3J11_Hash2Ptr(DWORD dwFuncHash, DWORD dwModHash)
    4. {
    5. 00401880 55               push        ebp  
    6. 00401881 8B EC            mov         ebp,esp
    7. 00401883 51               push        ecx  
    8.     while (_InterlockedExchange(&lTreeLock, TRUE) == TRUE)
    9. 00401884 B8 01 00 00 00   mov         eax,1
    10. 00401889 B9 48 4F 40 00   mov         ecx,404F48h
    11. 0040188E 87 01            xchg        eax,dword ptr [ecx]
    12. 00401890 83 F8 01         cmp         eax,1
    13. 00401893 75 08            jne         X3J11_Hash2Ptr+1Dh (40189Dh)
    14.         FuncPtr._SwitchToThread();
    15. 00401895 FF 15 8C 4F 40 00 call        dword ptr ds:[404F8Ch]
    16. 0040189B EB E7            jmp         X3J11_Hash2Ptr+4 (401884h)
    17.    
    18.     PVOID pFunc = Tree.Find(dwFuncHash);
    19. 0040189D 8B 55 08         mov         edx,dword ptr [dwFuncHash]
    20. 004018A0 52               push        edx  
    21. 004018A1 B9 00 30 40 00   mov         ecx,403000h
    22. 004018A6 E8 15 FB FF FF   call        CHashMap::Find (4013C0h)
    23. 004018AB 89 45 FC         mov         dword ptr [pFunc],eax
    24.    
    25.     if (!pFunc)
    26. 004018AE 83 7D FC 00      cmp         dword ptr [pFunc],0
    27. 004018B2 75 25            jne         X3J11_Hash2Ptr+59h (4018D9h)
    28.     {
    29.         pFunc = ParseExport(dwFuncHash, dwModHash);  
    30. 004018B4 8B 45 0C         mov         eax,dword ptr [dwModHash]
    31. 004018B7 50               push        eax  
    32. 004018B8 8B 4D 08         mov         ecx,dword ptr [dwFuncHash]
    33. 004018BB 51               push        ecx  
    34. 004018BC E8 0F FF FF FF   call        ParseExport (4017D0h)
    35. 004018C1 83 C4 08         add         esp,8
    36. 004018C4 89 45 FC         mov         dword ptr [pFunc],eax
    37.         Tree.Add(dwFuncHash, pFunc);
    38. 004018C7 8B 55 FC         mov         edx,dword ptr [pFunc]
    39. 004018CA 52               push        edx  
    40. 004018CB 8B 45 08         mov         eax,dword ptr [dwFuncHash]
    41. 004018CE 50               push        eax  
    42. 004018CF B9 00 30 40 00   mov         ecx,403000h
    43. 004018D4 E8 17 FB FF FF   call        CHashMap::Add (4013F0h)
    44.     }
    45.     _InterlockedExchange(&lTreeLock, FALSE);
    46. 004018D9 33 C9            xor         ecx,ecx
    47. 004018DB BA 48 4F 40 00   mov         edx,404F48h
    48. 004018E0 87 0A            xchg        ecx,dword ptr [edx]
    49.  
    50.     return pFunc;
    51. 004018E2 8B 45 FC         mov         eax,dword ptr [pFunc]
    52. }
    53. 004018E5 8B E5            mov         esp,ebp
    54. 004018E7 5D               pop         ebp  
    55. 004018E8 C2 08 00         ret         8
    сейчас поиск в "хранилище" адреса лочится с помощью интринсика <intrin.h> _InterlockedExchange есть еще вариант от которого я отказался даем каждому потоку по "хранилищу" (AVL дерево) для этого досточно объявить как __declspec(thread) CHashMap Tree это работает быстрее так как нет локов (если конечно не создавать и тут же прибивать потоки) но в общем случае такая скорость маппинга адреса api не нужна потому что проседает обычно во время выполнения вызова отправка по сети рисование и прочee

    есть еще вариант юзать динамический TLS во время первого обращения к "хранилищу" любым потоком выделять память под дерево HeapAlloc TlsSetValue и вызывать RegisterWaitForSingleObject с хендлом этого потока во время его завершения вызовется каллбек и освободит память это вариант можно юзать чтоб отказаться от статический TLS так как он создает секцию .tls 15 кб размером

    но опять же если потоки создаются и тут же прибиваются то лучше юзать локи так как при использовании TLS будут постоянно резольвиться новые адреса для каждого потока

    поэтому я оставил самый простой и универсальный вариант

    обновленная/доработанная версия
     
  10. 346bf57676v44x

    346bf57676v44x New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2011
    Сообщения:
    4
    значит не зря старался :derisive:
     
  11. GorluM

    GorluM николай gorl

    Публикаций:
    0
    Регистрация:
    6 дек 2003
    Сообщения:
    61
    Адрес:
    Москва
    гы, крутая реализация ;)
    пора нам новую статью делать в Ха, а?
     
  12. 63F45EF45RB65R6VR

    63F45EF45RB65R6VR New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2011
    Сообщения:
    70
    Код (Text):
    1. гы, крутая реализация ;)
    2. пора нам новую статью делать в Ха, а?
    ну если нормально написать статью то можно
    к сожалению сам не умею писать статьи
    когда ждать выпуск ?
     
  13. GorluM

    GorluM николай gorl

    Публикаций:
    0
    Регистрация:
    6 дек 2003
    Сообщения:
    61
    Адрес:
    Москва
    когда найдется тот, кто напишет)
     
  14. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    Зачем это нужно?
     
  15. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    для кидиссов, которые не в состоянии осилить C++0x))) и x64 архитектуру в том числе)))
     
  16. 63F45EF45RB65R6VR

    63F45EF45RB65R6VR New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2011
    Сообщения:
    70
    ну можно писать троянчики без импорта а вообще больше интересен был процесс создания сейчас вот какое то опустошение пока ничем не занят интересным
    у меня например студия вообще не знает о C++0x так что не "не в состоянии" а просто не очень то и нужно и старого C++ хватает

    Rel смените стиль общения похожи на ребенка
     
  17. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    63F45EF45RB65R6VR
    Боюсь многим АВ сильно не понравятся такие "неправильные" троянчики без импорта
     
  18. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    не... ну никто не заставляет полностью убирать импорт, достаточно скрыть только определенные апи...

    это одна из причин, по которой я уже давно пересел на MinGW... в 2010 с этим дела получше обстоят, но все равно нет поддержки шаблонов с переменным числом параметров (variadic templates) и константных выражений (constexpr)... тех самых двух составляющих, необходимых для адекватной реализации вашего "долой импорта")))

    я молод душой...
     
  19. 63F45EF45RB65R6VR

    63F45EF45RB65R6VR New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2011
    Сообщения:
    70
    посмотрев твои отзывы о моем коде здесь и в других ветках
    пришел к заключению что ты полное гoвнo как человек

    P.S на будущее если тебе что то не нравится то хоть уважай чужой труд
    это жуть как обидно когда во что то душу вложил а какой то мyдaк все обсирает
     
  20. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    да не драматизируй, я просто люблю называть вещи своими именами))