информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Сетевые кракеры и правда о деле ЛевинаSpanning Tree Protocol: недокументированное применениеСтрашный баг в Windows
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Крупный взлом GoDaddy 
 Просроченный сертификат ломает... 
 Phrack #70/0x46 
главная обзор 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  Число просмотров: 1490
Автор: :-) <:-)> Статус: 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-2021 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach