Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.041 c
4-1151158689
max1981
2006-06-24 18:18
2006.11.12
возможно-ли из своей программы закрыть окно проводника


2-1161599893
Megabyte
2006-10-23 14:38
2006.11.12
Компоненты работы с почтой


15-1161415275
Гарри Поттер
2006-10-21 11:21
2006.11.12
Анимация "пожалуйста ждите"


1-1159475439
TStas
2006-09-29 00:30
2006.11.12
Выгрузка процедуры в файл


2-1161944511
RomanH
2006-10-27 14:21
2006.11.12
Опять эти MDI-окна





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский