Редактировать / Upate
Так что я думаю, что меня смущает то, что:
LEA ESI, [EBX + 8*EAX + 4]
Загружает адрес, но:
LEA ESI, [EBX + 4]
Загружает содержимое (значение?), А не адрес. Как это не разыменование?
Я также до сих пор не уверен, что
mov [eax+1], ecx
делает?
Оригинальный вопрос
Я пытаюсь научиться читать ассемблер, но я начинаю бороться. Извините, если есть опечатки, я не могу скопировать с моей лабораторной машины. Это из вредоносного кода, поэтому он не может быть оптимальным.
Я думаю, что у меня где-то есть неправильное понимание, но я просто не могу понять это.
var_30 = byte ptr -30h
lea eax, [ebp+esi+var_30]
Насколько я понимаю, эффективный адрес загрузки станет тем, который будет вычислен из [basepointer-30h + esi]. Я не знаю, что такое esi или edi.
lea ecx, [esi+edi]
lea ebx, [esi+6]
Итак, я считаю, что ebx является результирующим адресом esi + 6 байтов?
mov esi, ds:WriteProcessMemory
esi указывает на вызов API WriteProcessMemory
mov byte ptr [eax], 68h
Я полагаю, что инструкция PUSH помещает в адрес eax (который в настоящее время [basepointer-30h + esi]
mov [eax+1], ecx
Я полагаю, что ecx, который теперь является адресом [esi + edi], содержит аргумент, который нужно дать инструкции PUSH. Означает ли это, что eax + 1 теперь указывает на содержимое ecx (что было в [esi + edi]]?
mov byte ptr [eax+5], 0C3h
Я думаю, это помещает инструкцию RET в адрес [eax + 5].
lea eax, [epb+var_30]
Это существенно сдвигает eax назад / вперед, каким бы ни был esi, но я не знаю почему?
push [ebp+lpBaseAddress]; lpBaseAddress
push 0FFFFFFFFh; hProcess (-1 = this process)
call esi
Что меня смущает:
ebx используется в качестве аргумента для nSize, но почему длина содержимого будет храниться по адресу [esi + 6]? Сначала я думал, что это +6, потому что это может быть длина 'PUSH arg RET (eax to eax + 5)', но это адрес, а не короткий int. Помещен ли короткий int (nSize) по этому адресу предыдущей подпрограммой?
Почему eax (lpBuffer - содержимое для записи) теперь на [eax-30h]. Выделил ли esi место, но начал писать контент с конца? Что-то вроде:
ebp+var_30+esi (eax, start of buffer address) : PUSH(eax) : arg(eax+1) RET(eax+5) : ebp+var_30 (new eax, end of buffer address)?
Не думаю, что я полностью понимаю, что делают esi или edi, но у меня нет полного кода, чтобы понять, что они собой представляют.
Спасибо