Кол-во вариаций опкодов вначале ф-ций

Тема в разделе "WASM.BEGINNERS", создана пользователем _nic, 25 авг 2011.

  1. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Вот тут http://habrahabr.ru/blogs/cpp/90377/ уверяют что большинство ф-ций в дллках начинаются,так:
    Попытавшись это проверить ,я понял - что я что то делаю не так,или я чего то не понял.Потому что написанный мной код:
    Код (Text):
    1. void listb(HMODULE mod,char *namef)
    2. {
    3.     char *f=(char*)GetProcAddress(mod,namef);
    4.     if(f!=NULL)
    5.     {
    6.         printf("%s: \n",namef);
    7.         for(int i=0;i<5;i++)
    8.         {
    9.             printf(" [%d]:%X",i,f[i]);
    10.         }
    11.     }
    12.     printf("\n");
    13. }
    14. int _tmain(int argc, _TCHAR* argv[])
    15. {
    16.     HMODULE kern=GetModuleHandle(L"kernel32.dll");
    17.     if(kern!=NULL)
    18.     {
    19.         printf("kernel32.dll:\n\n");
    20.         listb(kern,"CreateFileW");
    21.         listb(kern,"ReadFile");
    22.         listb(kern,"GetModuleHandleW");
    23.         listb(kern,"WriteFile");
    24.         listb(kern,"CloseHandle");
    25.     }
    26.     HMODULE ntdll=LoadLibrary(L"ntdll.dll");
    27.     if(ntdll!=NULL)
    28.     {
    29.         printf("\n\nntdll.dll:\n\n");
    30.         listb(ntdll,"LdrShutdownThread");
    31.         listb(ntdll,"LdrUnlockLoaderLock");
    32.         listb(ntdll,"memcpy");
    33.         listb(ntdll,"memset");
    34.         listb(ntdll,"NtCreateEvent");
    35.     }
    36.     getch();
    37.     return 0;
    38. }
    Выдал слишком мало совпадений.Сначало я думал что все в 1ю очередь зависит от типа вызова ф-ции.НО ReadFile и WriteFile оба вызываются как __stdcall но 1е 5байт у них разные...
    Собственно вопрос - сколько может быть ВАРИАЦИЙ в 5байтах, в начале функции?
     
  2. T800

    T800 Member

    Публикаций:
    0
    Регистрация:
    7 дек 2006
    Сообщения:
    293
    Адрес:
    Moscow
    _nic
    Главное что бы былое 5...8 байт, которые не влияют на исполнение самой функции (что бы esp не менялся там хотябы). А даже если они и влияют, то делаем трамплин.
    Так что цель вашей затеи не понятна...
     
  3. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    _nic
    Если вы посмотрите что там за байты, то это окажутся как переходы на сами функции... Вариантов масса, и для это юзают LDE а не использует статические иследования не понятных и очень насторажувающих личнойстей... Как то так.
     
  4. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    _nic
    На Хабре много ереси последнее время пишут, на самом деле нет, эта команда mov edi,edi добавлена для
    патчинга на лету 5 байт дают для перехода, сделано вроде как для установки HotFix'ов если мне не изменяет память.
    Поэтому не у всех функций такой пролог, вопрос на счет вариации то их много и опираться на это нельзя, например
    GetCurrentProcess вообще занимает только 4 байта!
     
  5. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Наверно я не совсем с той стороны начал.Я пытаюсь понять по каким сигнатурам можно определить,начало ф-ции в отмапленном PE файле.
     
  6. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    Ни по каким)
     
  7. TrashGen

    TrashGen ТрещГен

    Публикаций:
    0
    Регистрация:
    15 мар 2011
    Сообщения:
    1.199
    Адрес:
    подполье
    Экспортируемые функции в длл - по адресам в одноименной таблице- знамо дело как, а в простых модулях без этих наших все экспортов- по сигнатурам, разумеется, лол
     
  8. sergegers

    sergegers New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2008
    Сообщения:
    172
    кошерный пролог это
    push ebp
    mov ebp, esp
    add (sub) esp, X

    без FPO
     
  9. litrovith

    litrovith Member

    Публикаций:
    0
    Регистрация:
    20 июн 2007
    Сообщения:
    509
    Вариаций можно придумать относительно много кака в начале, так и в конце.

    T800, не обязательно, никто не мешает "промотать" всё дальше.
     
  10. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    _nic
    Это еще один "популярный" пролог, вызывающий "спец"-функцию, которая устанавливает заданный SEH-обработчик и выделяет заданное кол-во байт под локальные переменные
    Код (Text):
    1. push imm8   ;размер лок.переменных
    2. push imm32  ;адрес SEH-обработчика
    3. call SuperFunc  ;вызов функции
    Ну и поскольку размеры лок.переменных и адреса обработчиков разные, то и первые 5 байт в разных ф-ях ес-но разные (только опкоды пушей одни и те же + один-два старших байта адреса SEH-обработчика)

    h0t
    Да, и если это хот-фикс, то перед mov edi,edi стоит не менее пяти nop для записи jmp
     
  11. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    Всмысле не мение 5 nop, насколько я помню затирается mov edi,edi, push ebp, mov ebp,esp а это как раз 5 байт
     
  12. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    h0t
    Затирать можешь что угодно ;) Но суть самого хот-фикса заключается в том, чтобы не затирать никаких push ebp и т.п., и для этого специально перед mov edi,edi резервируется не менее 5 nop (м.б.и больше для выравнивания), в которые при хот-фиксе записывается 5-байтный jmp near на фикс-код, а вместо mov edi,edi пишется короткий переход на -7 назад (т.е. на этот jmp near). При этом в фикс-коде не требуется запоминать\выполнять\восстанавливать затертые инструкции - достаточно в конце сделать переход на +2 от адреса функции (т.е. просто пропустить затертую mov edi,edi)
     
  13. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    Дык я о том же