Форум: "Основная";
Текущий архив: 2006.11.12;
Скачать: [xml.tar.bz2];
ВнизВыгрузка процедуры в файл Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.044 c