Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Выгрузка процедуры в файл


TStas ©   (2006-09-29 00:30:00) 

Была ровно год назад такая тема интересная. Я сохранил у себя ответ Юрия Зотова, а вот еще чей-то ответ, кого-то из известных участников форума, не сохранил. Код Зотова могу привести:
Юрий Зотов ©   (13.08.05 11:49) [19]
Вот пример исполнения кода в стеке с вызовом ShowMessage из этом коде. В данном случае буфер, хранящий исполняемый код копируется из тела программы, но понятно, что его можно заполнить и из файла, и вообще откуда угодно.

type
TShowMsg = procedure(const Msg: string);
TCallShowMsg = procedure(ShowMsg: TShowMsg; const Msg: string);

procedure CallShowMsg(ShowMsg: TShowMsg; const Msg: string);
begin
ShowMsg(Msg)
end;

procedure ExecuteCodeInsideStack(Buff: string; const Msg: string);
begin
TCallShowMsg(@Buff[1])(@ShowMessage, Msg)
end;

procedure TForm1.FormDblClick(Sender: TObject);
var
L: Cardinal;
S: string;
begin
L := Cardinal(@ExecuteCodeInsideStack) - Cardinal(@CallShowMsg);
SetLength(S, L);
CopyMemory(@S[1], @CallShowMsg, L);
ExecuteCodeInsideStack(S, 'OK')
end;

Но сразу возникает вопрос: ну а если в коду процедуры нарисовался ноль, а его через PChar передают, оторвется ведь часть кода?


Ketmar   (2006-10-02 13:33:00) [1]

>[11] learner(c) 2-Oct-2006, 12:53
>Если я правильно понимаю, то
>LoadLibrary и GetProcAddress являются
>"позиционно независимыми"
совершенно неправильно. в корне просто неверно. то, что тот же kernel32.dll у всех процессов лежит по одним и тем же адресам, ещё не значит, что его процедуры -- "позиционно независимы". это песня совсем про другое.


Сергей М.   (2006-10-02 13:01:00) [2]


> какие еще функции обладают этим полезным качеством ?


Как минимум все без исключения ф-ции, экспортируемые модулями kernel32, user32, gdi32


learner   (2006-10-02 12:53:00) [3]

Если я правильно понимаю, то
LoadLibrary и GetProcAddress являются
"позиционно независимыми" .Т.е. их адреса, например, можно
передать в CreateRemoteThread
pLoadLibW:=GetProcAddress(GetModuleHandle(Kernel32), 'LoadLibraryW');
CreateRemoteThread(hProcess, nil, 0, pLoadLibW, nil, 0, ThreadID);
А какие еще функции обладают этим полезным качеством ? :)
Или как узнать является ли функция таковой ?


Anatoly Podgoretsky   (2006-09-30 21:32:00) [4]


> Я, когда у меня на компе стояли  Delphi 3, использовал строчку,
>  как Array of Byte.

Писать мог, работать не могло.


Сергей М.   (2006-09-30 20:33:00) [5]


> TStas ©   (30.09.06 14:55) [7]


Ой какую глупость ты сейчас сморозил !


Джо   (2006-09-30 14:58:00) [6]

> [7] TStas ©   (30.09.06 14:55)
> >Юрий Зотов Естественно, нечувствителен. Это и есть обычние
> процедуры, а не методы объектов.

То, что это "обычные процедуры" никак не значит того, что они нечувствительны к адресу загрузки.


TStas   (2006-09-30 14:55:00) [7]

>Юрий Зотов Естественно, нечувствителен. Это и есть обычние процедуры, а не методы объектов.


Юрий Зотов   (2006-09-29 21:36:00) [8]

> TStas ©   (29.09.06 21:29) [5]

Код таких процедур должен быть нечувствителен к адресу загрузки. В частности, он не должен использовать относительной адресации. Поэтому я и передавал в него абсолютный адрес процедуры, которую он должен вызвать (ShowMessage). Другой вызов привел бы к краху.


TStas   (2006-09-29 21:29:00) [9]

>Юрий Зотов
Дык понятно это все. Я, когда у меня на компе стояли  Delphi 3, использовал строчку, как Array of Byte. Только вот сколько я не читал Ваш код, отойти от него в сторону у меня никак не получается. У Вас там @ShowMessage.
А мне надо некую процедуру, а еще лучше группу процедур в файл выгрузить.
Про Dll Ну я уж не совсем чайник, как-никак пишу два года. Нужно мне это все для одного: выгрузить в файл и необходимые для работы проги функции и процедуры защиты. Но, потом сам файл шифровать динамическим сдвигом и все.
Просто не хотелось бы, чтобы ветка стала про защиту прог.


Юрий Зотов   (2006-09-29 08:53:00) [10]

Не все то строка, что string'ом обозвано (можно, скажем, посмотреть, как хранятся BLOB-данные в TParam). String - это, прежде всего, указатель на некий буфер, а все остальное зависит от трактовки.

Тот же прием использован и здесь. Если внутри ExecuteCodeInsideStack поставить брейкпойнт и просмотреть двоичное содержимое "строки" Buff, то, скорее всего, нулевой байт в ее теле действительно встретится, и даже не один раз. Однако, ничего не обрезается и код вполне успешно работает. Потому что "строка" Buff трактуется совсем не как строка.

Что касается PChar, то это тоже, прежде всего, указатель на некий буфер, а все остальное тоже зависит от трактовки. И этот указатель и этот буфер, можно использовать, вообще говоря, как угодно. Главное - понимать, что ты делаешь, как ты это делаешь, зачем ты это делаешь и как на твои действия отреагирует компилятор.


guav   (2006-09-29 00:54:00) [11]

> > ну а если в коду процедуры нарисовался ноль, а его через
>
> > PChar передают, оторвется ведь часть кода?
>
> Ну да, конечно.

Точнее, в даном случае, нет.
string может содержать нули в середине, а в CopyMemory передаётся Pointer.
Разрыв, однако, может быть, в других случаях, там где явно или неявно вычисляется длина сторки поиском символа #0.


guav   (2006-09-29 00:47:00) [12]

Позиционно-независимый код писать трудно, и вообще, нет гарантии, что код окажется позиционно-независимым. Кроме того, для практического применения, код должен быть исполняем без остальной части исполнимого модуля. Для выделения части кода в отдельный файл следует использовать исполнимый модуль (dll или ехе) в качестве файла.


> ну а если в коду процедуры нарисовался ноль, а его через
> PChar передают, оторвется ведь часть кода?

Ну да, конечно.
PChar это указатель на строкуи служит для работы со строками, его не следует применять для иных целей.


Fay   (2006-09-29 00:33:00) [13]

В тексте вопроса PChar встречается лишь во фразе "его через PChar передают"


Наверх

Титульная страница Поиск, карта сайта Написать письмо