Форум: "Основная";
Текущий архив: 2008.08.24;
Скачать: [xml.tar.bz2];
ВнизУсловные переходы в асм-вставках Найти похожие ветки
← →
A.L.E.X.A.N.D.E.R © (2007-12-08 16:21) [0]Столкнулся со следующей проблемой :
При написании асм-вставки необходимо выполнить условный переход (в моем случае JZ) на адрес , лежащий за пределами моего инжект-кода , т.е. в процессе , в к-й будет производиться ижект .
С JMP"ом всё прекрасно получилось , а с условынми переходами - не знаю как .
Помогите пожалуйста , заранее огромное спасибо )
← →
Юрий Зотов © (2007-12-08 16:31) [1]То есть как - джамп за пределы текущей процедуры/метода? А кто же стек восстанавливать будет?
← →
Dib@zol © (2007-12-08 16:34) [2]Юзай CALL. Или проставляй как JMP, а при ветвлении, если условие не выполнено, перепрыгивай етот JMP.
← →
A.L.E.X.A.N.D.E.R © (2007-12-08 16:43) [3]
> То есть как - джамп за пределы текущей процедуры/метода?
> А кто же стек восстанавливать будет?
текущая `процедура` используется только , как место в котором хранится код , на неё саму идет JMP )
← →
Юрий Зотов © (2007-12-08 18:01) [4]> A.L.E.X.A.N.D.E.R © (08.12.07 16:43) [3]
Не, в такой консерватории что-то неладно. В смысле - структуризация кода какая-то очень подозрительная. В чем исходная задача-то?
← →
Сергей М. © (2007-12-10 08:18) [5]
> JMP"ом всё прекрасно получилось , а с условынми переходами
> - не знаю как
Точно так же, разницы абсолютно никакой.
← →
DiamondShark © (2007-12-10 13:40) [6]
> В чем исходная задача-то?
Чего-нибудь крякнуть, вестимо.
> Сергей М. © (10.12.07 08:18) [5]
> Точно так же, разницы абсолютно никакой.
Ути-пути.
> A.L.E.X.A.N.D.E.R © (08.12.07 16:21)
> При написании асм-вставки необходимо выполнить условный
> переход (в моем случае JZ) на адрес , лежащий за пределами
> моего инжект-кода , т.е. в процессе , в к-й будет производиться
> ижект .
> С JMP"ом всё прекрасно получилось , а с условынми переходами
> - не знаю как .
Никак. Условные переходы только относительные по 8-, 16- или 32-битному смещению.
А так как на момент компиляции положение точки перехода неизвестно, то и вычислить смещение не представляется возможным.
Используй JMP, а условные переходы для обхода JMP.
← →
Сергей М. © (2007-12-10 13:57) [7]
> DiamondShark © (10.12.07 13:40) [6]
Ты, видимо, опять пьян.
> на момент компиляции положение точки перехода неизвестно
Оно нафих не нужно во время компиляции для решения упомянутой автором задачи.
Ути-пути.
← →
DiamondShark © (2007-12-10 14:08) [8]
> Сергей М. © (10.12.07 13:57) [7]
Читай вопрос.
Потом читай Instruction Set Reference.
> Оно нафих не нужно во время компиляции для решения упомянутой
> автором задачи.
Ты Instruction Set Reference читал? Как ты сформируешь условный переход, не зная точки перехода?
← →
Сергей М. © (2007-12-10 14:15) [9]
> DiamondShark © (10.12.07 14:08) [8]
> Как ты сформируешь условный переход, не зная точки перехода?
Читай вопрос.
Где ты там увидел, что Автор не знает точки перехода ?
← →
homm © (2007-12-10 14:15) [10]> [8] DiamondShark © (10.12.07 14:08)
> Ты Instruction Set Reference читал? Как ты сформируешь условный
> переход, не зная точки перехода?
Укажу по максимуму, 4 байта?
← →
DiamondShark © (2007-12-10 14:24) [11]
> Сергей М. © (10.12.07 14:15) [9]
Ты точно обкуренный.
> Где ты там увидел, что Автор не знает точки перехода ?
А где ты увидел, что адрес нужен Автору?
> лежащий за пределами моего инжект-кода , т.е. в процессе
> , в к-й будет производиться ижект .
Ну, Автор знает адрес перехода. Он у него, к примеру, в EAX или в глобальной переменной.
И шо? Легче стало?
Ты фигню сказал в [5] :
> Точно так же, разницы абсолютно никакой.
Разница абсолютно принципиальная. JMP допускает кучу режимов адресации. А условные переходы -- только по смещению.
Поэтому для формирования иснттрукции условного перехода компилятор (а не Автор, как тебе с раскумару померещилось) должен знать адрес перехода.
Так что ути-пути.
← →
Сергей М. © (2007-12-10 14:42) [12]
> DiamondShark © (10.12.07 14:24) [11]
> где ты увидел, что адрес нужен Автору?
Он у него уже есть.
Остается расчитать смещение, если того требует инструкция.
Ничто не мешает это сделать в ран-тайм.
> Он у него, к примеру, в EAX или в глобальной переменной
А по барабану где он у него это самое "к примеру" - хоть в регистре хоть в памяти.
На методику расчета это никак не влияет.
И если расчет невозможно сделать в компайл-тайм, то сделать его в ран-тайм уж точно ничто не мешает.
И про компайл-тайм в вопросе Автора, заметь, ни слова.
Так что ути-пути.
← →
oxffff © (2007-12-10 14:49) [13]procedure TmainForm.Button4Click(Sender: TObject);
var a:DWORD;
begin
VirtualProtect(@TmainForm.Button4Click,100,PAGE_EXECUTE_READWRITE,a);
FlushInstructionCache(GetCurrentProcess,@TmainForm.Button4Click,100);
asm
mov ecx,offset @ExternalLink;
mov eax,offset @NextInstr;
sub eax,ecx;
inc eax;
mov ecx,offset @PatchHere;
mov [ecx],eax;
DW $850F;
@PatchHere:DD $00000000;
@NextInstr:
@ExternalLink:
end;
end;
← →
oxffff © (2007-12-10 14:50) [14]УТИ-ПУТИ ПАРНИ.
:)
← →
oxffff © (2007-12-10 14:51) [15]Блин inc не убрал.
> procedure TmainForm.Button4Click(Sender: TObject);
> var a:DWORD;
> begin
> VirtualProtect(@TmainForm.Button4Click,100,PAGE_EXECUTE_READWRITE,
> a);
> FlushInstructionCache(GetCurrentProcess,@TmainForm.Button4Click,
> 100);
> asm
> mov ecx,offset @ExternalLink;
> mov eax,offset @NextInstr;
> sub eax,ecx;
> mov ecx,offset @PatchHere;
> mov [ecx],eax;
> DW $850F;
> @PatchHere:DD $00000000;
> @NextInstr:
> @ExternalLink:
> end;
> end;
← →
oxffff © (2007-12-10 14:57) [16]Сократил до
VirtualProtect(@TmainForm.Button4Click,100,PAGE_EXECUTE_READWRITE,a);
FlushInstructionCache(GetCurrentProcess,@TmainForm.Button4Click,100);
asm
mov ecx,offset @ExternalLink;
mov eax,offset @NextInstr;
sub eax,ecx;
mov [offset @PatchHere],eax;
DW $850F;
@PatchHere:DD $00000000;
@NextInstr:
@ExternalLink:
end;
← →
Сергей М. © (2007-12-10 14:58) [17]
> oxffff © (10.12.07 14:50) [14]
Вообще-то КОП у JZ - это $840F.
Ути-пути - не спеши)
А за иллюстрацию, думаю, Автор будет тебе благодарен.
← →
oxffff © (2007-12-10 15:03) [18]
> Сергей М. © (10.12.07 14:58) [17]
Благодарю за поправку.
← →
DiamondShark © (2007-12-10 15:13) [19]
> Сергей М. © (10.12.07 14:42) [12]
Оба-на. Уже появляются какие-то детали про "рассчитать смещение", вместо прежнего бравого "Точно так же, разницы абсолютно никакой".
> Вообще-то КОП у JZ - это $840F.
Ты, видимо, всё-таки заглянул в описание инструкций. Что бы тебе это не сделать до того, как языком чесать?
Не пришлось бы потом юлить и отмазываться.
> oxffff ©
И эта лапша -- вместо пары из джампа и локального условного перехода...
;)
← →
Сергей М. © (2007-12-10 15:28) [20]Удалено модератором
← →
DiamondShark © (2007-12-10 15:38) [21]Удалено модератором
← →
oxffff © (2007-12-10 15:46) [22]
> Сергей М. © (10.12.07 15:28) [20]
Там действительно проще absolute direct or indirect jump
jmp [ebp-$08] или jmp eax
← →
Сергей М. © (2007-12-10 15:55) [23]
> oxffff © (10.12.07 15:46) [22]
О т.н. "простоте" я речь и не вел, о ней и у автора речи не идет.
← →
Rouse_ © (2007-12-10 16:17) [24]DiamondShark, Сергей М. - завязывайте со своими ути-путями, бо придется резать посты. И не забывайте про первый пункт правил.
← →
DiamondShark © (2007-12-10 16:38) [25]
> бо придется резать посты
Правильно.
Бессодержательные, или заведомо ложные, каковым примером является [5], и вообще значительная часть постов Сергей М.
← →
oxffff © (2007-12-10 16:44) [26]Удалено модератором
Примечание: Оффтоп...
← →
Rouse_ © (2007-12-10 16:46) [27]
> Бессодержательные, или заведомо ложные
Если считаешь это таковым - то просто предложы свою версию. Собачиться то зачем друг с другом? Ладно - проехали...
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2008.08.24;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.039 c