шаблоны С++ для обфускации кода

Тема в разделе "LANGS.C", создана пользователем GoldFinch, 13 мар 2009.

  1. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    ищу какиенибудь статьи по сабжевой теме

    например, замена символьных строк на их хеши
    Код (Text):
    1. #include <iostream>
    2. #include <windows.h>
    3. using namespace std;
    4.  
    5. //настройка хеш-функции
    6. enum { hash_mult = 5 };
    7.  
    8. #pragma warning (disable:4307)
    9.  
    10. template <int m,int h,int c0,int c1,int c2, int c3>
    11. struct hash_int {
    12.     enum { ret=(((h*m+c3)*m+c2)*m+c1)*m+c0 };
    13. };
    14. template <int m,int h,int c0,int c1,int c2>
    15. struct hash_int<m,h,c0,c1,c2,0> {
    16.     enum { ret=((h*m+c2)*m+c1)*m+c0 };
    17. };
    18. template <int m,int h,int c0,int c1>
    19. struct hash_int<m,h,c0,c1,0,0> {
    20.     enum { ret=(h*m+c1)*m+c0 };
    21. };
    22. template <int m,int h,int c0>
    23. struct hash_int<m,h,c0,0,0,0> {
    24.     enum { ret=h*m+c0 };
    25. };
    26.  
    27. template <int s1,int s2=0,int s3=0,int s4=0,int s5=0,int s6=0>
    28. struct hash {
    29.     typedef hash<0,s1,s2,s3,s4,s5> hash_next;
    30.     enum { x=s6, h=hash_next::ret, m=::hash_mult };
    31.     enum { c3=x>>24, c2=(x>>16)&0xFF, c1=(x>>8)&0xFF, c0=x&0xFF };
    32.     enum { ret=hash_int<m,h,c0,c1,c2,c3>::ret };
    33. };
    34. template <int s1,int s2,int s3,int s4,int s5>
    35. struct hash<s1,s2,s3,s4,s5,0> {
    36.     typedef hash<0,s1,s2,s3,s4,s5> hash_next;
    37.     enum { ret =  hash_next::ret };
    38. };
    39. template <>
    40. struct hash<0> {
    41.     enum { ret=0 };
    42. };
    43.  
    44. #pragma warning (default:4307)
    45.  
    46. int CalculateHash(char *str) {
    47.     int h=0;
    48.     for(;*str;str++) {
    49.         h= *str + h * ::hash_mult;
    50.     };
    51.     return h;
    52. };
    53. FARPROC GetProcAddrByHash(HMODULE hModule,int Hash) {
    54.     int base=(int)hModule;
    55.     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);
    56.     int *pNamesTable = (int*)(base+pExp->AddressOfNames);
    57.     short *pOrdsTable = (short *)(base+pExp->AddressOfNameOrdinals);
    58.     while ( CalculateHash((char*)(base+*pNamesTable))!=Hash) {
    59.         pNamesTable++;
    60.         pOrdsTable++;
    61.     };    
    62.     return FARPROC(base+*((int*)(base+pExp->AddressOfFunctions+*pOrdsTable*4)));
    63. };
    64.  
    65. int main() {
    66.     HMODULE hKernel=GetModuleHandleA("kernel32.dll");
    67.     cout << GetProcAddrByHash(hKernel,hash<'Load','Libr','aryA'>::ret) << endl;
    68.     cout << GetProcAddress(hKernel,"LoadLibraryA") << endl;
    69.     HMODULE hURLMON=LoadLibraryA("urlmon.dll");
    70.     cout << GetProcAddrByHash(hURLMON,hash<'URLD','ownl','oadT','oFil','eA'>::ret) << endl;
    71.     cout << GetProcAddress(hURLMON,"URLDownloadToFileA") << endl;    
    72.     return 0;
    73. }
    также ищу какую-нибудь хорошую современную литературу по метапрограммированию на С++
     
  2. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    http://www.ozon.ru/context/detail/id/3960662/
    Поищи -- я здесь нечто подобное выкладывал (строку в хеш в compile-time).
     
  3. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    на либрусеке есть в електронном виде (я про эту книгу).
     
  4. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    когда ее читал создалось впечатление что она несколько устарела, т.к. это гдето 2000год, к тому же тема метапрограммирования там раскрыта слабо
     
  5. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    вобщем идея у меня такая - сделать 4-5 элементарных типов byte, word, dword, qword
    перегрузить операторы несколькими вариантами шаблонов, и инстанцировать случайный вариант шаблона при компиляции
    должен получиться некоторый метаморфизм с обфускацией + все преимущества С++
     
  6. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Немного изучал вопрос и пришел к выводу что темплейты гораздо лучше обфусцируют исходный код, чем бинарный. Как иначе "инстанцировать случайный вариант шаблона при компиляции" кроме внешнего тула? но тогда можно обойтись вместо шаблонов просто разными классами и менять их регекспами :) Да, и шаблоны нельзя параметризовать строками (книга до сих пор не устарела) - посмотри внимательнее свой код. Может быть я и остальное не так понял.
     
  7. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    нда... действительно, максимум что можно сделать - упростить вставку мусора, типа вставка n nop'oв
    Код (Text):
    1. template<int n> inline void nops() {__asm{nop};nops<n-1>();};
    2. template<> inline void nops<0>() {};
    3.  
    4. ...
    5. nops<3>(); //3 nop'а
    6. ...
    можно перегрузить операторы и вставлять мусор не только между строчками кода, но и внутри их, но каждый раз - одинаковый.
    вобщем похоже что и в самом деле, тут нет никаких перспектив