Конференция "Основная" » Условные переходы в асм-вставках
 
  • A.L.E.X.A.N.D.E.R © (08.12.07 16:21) [0]
    Столкнулся со следующей проблемой :
    При написании асм-вставки необходимо выполнить условный переход (в моем случае JZ) на адрес , лежащий за пределами моего инжект-кода , т.е. в процессе , в к-й будет производиться ижект .
    С JMP'ом всё прекрасно получилось , а с условынми переходами - не знаю как .
    Помогите пожалуйста , заранее огромное спасибо )
  • Юрий Зотов © (08.12.07 16:31) [1]
    То есть как - джамп за пределы текущей процедуры/метода? А кто же стек восстанавливать будет?
  • Dib@zol © (08.12.07 16:34) [2]
    Юзай CALL. Или проставляй как JMP, а при ветвлении, если условие не выполнено, перепрыгивай етот JMP.
  • A.L.E.X.A.N.D.E.R © (08.12.07 16:43) [3]

    > То есть как - джамп за пределы текущей процедуры/метода?
    >  А кто же стек восстанавливать будет?

    текущая `процедура` используется только , как место в котором хранится код , на неё саму идет JMP )
  • Юрий Зотов © (08.12.07 18:01) [4]
    > A.L.E.X.A.N.D.E.R ©   (08.12.07 16:43) [3]

    Не, в такой консерватории что-то неладно. В смысле - структуризация кода какая-то очень подозрительная. В чем исходная задача-то?
  • Сергей М. © (10.12.07 08:18) [5]

    > JMP'ом всё прекрасно получилось , а с условынми переходами
    > - не знаю как


    Точно так же, разницы абсолютно никакой.
  • DiamondShark © (10.12.07 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.
  • Сергей М. © (10.12.07 13:57) [7]

    > DiamondShark ©   (10.12.07 13:40) [6]


    Ты, видимо, опять пьян.


    > на момент компиляции положение точки перехода неизвестно


    Оно нафих не нужно во время компиляции для решения упомянутой автором задачи.

    Ути-пути.
  • DiamondShark © (10.12.07 14:08) [8]

    > Сергей М. ©   (10.12.07 13:57) [7]

    Читай вопрос.
    Потом читай Instruction Set Reference.


    > Оно нафих не нужно во время компиляции для решения упомянутой
    > автором задачи.

    Ты Instruction Set Reference читал? Как ты сформируешь условный переход, не зная точки перехода?
  • Сергей М. © (10.12.07 14:15) [9]

    > DiamondShark ©   (10.12.07 14:08) [8]


    > Как ты сформируешь условный переход, не зная точки перехода?


    Читай вопрос.
    Где ты там увидел, что Автор не знает точки перехода ?
  • homm © (10.12.07 14:15) [10]
    > [8] DiamondShark ©   (10.12.07 14:08)
    > Ты Instruction Set Reference читал? Как ты сформируешь условный
    > переход, не зная точки перехода?

    Укажу по максимуму, 4 байта?
  • DiamondShark © (10.12.07 14:24) [11]

    > Сергей М. ©   (10.12.07 14:15) [9]

    Ты точно обкуренный.


    > Где ты там увидел, что Автор не знает точки перехода ?

    А где ты увидел, что адрес нужен Автору?


    > лежащий за пределами моего инжект-кода , т.е. в процессе
    > , в к-й будет производиться ижект .

    Ну, Автор знает адрес перехода. Он у него, к примеру, в EAX или в глобальной переменной.
    И шо? Легче стало?

    Ты фигню сказал в  [5] :

    > Точно так же, разницы абсолютно никакой.


    Разница абсолютно принципиальная. JMP допускает кучу режимов адресации. А условные переходы -- только по смещению.
    Поэтому для формирования иснттрукции условного перехода компилятор (а не Автор, как тебе с раскумару померещилось) должен знать адрес перехода.

    Так что ути-пути.
  • Сергей М. © (10.12.07 14:42) [12]

    > DiamondShark ©   (10.12.07 14:24) [11]


    > где ты увидел, что адрес нужен Автору?


    Он у него уже есть.
    Остается расчитать смещение, если того требует инструкция.
    Ничто не мешает это сделать в ран-тайм.


    > Он у него, к примеру, в EAX или в глобальной переменной


    А по барабану где он у него  это самое "к примеру" - хоть в регистре хоть в памяти.
    На методику расчета это никак не влияет.
    И если расчет невозможно сделать в компайл-тайм, то сделать его в ран-тайм уж точно ничто не мешает.

    И про компайл-тайм в вопросе Автора, заметь, ни слова.

    Так что ути-пути.
  • oxffff © (10.12.07 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 © (10.12.07 14:50) [14]
    УТИ-ПУТИ ПАРНИ.
    :)
  • oxffff © (10.12.07 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 © (10.12.07 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;
  • Сергей М. © (10.12.07 14:58) [17]

    > oxffff ©   (10.12.07 14:50) [14]


    Вообще-то КОП у JZ - это $840F.

    Ути-пути - не спеши)

    А за иллюстрацию, думаю, Автор будет тебе благодарен.
  • oxffff © (10.12.07 15:03) [18]

    > Сергей М. ©   (10.12.07 14:58) [17]


    Благодарю за поправку.
  • DiamondShark © (10.12.07 15:13) [19]

    > Сергей М. ©   (10.12.07 14:42) [12]


    Оба-на. Уже появляются какие-то детали про "рассчитать смещение", вместо прежнего бравого "Точно так же, разницы абсолютно никакой".


    > Вообще-то КОП у JZ - это $840F.


    Ты, видимо, всё-таки заглянул в описание инструкций. Что бы тебе это не сделать до того, как языком чесать?
    Не пришлось бы потом юлить и отмазываться.


    > oxffff ©

    И эта лапша -- вместо пары из джампа и локального условного перехода...

    ;)
 
Конференция "Основная" » Условные переходы в асм-вставках
Есть новые Нет новых   [133939   +173][b:0][p:0.001]