для тех кто "не в теме" вводная статья 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): X3J11_CallFunction(strstr,0x4e5cf9ed,0x967c28ff,__VA_ARGS__) надо заменить на Код (Text): 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
не ну нафига так тему палить, живи и радуйся, как говориться - ан нет, слил в паблик, хотя уже бы в первый левел васма залил , где мемберы с репой выкладывают в приват свои сорцы. К тому же тут много аверов тусуется на форуме , позаносят в свои базы сорцы и библиотеки boosta и ппц. p.s. vx-сцена еще жива ! )
тут решены важные вещи 1) типобезопасность это значит что не перепутаеш типы аргументов не передаш больше или меньше и переходники генерируются ожидающие правильные типы как у вызываемой функции и возвращаемое значение также правильного типа по сути переходник точная сигнатурная копия вызываемой функции 2) правильная работа intellisense если навести указатель на имя функции покажет натоящую сигнатуру или когда открываеш скобочку показывает какие параметры нужны 3) полностью прозрачная подмена макросы становятся активными только во время начала сборки 4) генерирует правильный вызов для __cdecl __stdcall и __cdecl (variadic) функций это значит что помимо winapi (__stdcall) можно юзать msvcrt.dll (__cdecl) и variadic (sprintf...) функции прикреплю тут а то ссылка slil.ru скоро сдохнет утилита и примеры
[update] хотел залить и либы boost'а но файл 1.5 мб хрен закачаеш форум его принимает но ссылку на него не показывает что за хрень ?
пример Код (Text): #include <windows.h> #include "x3j11.h" int main() { X3J11_Startup(); MessageBox(0,0,0,0); } минимальный exe 2 кб получается из за включения кода поддержки выше будет расти только от явно написанного кода Код (Text): static volatile LONG lTreeLock; PVOID __stdcall X3J11_Hash2Ptr(DWORD dwFuncHash, DWORD dwModHash) { 00401880 55 push ebp 00401881 8B EC mov ebp,esp 00401883 51 push ecx while (_InterlockedExchange(&lTreeLock, TRUE) == TRUE) 00401884 B8 01 00 00 00 mov eax,1 00401889 B9 48 4F 40 00 mov ecx,404F48h 0040188E 87 01 xchg eax,dword ptr [ecx] 00401890 83 F8 01 cmp eax,1 00401893 75 08 jne X3J11_Hash2Ptr+1Dh (40189Dh) FuncPtr._SwitchToThread(); 00401895 FF 15 8C 4F 40 00 call dword ptr ds:[404F8Ch] 0040189B EB E7 jmp X3J11_Hash2Ptr+4 (401884h) PVOID pFunc = Tree.Find(dwFuncHash); 0040189D 8B 55 08 mov edx,dword ptr [dwFuncHash] 004018A0 52 push edx 004018A1 B9 00 30 40 00 mov ecx,403000h 004018A6 E8 15 FB FF FF call CHashMap::Find (4013C0h) 004018AB 89 45 FC mov dword ptr [pFunc],eax if (!pFunc) 004018AE 83 7D FC 00 cmp dword ptr [pFunc],0 004018B2 75 25 jne X3J11_Hash2Ptr+59h (4018D9h) { pFunc = ParseExport(dwFuncHash, dwModHash); 004018B4 8B 45 0C mov eax,dword ptr [dwModHash] 004018B7 50 push eax 004018B8 8B 4D 08 mov ecx,dword ptr [dwFuncHash] 004018BB 51 push ecx 004018BC E8 0F FF FF FF call ParseExport (4017D0h) 004018C1 83 C4 08 add esp,8 004018C4 89 45 FC mov dword ptr [pFunc],eax Tree.Add(dwFuncHash, pFunc); 004018C7 8B 55 FC mov edx,dword ptr [pFunc] 004018CA 52 push edx 004018CB 8B 45 08 mov eax,dword ptr [dwFuncHash] 004018CE 50 push eax 004018CF B9 00 30 40 00 mov ecx,403000h 004018D4 E8 17 FB FF FF call CHashMap::Add (4013F0h) } _InterlockedExchange(&lTreeLock, FALSE); 004018D9 33 C9 xor ecx,ecx 004018DB BA 48 4F 40 00 mov edx,404F48h 004018E0 87 0A xchg ecx,dword ptr [edx] return pFunc; 004018E2 8B 45 FC mov eax,dword ptr [pFunc] } 004018E5 8B E5 mov esp,ebp 004018E7 5D pop ebp 004018E8 C2 08 00 ret 8 сейчас поиск в "хранилище" адреса лочится с помощью интринсика <intrin.h> _InterlockedExchange есть еще вариант от которого я отказался даем каждому потоку по "хранилищу" (AVL дерево) для этого досточно объявить как __declspec(thread) CHashMap Tree это работает быстрее так как нет локов (если конечно не создавать и тут же прибивать потоки) но в общем случае такая скорость маппинга адреса api не нужна потому что проседает обычно во время выполнения вызова отправка по сети рисование и прочee есть еще вариант юзать динамический TLS во время первого обращения к "хранилищу" любым потоком выделять память под дерево HeapAlloc TlsSetValue и вызывать RegisterWaitForSingleObject с хендлом этого потока во время его завершения вызовется каллбек и освободит память это вариант можно юзать чтоб отказаться от статический TLS так как он создает секцию .tls 15 кб размером но опять же если потоки создаются и тут же прибиваются то лучше юзать локи так как при использовании TLS будут постоянно резольвиться новые адреса для каждого потока поэтому я оставил самый простой и универсальный вариант обновленная/доработанная версия
Код (Text): гы, крутая реализация ;) пора нам новую статью делать в Ха, а? ну если нормально написать статью то можно к сожалению сам не умею писать статьи когда ждать выпуск ?
ну можно писать троянчики без импорта а вообще больше интересен был процесс создания сейчас вот какое то опустошение пока ничем не занят интересным у меня например студия вообще не знает о C++0x так что не "не в состоянии" а просто не очень то и нужно и старого C++ хватает Rel смените стиль общения похожи на ребенка
не... ну никто не заставляет полностью убирать импорт, достаточно скрыть только определенные апи... это одна из причин, по которой я уже давно пересел на MinGW... в 2010 с этим дела получше обстоят, но все равно нет поддержки шаблонов с переменным числом параметров (variadic templates) и константных выражений (constexpr)... тех самых двух составляющих, необходимых для адекватной реализации вашего "долой импорта"))) я молод душой...
посмотрев твои отзывы о моем коде здесь и в других ветках пришел к заключению что ты полное гoвнo как человек P.S на будущее если тебе что то не нравится то хоть уважай чужой труд это жуть как обидно когда во что то душу вложил а какой то мyдaк все обсирает