Что делает этот ассемблерный код - запись в память процесса - PullRequest
1 голос
/ 18 июня 2019

Редактировать / 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, но у меня нет полного кода, чтобы понять, что они собой представляют.

Спасибо

1 Ответ

4 голосов
/ 19 июня 2019

Обращаясь к вашему редактированию

Если вас смущает LEA, подумайте об этом так:

  • Рассчитать все в исходном операнде.
  • Поместить результат вычисления (исходного операнда) в целевой операнд.

Так что я думаю, что меня смущает то, что:

LEA ESI, [EBX + 8 * EAX + 4]

Технически инструкции не имеет значения, является ли она адресом (более того, в плоской памяти все в регистре может быть адресом).

Примите следующие предварительные условия:

  • EBX = 2
  • EAX = 1

Затем вычислите источник:

  • [EBX + 8*EAX + 4] = 2 + 8 * 1 + 4 = 2 + 8 + 4 = 14

Переместить результат в ESI:

  • LEA ESI, [EBX + 8*EAX + 4]; ESI = 14 (EBX = 2; EAX = 1)

LEA ESI, [EBX + 4] Загружает содержимое (значение?), А не адрес. Как это не разыменование?

То же самое применимо и здесь. Допустим, EBX = 2, и вы получите ESI = 6.

Я тоже до сих пор не уверен, что mov [eax + 1], ecx делает

Возьмите значение EAX, затем добавьте 1; теперь это значение (eax + 1) является указателем, в котором вы будете хранить 32-битное значение (при условии отсутствия переопределения размера) в ECX.

Простой пример:

  • EAX = 0x8000
  • ECX = 2

Теперь вычислите: EAX + 1 = 0x8001

  • Возьмите это значение в качестве указателя (или, если хотите, место в памяти)
  • Сохранить значение ECX (2; как 32-разрядное значение) по адресу 0x8001.
     0x8000  0x8001  0x8002  0x8003  0x8004  0x8005
     +-----+ +-----+ +-----+ +-----+ +-----+ +-----+
...  |  ?? | |  02 | | 00  | |  00 | |  00 | | ??  |   ...
     +-----+ +-----+ +-----+ +-----+ +-----+ +-----+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...