Перейти к содержанию

Рекомендуемые сообщения

Всем привет! Имеется скрипт:

 

[ENABLE]alloc(newmem,2048) //2kb should be enoughlabel(returnhere)label(originalcode)label(exit)newmem:mov dword ptr [eax+6C],#1120403456originalcode:fsubr dword ptr [eax+6C]fst dword ptr [esp+08]exit:jmp returnhere"Amnesia.exe"+D9FC1:jmp newmemnopnopreturnhere:[DISABLE]dealloc(newmem)"Amnesia.exe"+D9FC1:fsubr dword ptr [eax+6C]fst dword ptr [esp+08]

 
Все работает отлично. Но вот если использовать инструкции CALL и RET:
 
[ENABLE]alloc(newmem,2048) //2kb should be enoughlabel(originalcode)label(exit)newmem:mov dword ptr [eax+6C],#1120403456originalcode:fsubr dword ptr [eax+6C]fst dword ptr [esp+08]exit:ret"Amnesia.exe"+D9FC1:call newmemnopnop[DISABLE]dealloc(newmem)"Amnesia.exe"+D9FC1:fsubr dword ptr [eax+6C]fst dword ptr [esp+08]

 

то масло в фонаре почему-то 0. Как правильно писать скрипт при использовании CALL и RET???

Изменено пользователем Chucky
Ссылка на комментарий
Поделиться на другие сайты

У тебя нет выхода из твоей инъекции, попробуй так:

Правда зачем тебе call и ret в этом скрипте? Если бы много повторяющихся элементов, тогда их очень хорошо использовать.

[ENABLE]alloc(newmem,64) label(exit)newmem:mov dword ptr [eax+6C],#1120403456fsubr dword ptr [eax+6C]fst dword ptr [esp+08]ret"Amnesia.exe"+D9FC1:call newmemnopnopexit:[DISABLE]"Amnesia.exe"+D9FC1:fsubr dword ptr [eax+6C]fst dword ptr [esp+08]dealloc(newmem) 
Изменено пользователем garik66
Ссылка на комментарий
Поделиться на другие сайты

Посмотри внимательно мой второй скрипт. exit: Ошибка не в этом.

У тебя неправильно. я же тебе написал: у тебя нету выхода из инъекции

 

И ещё одно: я сейчас не могу посмотреть, сколько занимает байт call newmem, если 5 (как и jmp newmem), то проверь мой скрипт на работу.

Если call newmem больше, нужно убрать соответствующее количество NOP.

 

PS: Посмотрел: call newmem - 5 байт. Так что проверь скрипт - должен работать. 

 

Если не понятно как работает связка call/ret, пиши - постараюсь объяснить. 

Изменено пользователем garik66
Ссылка на комментарий
Поделиться на другие сайты

Странно, по-идеи, если твой первый скрипт работает должен работать и мой скрипт, только смущают два nop после call, попробуй ещё такой вариант:

 

Если и этот, не сработает, то нужно ставить бряк на инструкции и смотреть, что с регистрами происходит. Либо подождать, когда  мастера ответят.

[ENABLE]alloc(newmem,64) label(exit)newmem:mov dword ptr [eax+6C],#1120403456fsubr dword ptr [eax+6C]fst dword ptr [esp+08]ret"Amnesia.exe"+D9FC1:nopnopcall newmemexit:[DISABLE]"Amnesia.exe"+D9FC1:fsubr dword ptr [eax+6C]fst dword ptr [esp+08]dealloc(newmem)  
Ссылка на комментарий
Поделиться на другие сайты

Не работает тоже. Попробовал поработать с другой инструкцией. Все работает. Вот скрипт:

[ENABLE]alloc(newmem,2048)newmem:mov dword ptr [eax+6C],#1120404556ret"Amnesia.exe"+D9F16:call newmemnopnopnopnop[DISABLE]dealloc(newmem)"Amnesia.exe"+D9F16:fld dword ptr [eax+6C]fcom dword ptr [esi+000000E8]

 

Просто странно. Мой первый скрипт с использованием JMP тоже работает!

Изменено пользователем Chucky
Ссылка на комментарий
Поделиться на другие сайты

Действительно странно, а попробуй тогда скрипт от первой инструкции в таком виде:

И напиши - работает/нет. Тоже уже интересно.

[ENABLE]alloc(newmem,64) newmem:mov dword ptr [eax+6C],#1120403456fsubr dword ptr [eax+6C]fst dword ptr [esp+08]ret"Amnesia.exe"+D9FC1:call newmemnopnop[DISABLE]"Amnesia.exe"+D9FC1:fsubr dword ptr [eax+6C]fst dword ptr [esp+08]dealloc(newmem)  
Ссылка на комментарий
Поделиться на другие сайты

Нет, garik66, тоже не пашет!  :mellow:

Давай тогда посмотрим: 

fld dword ptr [eax+6C] - аналог push, т.е. выталкивает в стек значение из адреса  eax+6C.

а fsubr dword ptr [eax+6C] - отнимает из верха стека значение по адресу eax+6c.

Не понятно почему Call/ret так по разному влияют.

