Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.11.12;
Скачать: CL | DM;

Вниз

Выгрузка процедуры в файл   Найти похожие ветки 

 
TStas ©   (2006-09-29 00:30) [0]

Была ровно год назад такая тема интересная. Я сохранил у себя ответ Юрия Зотова, а вот еще чей-то ответ, кого-то из известных участников форума, не сохранил. Код Зотова могу привести:
Юрий Зотов ©   (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 передают, оторвется ведь часть кода?


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

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


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

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


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

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


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

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

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


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

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

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

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


 
TStas ©   (2006-09-29 21:29) [5]

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


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

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

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


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

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


 
Джо ©   (2006-09-30 14:58) [8]

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

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


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


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


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


 
Anatoly Podgoretsky ©   (2006-09-30 21:32) [10]


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

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


 
learner ©   (2006-10-02 12:53) [11]

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


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


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


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


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

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



Страницы: 1 вся ветка

Текущий архив: 2006.11.12;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.074 c
2-1162189560
Чайник2
2006-10-30 09:26
2006.11.12
Как перенести содержимое поля 1-й таблицы в поле другой?


2-1161780965
vitusrus
2006-10-25 16:56
2006.11.12
Срочный вопрос.


15-1161875153
TIF
2006-10-26 19:05
2006.11.12
Этот заколдованный реестр...


15-1161632618
Bibikanov_Andrea
2006-10-23 23:43
2006.11.12
Футболки для корпоративной команды


15-1161772006
Tilli-Filli
2006-10-25 14:26
2006.11.12
Система город....