Вот тут http://habrahabr.ru/blogs/cpp/90377/ уверяют что большинство ф-ций в дллках начинаются,так: Попытавшись это проверить ,я понял - что я что то делаю не так,или я чего то не понял.Потому что написанный мной код: Код (Text): void listb(HMODULE mod,char *namef) { char *f=(char*)GetProcAddress(mod,namef); if(f!=NULL) { printf("%s: \n",namef); for(int i=0;i<5;i++) { printf(" [%d]:%X",i,f[i]); } } printf("\n"); } int _tmain(int argc, _TCHAR* argv[]) { HMODULE kern=GetModuleHandle(L"kernel32.dll"); if(kern!=NULL) { printf("kernel32.dll:\n\n"); listb(kern,"CreateFileW"); listb(kern,"ReadFile"); listb(kern,"GetModuleHandleW"); listb(kern,"WriteFile"); listb(kern,"CloseHandle"); } HMODULE ntdll=LoadLibrary(L"ntdll.dll"); if(ntdll!=NULL) { printf("\n\nntdll.dll:\n\n"); listb(ntdll,"LdrShutdownThread"); listb(ntdll,"LdrUnlockLoaderLock"); listb(ntdll,"memcpy"); listb(ntdll,"memset"); listb(ntdll,"NtCreateEvent"); } getch(); return 0; } Выдал слишком мало совпадений.Сначало я думал что все в 1ю очередь зависит от типа вызова ф-ции.НО ReadFile и WriteFile оба вызываются как __stdcall но 1е 5байт у них разные... Собственно вопрос - сколько может быть ВАРИАЦИЙ в 5байтах, в начале функции?
_nic Главное что бы былое 5...8 байт, которые не влияют на исполнение самой функции (что бы esp не менялся там хотябы). А даже если они и влияют, то делаем трамплин. Так что цель вашей затеи не понятна...
_nic Если вы посмотрите что там за байты, то это окажутся как переходы на сами функции... Вариантов масса, и для это юзают LDE а не использует статические иследования не понятных и очень насторажувающих личнойстей... Как то так.
_nic На Хабре много ереси последнее время пишут, на самом деле нет, эта команда mov edi,edi добавлена для патчинга на лету 5 байт дают для перехода, сделано вроде как для установки HotFix'ов если мне не изменяет память. Поэтому не у всех функций такой пролог, вопрос на счет вариации то их много и опираться на это нельзя, например GetCurrentProcess вообще занимает только 4 байта!
Наверно я не совсем с той стороны начал.Я пытаюсь понять по каким сигнатурам можно определить,начало ф-ции в отмапленном PE файле.
Экспортируемые функции в длл - по адресам в одноименной таблице- знамо дело как, а в простых модулях без этих наших все экспортов- по сигнатурам, разумеется, лол
Вариаций можно придумать относительно много кака в начале, так и в конце. T800, не обязательно, никто не мешает "промотать" всё дальше.
_nic Это еще один "популярный" пролог, вызывающий "спец"-функцию, которая устанавливает заданный SEH-обработчик и выделяет заданное кол-во байт под локальные переменные Код (Text): push imm8 ;размер лок.переменных push imm32 ;адрес SEH-обработчика call SuperFunc ;вызов функции Ну и поскольку размеры лок.переменных и адреса обработчиков разные, то и первые 5 байт в разных ф-ях ес-но разные (только опкоды пушей одни и те же + один-два старших байта адреса SEH-обработчика) h0t Да, и если это хот-фикс, то перед mov edi,edi стоит не менее пяти nop для записи jmp
Всмысле не мение 5 nop, насколько я помню затирается mov edi,edi, push ebp, mov ebp,esp а это как раз 5 байт
h0t Затирать можешь что угодно Но суть самого хот-фикса заключается в том, чтобы не затирать никаких push ebp и т.п., и для этого специально перед mov edi,edi резервируется не менее 5 nop (м.б.и больше для выравнивания), в которые при хот-фиксе записывается 5-байтный jmp near на фикс-код, а вместо mov edi,edi пишется короткий переход на -7 назад (т.е. на этот jmp near). При этом в фикс-коде не требуется запоминать\выполнять\восстанавливать затертые инструкции - достаточно в конце сделать переход на +2 от адреса функции (т.е. просто пропустить затертую mov edi,edi)