древний антидизассемблерный трюк — прыжок в середину команды
Команда "CALL LOC_19+1" прыгает куда-то в середину инструкции PUSH, засылающей в стек константу FFFFFFEBh в которой опытные кодокопатели уже наверняка увидели инструкцию безусловного перехода, заданную опкодом EBh, а вся команда выглядит так: EBh 4Dh, где 4Dh "отрываются" от инструкции DEC EBP. Важно не забывать, что PUSH
с опкодом 6Ah — это знаковая команда, то есть никаких FFh в самом опкоде нет, поэтому вместо перехода по адресу EBh FFh (как это следует из дизассемблерного текста) мы получаем переход по адресу EBh 4Dh (как это следует из машинного кода), что совсем не одно и тоже! Сам переход, кстати говоря, относительный и вычисляется от конца команды JMP, длина которой в данном случае равна двум. Складываем 4Dh (целевой адрес перехода) с 1Ah (адрес самой команды перехода — loc_19 + 1 = 1Ah) и получаем 69h. Именно по этому смещению и будет передано управление! А команды, идущие за инструкцией CALL,
расположены чисто для маскировки, чтобы противник подольше голову поломал.
Хорошо, отправляется в район 69h и смотрим что хорошего у нас там:
seg000:00000069 31 DB xor ebx, ebx ; ebx := 0
seg000:0000006B 64 8B 43 30 mov eax, fs:[ebx+30h] ; PEB
seg000:0000006F 8B 40 0C mov eax, [eax+0Ch] ; PEB_LDR_DATA
seg000:00000072 8B 70 1C mov esi, [eax+1Ch] ; InInitializationOrderModuleList
seg000:00000075 AD lodsd ; EAX := *ESI
seg000:00000076 8B 40 08 mov eax, [eax+8] ; BASE of KERNEL32.DLL