Твой первый скрипт (без call/ret) точно работает?

 

Тогда вопрос чему равно во float число - #1120403456?

Ссылка на комментарий
Поделиться на другие сайты

Тогда ещё один вариант попробуй:

Если и это не сработает. То я наверное не смогу помочь, нужно будет либо Xipho подождать, либо MasterGH (MasterGH быстрее в ассемблер СЕ разберётся).

[ENABLE]alloc(newmem,64) label(exit)newmem:fsubr dword ptr [eax+6C]mov dword ptr [eax+6C],#1120403456 // ещё можно попробовать опустить эту инструкцию ещё ниже - перед ret fst dword ptr [esp+08]             // поставить.ret"Amnesia.exe"+D9FC1:call newmemnopnopexit:[DISABLE]"Amnesia.exe"+D9FC1:fsubr dword ptr [eax+6C]fst dword ptr [esp+08]dealloc(newmem)  
Изменено пользователем garik66
Ссылка на комментарий
Поделиться на другие сайты

call смещает ESP на 4 байта или на 8 байт (зависит от 32 или 64 разрядной платформы)

 

Тогда fst dword ptr [esp+08] уже будет другим

 

например 0x8+0x4 = 0xС

fst dword ptr [esp+0С] 
или 0x8+0x8 = 0x10

fst dword ptr [rsp+10] 
Ссылка на комментарий
Поделиться на другие сайты

Попробуй так. Скройте скрипт под спойлер я просто пишу с телефона и не могу скрыть..
 

[ENABLE]alloc(newmem,2048) //2kb should be enoughlabel(originalcode)label(exit)label(returnhere)newmem:fsubr dword ptr [eax+6C]fst dword ptr [esp+08]mov dword ptr [eax+6C],#100exit:returnhere"Amnesia.exe"+D9FC1:call newmemnopnopreturnhere[DISABLE]dealloc(newmem)"Amnesia.exe"+D9FC1:fsubr dword ptr [eax+6C]fst dword ptr [esp+08]

ARM4ND0: Используем тег кода.
Изменено пользователем ARM4ND0
Ссылка на комментарий
Поделиться на другие сайты

Chucky

я же говорил MasterGH быстро объяснит,

Короче мой второй вариант в "Иcправлении 4" должен работать, т.е. поставить mov dword ptr [eax+6C],#1120403456 ниже fst dword ptr [esp+08].

 

MasterGH

Спасибо большое.

Ссылка на комментарий
Поделиться на другие сайты

Попробуй так. Скройте скрипт под спойлер я просто пишу с телефона и не могу скрыть..

Не mov dword ptr [eax+6C],#100, а mov dword ptr [eax+6C],(float)100.

Изменено пользователем garik66
Ссылка на комментарий
Поделиться на другие сайты

Мастер все верно сказал, нужно внимательно посмореть на стек перед вызовом ret - на верхушке будет лежать адрес, куда передастся управление. Если не туда, куда нужно, то исправить.
Ссылка на комментарий
Поделиться на другие сайты

Мастер все верно сказал, нужно внимательно посмореть на стек перед вызовом ret - на верхушке будет лежать адрес, куда передастся управление. Если не туда, куда нужно, то исправить.

Chucky

Т.к. компы у пользователей твоего скрипта будут разные, то лучше не исправлять esp, а вообще исключить инструкцию fst dword ptr [esp+08]., т.е.  взять инструкцию  выше твоей  fsubr dword ptr [eax+6C] и из неё сделать инъекцию и там уже mov dword ptr [eax+6C],(float)100 сработает.

Изменено пользователем garik66
  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

Спасибо, парни. Взял инструкцию чуть выше:

http://radikal.ru/fp/d86c7fdf3be144739325af6808d64eda

 

сделал такой скрипт:

[ENABLE]alloc(newmem,2048)newmem:fmul dword ptr [esi+000000E4]mov dword ptr [eax+6C],(float)100ret"Amnesia.exe"+D9FBB:call newmemnop[DISABLE]dealloc(newmem)"Amnesia.exe"+D9FBB:fmul dword ptr [esi+000000E4]

 

Все правильно?

Изменено пользователем Chucky
Ссылка на комментарий
Поделиться на другие сайты

Почти. dealloc(newmem) опускай в самый низ.

[ENABLE]alloc(newmem,64)newmem:                           // Очерёдность выполнения инструкций.fmul dword ptr [esi+000000E4]     // 2mov dword ptr [eax+6C],(float)100 // 3ret                               // 4"Amnesia.exe"+D9FBB:call newmem                       // 1nop                               // 5[DISABLE]"Amnesia.exe"+D9FBB:fmul dword ptr [esi+000000E4] dealloc(newmem) 
Ссылка на комментарий
Поделиться на другие сайты

Вообще, читайте документацию по командам, если не до конца уверены в том, как они работают. Пара "call-ret" существует аж в трех экземплярах, но в 99% случаев все работает без аргументов, т.е. просто call и просто ret.

 

Мораль - сперва нужно разобраться в чужом исходнике, прежде чем его использовать.

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.