ищу какиенибудь статьи по сабжевой теме например, замена символьных строк на их хеши Код (Text): #include <iostream> #include <windows.h> using namespace std; //настройка хеш-функции enum { hash_mult = 5 }; #pragma warning (disable:4307) template <int m,int h,int c0,int c1,int c2, int c3> struct hash_int { enum { ret=(((h*m+c3)*m+c2)*m+c1)*m+c0 }; }; template <int m,int h,int c0,int c1,int c2> struct hash_int<m,h,c0,c1,c2,0> { enum { ret=((h*m+c2)*m+c1)*m+c0 }; }; template <int m,int h,int c0,int c1> struct hash_int<m,h,c0,c1,0,0> { enum { ret=(h*m+c1)*m+c0 }; }; template <int m,int h,int c0> struct hash_int<m,h,c0,0,0,0> { enum { ret=h*m+c0 }; }; template <int s1,int s2=0,int s3=0,int s4=0,int s5=0,int s6=0> struct hash { typedef hash<0,s1,s2,s3,s4,s5> hash_next; enum { x=s6, h=hash_next::ret, m=::hash_mult }; enum { c3=x>>24, c2=(x>>16)&0xFF, c1=(x>>8)&0xFF, c0=x&0xFF }; enum { ret=hash_int<m,h,c0,c1,c2,c3>::ret }; }; template <int s1,int s2,int s3,int s4,int s5> struct hash<s1,s2,s3,s4,s5,0> { typedef hash<0,s1,s2,s3,s4,s5> hash_next; enum { ret = hash_next::ret }; }; template <> struct hash<0> { enum { ret=0 }; }; #pragma warning (default:4307) int CalculateHash(char *str) { int h=0; for(;*str;str++) { h= *str + h * ::hash_mult; }; return h; }; FARPROC GetProcAddrByHash(HMODULE hModule,int Hash) { int base=(int)hModule; PIMAGE_EXPORT_DIRECTORY pExp = PIMAGE_EXPORT_DIRECTORY(base+PIMAGE_NT_HEADERS(base+PIMAGE_DOS_HEADER(base)->e_lfanew)->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress); int *pNamesTable = (int*)(base+pExp->AddressOfNames); short *pOrdsTable = (short *)(base+pExp->AddressOfNameOrdinals); while ( CalculateHash((char*)(base+*pNamesTable))!=Hash) { pNamesTable++; pOrdsTable++; }; return FARPROC(base+*((int*)(base+pExp->AddressOfFunctions+*pOrdsTable*4))); }; int main() { HMODULE hKernel=GetModuleHandleA("kernel32.dll"); cout << GetProcAddrByHash(hKernel,hash<'Load','Libr','aryA'>::ret) << endl; cout << GetProcAddress(hKernel,"LoadLibraryA") << endl; HMODULE hURLMON=LoadLibraryA("urlmon.dll"); cout << GetProcAddrByHash(hURLMON,hash<'URLD','ownl','oadT','oFil','eA'>::ret) << endl; cout << GetProcAddress(hURLMON,"URLDownloadToFileA") << endl; return 0; } также ищу какую-нибудь хорошую современную литературу по метапрограммированию на С++
http://www.ozon.ru/context/detail/id/3960662/ Поищи -- я здесь нечто подобное выкладывал (строку в хеш в compile-time).
когда ее читал создалось впечатление что она несколько устарела, т.к. это гдето 2000год, к тому же тема метапрограммирования там раскрыта слабо
вобщем идея у меня такая - сделать 4-5 элементарных типов byte, word, dword, qword перегрузить операторы несколькими вариантами шаблонов, и инстанцировать случайный вариант шаблона при компиляции должен получиться некоторый метаморфизм с обфускацией + все преимущества С++
Немного изучал вопрос и пришел к выводу что темплейты гораздо лучше обфусцируют исходный код, чем бинарный. Как иначе "инстанцировать случайный вариант шаблона при компиляции" кроме внешнего тула? но тогда можно обойтись вместо шаблонов просто разными классами и менять их регекспами Да, и шаблоны нельзя параметризовать строками (книга до сих пор не устарела) - посмотри внимательнее свой код. Может быть я и остальное не так понял.
нда... действительно, максимум что можно сделать - упростить вставку мусора, типа вставка n nop'oв Код (Text): template<int n> inline void nops() {__asm{nop};nops<n-1>();}; template<> inline void nops<0>() {}; ... nops<3>(); //3 nop'а ... можно перегрузить операторы и вставлять мусор не только между строчками кода, но и внутри их, но каждый раз - одинаковый. вобщем похоже что и в самом деле, тут нет никаких перспектив