Дизассемблирую одну длл-ку, наткнулся на странный код. Куча бессмысленных команд, такое ощущение, что хотели специально запутать. В эту функцию попадаю сразу из DllEntryPoint, прыжок сразу первой инструкцией .............................................. sub_1004A479 proc near var_14= dword ptr -14h var_10= dword ptr -10h call $+5 ............................................... из нее сразу сюда и здесь творится самое непонятное ............................................... loc_1004A47E: pop eax push ebx push ecx push esi push edi push eax mov ebx, [esp+14h+var_14] ; зачем это? sub ebx, offset loc_1004A47E mov eax, 5A05h push eax push 4 push 1000h push eax push 0 mov eax, offset VirtualAlloc ; и здесь тоже странность mov eax, [eax+ebx] ; хотя скорее всего вызывается все-таки VirtualAlloc call eax pop ecx mov edx, offset loc_10043C27 add edx, ebx push edx push ebx push eax mov edi, eax mov esi, edx cld rep movsb mov ecx, offset loc_10043BB3 add ecx, ebx call ecx pop eax mov ebx, [esp+10h+var_10] push 8000h push 0 push eax mov eax, offset VirtualFree ; тоже самое ???? mov eax, [eax+ebx] call eax pop ecx pop eax pop ebx sub ebx, 5 mov byte ptr [ebx], 0B8h inc ebx mov [ebx], eax add ebx, 4 mov byte ptr [ebx], 0C3h or ecx, ecx jz short loc_1004A534 Кто-нибудь может прокомментировать этот кусок кода? Я использую IDA Pro 5.2, более старые версии иды и виндасм даже не смогли дизассемблировать этот файл. Ида просто вылетала, а виндасм не дизассемблировал до конца.
Код (Text): mov eax, offset VirtualAlloc ; и здесь тоже странность mov eax, [eax+ebx] ; хотя скорее всего вызывается все-таки VirtualAlloc Скорее всего в EAX получается содержимое какой-то ячейки из IAT (упоминание VirtualAlloc и VirtualFree сделано только для того чтобы сбить с толку исследователя). Протрассируй call eax пошагово - и увидишь какие API вызываются на самом деле
имхо, если морфинг, то достаточно некачественный. Блоки одни и те же используются. Скорее всего просто сокрытие вызова реальных апишек, как сказанно выше.
хзхз, может быть запутать "несильные" сканеры, а туповато получилось - по причине "несильности" автора в вопросе.. =\
Оттрасировать пока не могу, потому-что у меня только эта длл, но похоже все таки вызываются именно эти функции Вот код mov eax, 5A05h push eax push 4 push 1000h push eax push 0 mov eax, offset VirtualAlloc ; здесь намучено, я думаю для осложнения дебага mov eax, [eax+ebx] ; на самом деле достаточно call VirtualAlloc call eax функция явно прописана в импорте это ее определение LPVOID __stdcall VirtualAlloc(LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect) extrn VirtualAlloc:dword получается, что lpAdress = 0, dwSize = 5a05h (размер выделяемой памяти 23045 в десятичной), flAllocationType = 1000h (тип выделения - MEM_COMMIT, если посмотреть по MSDN), а flProtect = 4 (тип доступа - PAGE_READWRITE, опять же по MSDN) получается что сначала выделяется память, потом выполяется это код pop ecx mov edx, offset loc_10043C27 add edx, ebx push edx push ebx push eax mov edi, eax mov esi, edx cld rep movsb mov ecx, offset loc_10043BB3 add ecx, ebx call ecx ; здесь явно вызывается какая-то функция pop eax а потом память освобождается кода в дллке вообще кот наплакал, в основном забита какими-то непонятными данными. может это зашифрованные куски кода, которые потом как-то распаковываются. копаю дальше
ниче это не значит ида просто неправильно распознала call, у меня например бывало что лишняя строчка кода добавляет вот такую проблему при распознавании имен подпрограмм т.е пишется например вместо call exitProcess точно такая же хрень call $+5