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

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

Адреса функций в памяти


Страницы:   1 2 3 4 5

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]


> Больше ничего не скажу. :)

Форт Боярд блин


Страницы:   1 2 3 4 5

Наверх

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