-
Столкнулся со следующей проблемой : При написании асм-вставки необходимо выполнить условный переход (в моем случае JZ) на адрес , лежащий за пределами моего инжект-кода , т.е. в процессе , в к-й будет производиться ижект . С JMP'ом всё прекрасно получилось , а с условынми переходами - не знаю как . Помогите пожалуйста , заранее огромное спасибо )
-
То есть как - джамп за пределы текущей процедуры/метода? А кто же стек восстанавливать будет?
-
Юзай CALL. Или проставляй как JMP, а при ветвлении, если условие не выполнено, перепрыгивай етот JMP.
-
> То есть как - джамп за пределы текущей процедуры/метода? > А кто же стек восстанавливать будет?
текущая `процедура` используется только , как место в котором хранится код , на неё саму идет JMP )
-
> A.L.E.X.A.N.D.E.R © (08.12.07 16:43) [3]
Не, в такой консерватории что-то неладно. В смысле - структуризация кода какая-то очень подозрительная. В чем исходная задача-то?
-
> JMP'ом всё прекрасно получилось , а с условынми переходами > - не знаю как
Точно так же, разницы абсолютно никакой.
-
> В чем исходная задача-то?
Чего-нибудь крякнуть, вестимо.
> Сергей М. © (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.
-
> DiamondShark © (10.12.07 13:40) [6]
Ты, видимо, опять пьян.
> на момент компиляции положение точки перехода неизвестно
Оно нафих не нужно во время компиляции для решения упомянутой автором задачи.
Ути-пути.
-
> Сергей М. © (10.12.07 13:57) [7]
Читай вопрос. Потом читай Instruction Set Reference.
> Оно нафих не нужно во время компиляции для решения упомянутой > автором задачи.
Ты Instruction Set Reference читал? Как ты сформируешь условный переход, не зная точки перехода?
-
> DiamondShark © (10.12.07 14:08) [8]
> Как ты сформируешь условный переход, не зная точки перехода?
Читай вопрос. Где ты там увидел, что Автор не знает точки перехода ?
-
> [8] DiamondShark © (10.12.07 14:08) > Ты Instruction Set Reference читал? Как ты сформируешь условный > переход, не зная точки перехода?
Укажу по максимуму, 4 байта?
-
> Сергей М. © (10.12.07 14:15) [9]
Ты точно обкуренный.
> Где ты там увидел, что Автор не знает точки перехода ?
А где ты увидел, что адрес нужен Автору?
> лежащий за пределами моего инжект-кода , т.е. в процессе > , в к-й будет производиться ижект .
Ну, Автор знает адрес перехода. Он у него, к примеру, в EAX или в глобальной переменной. И шо? Легче стало?
Ты фигню сказал в [5] :
> Точно так же, разницы абсолютно никакой.
Разница абсолютно принципиальная. JMP допускает кучу режимов адресации. А условные переходы -- только по смещению. Поэтому для формирования иснттрукции условного перехода компилятор (а не Автор, как тебе с раскумару померещилось) должен знать адрес перехода.
Так что ути-пути.
-
> DiamondShark © (10.12.07 14:24) [11]
> где ты увидел, что адрес нужен Автору?
Он у него уже есть. Остается расчитать смещение, если того требует инструкция. Ничто не мешает это сделать в ран-тайм.
> Он у него, к примеру, в EAX или в глобальной переменной
А по барабану где он у него это самое "к примеру" - хоть в регистре хоть в памяти. На методику расчета это никак не влияет. И если расчет невозможно сделать в компайл-тайм, то сделать его в ран-тайм уж точно ничто не мешает.
И про компайл-тайм в вопросе Автора, заметь, ни слова.
Так что ути-пути.
-
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;
-
УТИ-ПУТИ ПАРНИ. :)
-
Блин 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;
-
Сократил до 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;
-
> oxffff © (10.12.07 14:50) [14]
Вообще-то КОП у JZ - это $840F.
Ути-пути - не спеши)
А за иллюстрацию, думаю, Автор будет тебе благодарен.
-
> Сергей М. © (10.12.07 14:58) [17]
Благодарю за поправку.
-
> Сергей М. © (10.12.07 14:42) [12]
Оба-на. Уже появляются какие-то детали про "рассчитать смещение", вместо прежнего бравого "Точно так же, разницы абсолютно никакой".
> Вообще-то КОП у JZ - это $840F.
Ты, видимо, всё-таки заглянул в описание инструкций. Что бы тебе это не сделать до того, как языком чесать? Не пришлось бы потом юлить и отмазываться.
> oxffff ©
И эта лапша -- вместо пары из джампа и локального условного перехода...
;)
|