информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Портрет посетителяЗа кого нас держат?Сетевые кракеры и правда о деле Левина
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
 Умер Никлаус Вирт 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[Pascal] CreateRemoteThread подводные камни. Что делать? Help, please ;-((( 27.10.02 01:58  Число просмотров: 1634
Автор: :-) <:-)> Статус: Elderman
<"чистая" ссылка>
> Итак, как можно видеть, открывается дескриптор процесса
> RegEdit. В нём выделяется память под поток. Копируется в
> эту память исполняемый код потока. Запускается поток на
> выполнение. Работает допущение, что базовый адрес, куда
> загружен Kernel32 в чужом процессе и в моём одинаковые.
> Вопросы:
> 1) Существует ли более-менее "человеческий" способ
> определения размера исполняемого кода — или заходить в
> дебуггер и вручную его считать.

void F1() {}
void F2() {}

int SizeOfF1 = (int)F2 - (int)F1;

> 2) В этом простейшем случае инструкции в потоке идут одна
> за другой. Надо думать, что с появлением ветвлений, циклов
> и т.п., компилятор Delphi, "думая", что компилит для
> "родного" процесса, будет ставить
> абсолютные адреса переходов для
> ветвлений. Можно ли как-нибудь исхитриться и задать
> относительные? И вообще, возможно ли такое без применения
> in-line ассемблера?

А по-моему, для ветвлений, циклов и т.п большинство компиляторов (VC и Delphi в том числе) генерят относительные переходы...

> 3) Почему компилятор генерит такой код возврата из функции,
> помеченной как Stdcall: RET $0004. Я на всякий случай
> поставил просто RET. Как более правильно, поскольку что
> так, что эдак работает ;-)

Должно быть retn 4. Раз ф-я stdcall и принимает 1 параметр, она по возвращении сама должна снять со стека 4 байта. Мне вообще не понятно, зачем нужен этот код (и без него должно работать):
ASM // Correct return throm tread
POP EBP
RET
END;
К тому же этот код зависит от конкретного компилятора: компилятор может и не положить в стек EBP (или наоборот, кроме EBP в стеке может оказаться еще что-нибудь).

> И вообще, может я делаю что-то через задницу? ;-)) Что
> лучше всего использовать для создания кода, который будет
> исполняться в другом процессе?
> Всем спасибо, жду ответов.

Посмотри в книге Рихтера - он с помощью CreateRemoteThread загружает в чужой процесс свою DLL. Вызывая CreateRemoteThread, ей качестве threadfunc передает адрес LoadLibrary (раз Kernel32 в другом процессе загружен по тому же адресу), а в качестве параметра - адрес строки "c:\mydll.dll" (перед этим ее надо поместить в адресное пространство чужого процесса).
<programming> Поиск 






Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach