![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Адреса функций в памяти
FearG0 © (2007-09-27 04:53:00)Интересует вот какой момент:
Допустим есть процедура:
procedure TForm1.Button1Click(Sender: TObject);
begin
SubProc1;
beep;
ShowMessage('Период использования программы истёк!');
SubProc2;
end;
Если я возьму адреса @SubProc1 и @SubProc2 то в памяти между ними будет находится код
beep;
ShowMessage('Период использования программы истёк!');
?
Сергей М. (2007-09-28 08:41:00) [21]
> будет ли метка стоять в самом начале процедуры?
Смотря что за процедура.
FearG0 (2007-09-28 03:41:00) [22]Вопрос такой.
Допустим я поставлю в начале процедуры метку
asm
DB 50,60,70,80,90
end;
Затем просканировав программу отыщу ее местоположение в exe, то есть начальный байт.
Затем я стираю из сорца метку и вновь компилирую. Будет ли старый адрес метки указывать на начало процедуры. Если да то всегда ли?
И вообще будет ли метка стоять в самом начале процедуры?
FearG0 (2007-09-27 23:46:00) [23]
> И увы. Относителное смещение call вызова будет "не туда".
Да уже встретился с таким явлением.
Насчет фрагментированности знаний это точно. Только несколько часов изучаю эту тему. Пришел у выводу что надо ботать асму.
oxffff (2007-09-27 22:59:00) [24]пишеться=пишется
oxffff (2007-09-27 22:59:00) [25]
> vpbar © (27.09.07 22:52) [60]
> oxffff © (27.09.07 22:46) [58]
> на самом деле для его задачи писать перемещаемый код не
> обязательно, достаточно скопировать код нужной процедуры.
> Ведь он будет писаться на то же место. Если не на тоже
> - тогда да - это сложнее.
>Ведь он будет писаться на то же место.
Да если и пишеться, по тому же адресу.
Компоновщик может разместит showmessage жертвы по другому адресу.
И увы. Относителное смещение call вызова будет "не туда".
oxffff (2007-09-27 22:54:00) [26]Inject в другую программу вопрос достаточно проработанный, тем более, что "псевдо жертва" сама предусмотривает это. Не так ли?
Вопрос написания injectable кода - это действительно интересная тема. Хотя и тоже достаточно проработаная.
vpbar (2007-09-27 22:52:00) [27]oxffff © (27.09.07 22:46) [58]
на самом деле для его задачи писать перемещаемый код не обязательно, достаточно скопировать код нужной процедуры. Ведь он будет писаться на то же место. Если не на тоже - тогда да - это сложнее.
vpbar (2007-09-27 22:49:00) [28]FearG0 © (27.09.07 22:36) [56]
С указателями знаком. спс за предупреждение)
Добавил в ваш код
VirtualProtect(@XakThis, 2048, PAGE_READWRITE, @dwOldProtect);
перед пропатчиванием. Иначе ошибка была. Догадываюсь что VirtualProtect я использую косячно. Копаю дальше.
Вообщем можно и так. Я в этом случае ставил атрибут записи для секции с помощью CFF Explorer. Зачем лишний вызов и светить VirtualProtect. Хотя вообщем, что в лоб что по лбу.
ЗЫ
Удивляете вы меня. С VirtualProtect знакомы, а такой, извиняюсь, ламерский вопрос задали. Фрагментарные у вас знания, видимо.
На это разрешите откланяться как минимум до послезавтра. Успехов. А wasm почитайте, там много чего интересного.
oxffff (2007-09-27 22:46:00) [29]
> Либо специальная техника написания. Вкраце исключить любые
> привязки к программе включая relative, absolute или indirect
> обращение.
Фактически тебе нужно написать автономный exploit.
oxffff (2007-09-27 22:37:00) [30]
> FearG0 © (27.09.07 22:20) [52]
>
> > Ответь мне, почему код выдранный из другой программы не
>
> > будет работать?
>
> Я понял. Это квест такой. Отвечаешь на вопросы, а тебе за
> это код дают и разные бонусы)))
> Можно подсказку?
> 1. В памяти процедуры и функции имеют такой же размер как
> в exe
> 2. В памяти они располагаются так же как в exe?
Небольшой пример
procedure TMainForm.Button1Click(Sender: TObject);
begin
showmessage('');
showmessage('');
end;
Посмотри внимательно на asm код и ты увидишь, что он разный.
первый вызов showmessage('');
33 С0 xor eax, eax
E8 2BF0 F6 FF call showmessage
второй вызов showmessage('');
33 С0 xor eax, eax
E8 24F0 F6 FF call showmessage
Как видишь отличается вызовы одного и того же.
Если ты пойдешь еще дальше и сделаешь 2B-24=7.
7 байт - 2 байта на xor и 5 байт на call
Компилятор ставляет относительный call вызов.
Но если вызов будет absolute или indirect то легче не станет.
Вообщем reloc и relink тебе в помощь.
Либо специальная техника написания. Вкраце исключить любые привязки к программе включая relative, absolute или indirect обращение.
FearG0 (2007-09-27 22:36:00) [31]С указателями знаком. спс за предупреждение)
Добавил в ваш код
VirtualProtect(@XakThis, 2048, PAGE_READWRITE, @dwOldProtect);
перед пропатчиванием. Иначе ошибка была. Догадываюсь что VirtualProtect я использую косячно. Копаю дальше.
vpbar (2007-09-27 22:31:00) [32]1. В памяти процедуры и функции имеют такой же размер как в exe
размер - да
2. В памяти они располагаются так же как в exe?
нет
ЗЫ Пожалста. Но не понимая что вы делаете, результата добьетесь не скоро. Ибо будут ошибки на пустом месте. В частности если в приведенном примере написать не FirstByteOfCode^:=#$00; а FirstByteOfCode:=#$00; знаете что будет? Если да то хорошо - удачи в отладке. Если нет, то читайте классиков.
FearG0 (2007-09-27 22:27:00) [33]2 vpbar
Огромное спасибо за код и рекомендацию - пошел разбираться.
vpbar (2007-09-27 22:21:00) [34]да. предугадывая вопрос. Для правки секций я пользовался CFF Explorer - рекомендую.
FearG0 (2007-09-27 22:20:00) [35]
> Ответь мне, почему код выдранный из другой программы не
> будет работать?
Я понял. Это квест такой. Отвечаешь на вопросы, а тебе за это код дают и разные бонусы)))
Можно подсказку?
1. В памяти процедуры и функции имеют такой же размер как в exe
2. В памяти они располагаются так же как в exe?
vpbar (2007-09-27 22:20:00) [36]не нашел. пришлось писать. может и не красиво, но работает.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
ButtonCall: TButton;
ButtonPath: TButton;
procedure ButtonPathClick(Sender: TObject);
procedure ButtonCallClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
type TProc = function(): integer;
var codeBuffer:String;
{$R *.dfm}
function XakThis: integer;
begin
result := 1000;
end;
procedure TForm1.ButtonPathClick(Sender: TObject);
var FirstByteOfCode, EndByteOfCode: PChar;
SizeOfProc: Integer;
MarkerCount: Byte;
const OpCod_Ret = $C3;
begin
//XakThis;
FirstByteOfCode := @XakThis;
EndByteOfCode := FirstByteOfCode;
MarkerCount := 0;
while Byte(EndByteOfCode^) <> OpCod_Ret do
inc(EndByteOfCode);
//это не будет работать если в коде процедуры есть байт $C3
//для точного вычисления надо делать минидизассемблер с расчетом длины инструкций
//но проще ставить более менее уникальный маркер в конце процедуры
//или определять размер процедуры из map файла.
SizeOfProc := integer(EndByteOfCode) - integer(FirstByteOfCode);
//b8d0070000
//патчим процедуру надо разрешить запись в секцию
inc(FirstByteOfCode);
FirstByteOfCode^:=#$d0;
inc(FirstByteOfCode);
FirstByteOfCode^:=#$07;
inc(FirstByteOfCode);
FirstByteOfCode^:=#$00;
inc(FirstByteOfCode);
FirstByteOfCode^:=#$00;
end;
procedure TForm1.ButtonCallClick(Sender: TObject);
var proc: TProc;
begin
Caption := inttostr(XakThis);
end;
end.
oxffff (2007-09-27 22:13:00) [37]
> FearG0 © (27.09.07 22:04) [46]
> Ну дайте мне алгоритм хотя бы.
Ответь мне, почему код выдранный из другой программы не будет работать?
oxffff (2007-09-27 22:11:00) [38]
> FearG0 © (27.09.07 22:04) [46]
> Ну дайте мне алгоритм хотя бы.
Какой?
Я разве непонятно написал? в [45].
oxffff (2007-09-27 22:09:00) [39]
> FearG0 © (27.09.07 22:08) [47]
>
> > Больше ничего не скажу. :)
>
> Форт Боярд блин
Да я такой. :)
FearG0 (2007-09-27 22:08:00) [40]
> Больше ничего не скажу. :)
Форт Боярд блин