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

Вниз

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

 
vpbar ©   (2007-09-27 19:09) [40]


> FearG0 ©   (27.09.07 16:10) [15]
> 1. При наличие дебаггеров просо вываливаться программе
> 2. После получения кода с сервера запускать поток, который
> если прога уж очень долго выполняет этот критичный код будет
> ее вырубать
> 3. Внутри кода несколько блоков которые будут проверять
> целостность программы, путем подсчета CRC и в случае ее
> патча вываливаться
> 4. еще что-нить придумаю

Если ты это реализовал, то тогда непонятно в чем проблема с сабжем, после того как сумел обмануть дебагеры - сабж это чепуха.
Если еще не реализовал, тогда бегом на WASM .ru читать до просветления. А потом можно на http://www.cracklab.ru/ посмотреть на противника :) хотя они там щас сонные. И тогда вопросы типа
"1. Как определить что участок кода в exe соответствует именно моей процедуре в сорце.
2. Как патчить процедуру в памяти." Отпадут.
А если время дороже - купи готовое решения, типа тех что предлагали выше.


 
FearG0 ©   (2007-09-27 19:33) [41]

Читать теорию это все конечно хорошо и ознакомиться можно.
Но -
1. сроки поджимают
2. Тонны мануалов никогда не заменят 1-2 примера
3. Если кто сталкивался подскажите хороший источник где такая тема уже поднималась, обсуждалась и реализовывалась. В гугл посылать не надо, уже почитываю что там есть.


 
vpbar ©   (2007-09-27 20:32) [42]

>>FearG0 ©   (27.09.07 19:33) [41]
1. сроки поджимают
- купите готовое решение
2. Тонны мануалов никогда не заменят 1-2 примера
- 1-2 примера никогда не заменят теорию
3. Если кто сталкивался подскажите хороший источник где такая тема уже поднималась, обсуждалась и реализовывалась. В гугл посылать не надо, уже почитываю что там есть.
- я сталкивался. Источник посоветовал.


 
vpbar ©   (2007-09-27 20:45) [43]

Но если кратко.
1. Как определить что участок кода в exe соответствует именно моей процедуре в сорце.
определяем адрес процедуры и длину (можно просканить до первого ret)
 если адрес кода входит в этот диапазон - то это та процедура
2. Как патчить процедуру в памяти.
 для начала ставим возможность записи для секции кода, запрещаем винде всякие ругательства типа DEP потом пишем по нужному адресу.
В делфе можно привести адрес к PChar и писать туда.


 
FearG0 ©   (2007-09-27 21:33) [44]


> 1. Как определить что участок кода в exe соответствует именно
> моей процедуре в сорце. определяем адрес процедуры и длину
> (можно просканить до первого ret)

Можно алгоритм или кусок кода если не тяжело?


 
oxffff ©   (2007-09-27 22:00) [45]


> FearG0 ©   (27.09.07 21:33) [44]
>
> > 1. Как определить что участок кода в exe соответствует
> именно
> > моей процедуре в сорце. определяем адрес процедуры и длину
>
> > (можно просканить до первого ret)
>
> Можно алгоритм или кусок кода если не тяжело?


Даже, если выдрать этот кусок.  Просто вставить в  другую программу не получится в подавляющем большинстве случаев .
Больше ничего не скажу. :)

P.S. Чтение мне не раз помогало. А вам?


 
FearG0 ©   (2007-09-27 22:04) [46]

Ну дайте мне алгоритм хотя бы.


 
FearG0 ©   (2007-09-27 22:08) [47]


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

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


 
oxffff ©   (2007-09-27 22:09) [48]


> FearG0 ©   (27.09.07 22:08) [47]
>
> > Больше ничего не скажу. :)
>
> Форт Боярд блин


Да я такой. :)


 
oxffff ©   (2007-09-27 22:11) [49]


> FearG0 ©   (27.09.07 22:04) [46]
> Ну дайте мне алгоритм хотя бы.


Какой?
Я разве непонятно написал? в [45].


 
oxffff ©   (2007-09-27 22:13) [50]


> FearG0 ©   (27.09.07 22:04) [46]
> Ну дайте мне алгоритм хотя бы.


Ответь мне, почему код выдранный из другой программы не будет работать?


 
vpbar ©   (2007-09-27 22:20) [51]

не нашел. пришлось писать. может и не красиво, но работает.
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.


 
FearG0 ©   (2007-09-27 22:20) [52]


> Ответь мне, почему код выдранный из другой программы не
> будет работать?

Я понял. Это квест такой. Отвечаешь на вопросы, а тебе за это код дают и разные бонусы)))
Можно подсказку?
1. В памяти процедуры и функции имеют такой же размер как в exe
2. В памяти они располагаются так же как в exe?


 
vpbar ©   (2007-09-27 22:21) [53]

да. предугадывая вопрос. Для правки секций я пользовался CFF Explorer - рекомендую.


 
FearG0 ©   (2007-09-27 22:27) [54]

2 vpbar

Огромное спасибо за код и рекомендацию - пошел разбираться.


 
vpbar ©   (2007-09-27 22:31) [55]

1. В памяти процедуры и функции имеют такой же размер как в exe
размер - да
2. В памяти они располагаются так же как в exe?
нет
ЗЫ Пожалста. Но не понимая что вы делаете, результата добьетесь не скоро. Ибо будут ошибки на пустом месте. В частности если в приведенном примере написать не FirstByteOfCode^:=#$00; а FirstByteOfCode:=#$00; знаете что будет? Если да то хорошо - удачи в отладке. Если нет, то читайте классиков.


 
FearG0 ©   (2007-09-27 22:36) [56]

С указателями знаком. спс за предупреждение)
Добавил в ваш код
VirtualProtect(@XakThis, 2048, PAGE_READWRITE, @dwOldProtect);
перед пропатчиванием. Иначе ошибка была. Догадываюсь что VirtualProtect я использую косячно. Копаю дальше.


 
oxffff ©   (2007-09-27 22:37) [57]


> 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 2B F0 F6 FF      call showmessage

второй вызов showmessage("");
33 С0                   xor eax, eax
E8 24 F0 F6 FF      call showmessage

Как видишь отличается вызовы одного и того же.
Если ты пойдешь еще дальше и сделаешь 2B-24=7.

7 байт  - 2  байта на xor и 5 байт на call

Компилятор ставляет относительный call вызов.

Но если вызов будет absolute или indirect то легче не станет.

Вообщем reloc и relink тебе в помощь.

Либо специальная техника написания. Вкраце исключить любые привязки к программе включая relative, absolute или indirect обращение.


 
oxffff ©   (2007-09-27 22:46) [58]


> Либо специальная техника написания. Вкраце исключить любые
> привязки к программе включая relative, absolute или indirect
> обращение.


Фактически тебе нужно написать автономный exploit.


 
vpbar ©   (2007-09-27 22:49) [59]

FearG0 ©   (27.09.07 22:36) [56]
С указателями знаком. спс за предупреждение)
Добавил в ваш код
VirtualProtect(@XakThis, 2048, PAGE_READWRITE, @dwOldProtect);
перед пропатчиванием. Иначе ошибка была. Догадываюсь что VirtualProtect я использую косячно. Копаю дальше.

Вообщем можно и так. Я в этом случае ставил атрибут записи для секции с помощью CFF Explorer. Зачем лишний вызов и светить VirtualProtect. Хотя вообщем, что в лоб что по лбу.
ЗЫ
Удивляете вы меня. С VirtualProtect знакомы, а такой, извиняюсь, ламерский вопрос задали. Фрагментарные у вас знания, видимо.
На это разрешите откланяться как минимум до послезавтра. Успехов. А wasm почитайте, там много чего интересного.


 
vpbar ©   (2007-09-27 22:52) [60]

oxffff ©   (27.09.07 22:46) [58]
на самом деле для его задачи писать перемещаемый код не обязательно, достаточно скопировать код нужной процедуры. Ведь он будет писаться на то же место. Если не на тоже - тогда да - это сложнее.


 
oxffff ©   (2007-09-27 22:54) [61]

Inject в другую программу вопрос достаточно проработанный, тем более, что "псевдо жертва" сама предусмотривает это. Не так ли?

Вопрос написания injectable кода - это действительно интересная тема. Хотя и тоже достаточно проработаная.


 
oxffff ©   (2007-09-27 22:59) [62]


> vpbar ©   (27.09.07 22:52) [60]
> oxffff ©   (27.09.07 22:46) [58]
> на самом деле для его задачи писать перемещаемый код не
> обязательно, достаточно скопировать код нужной процедуры.
>  Ведь он будет писаться на то же место. Если не на тоже
> - тогда да - это сложнее.


>Ведь он будет писаться на то же место.

Да если  и пишеться, по тому же адресу.
Компоновщик может разместит showmessage жертвы по другому адресу.
И увы. Относителное смещение call вызова будет "не туда".


 
oxffff ©   (2007-09-27 22:59) [63]

пишеться=пишется


 
FearG0 ©   (2007-09-27 23:46) [64]


> И увы. Относителное смещение call вызова будет "не туда".

Да уже встретился с таким явлением.
Насчет фрагментированности знаний это точно. Только несколько часов изучаю эту тему. Пришел у выводу что надо ботать асму.


 
FearG0 ©   (2007-09-28 03:41) [65]

Вопрос такой.
Допустим я поставлю в начале процедуры метку
asm
  DB 50,60,70,80,90
end;
Затем просканировав программу отыщу ее местоположение в exe, то есть начальный байт.
Затем я стираю из сорца метку и вновь компилирую. Будет ли старый адрес метки указывать на начало процедуры. Если да то всегда ли?
И вообще будет ли метка стоять в самом начале процедуры?


 
Сергей М. ©   (2007-09-28 08:41) [66]


> будет ли метка стоять в самом начале процедуры?


Смотря что за процедура.


 
FearG0 ©   (2007-09-28 16:02) [67]

Можно поподробнее, какая процедура должна быть чтобы искомое утверждение было верно?


 
vpbar ©   (2007-09-29 17:42) [68]

>>FearG0 ©   (28.09.07 03:41) [65]
Ну, во-первых, в этом случае метка почти всегда будет не в начале процедуры, ибо в начале стек готовится. Пройдись в отладчике увидишь.
Во вторых, если изменить исходник и перекопилировать прогу, то бинарный файл тоже изменится и если адрес процедуры не изменится, то я посчитал бы это вызением.


 
vpbar ©   (2007-09-29 17:46) [69]

>>oxffff ©   (27.09.07 22:59) [62]
Истину глаголишь, но я имел ввиду следующее. Копируем машинный-код процедуры (например,на сервер  как в сабже). Затираем процедуру (например, $C3C3C3C3C3C3C3C3.... :) )
И ели  записывам эту же процедуру (с сервера) назад на то же место, то работать оно будет.


 
vpbar ©   (2007-09-29 17:50) [70]

FearG0 ©   (27.09.07 15:59) [11]
Защита от взлома.
Дело не в том чтобы ввести в заблуждение.
У меня есть пару процедур которые производят расчеты, без которых смысл программы теряется.
Скомпилированный код я вытащу и сохраню, а в программе затру.
Далее при прохождении кода, программа будет обращаться на сервер, передавать информацию о ключе активации программы и о железе, на сервере сервис будет смотреть на сколько это достоверно, и если все ок отправлять код процедуры в зашифрованном виде программе. Программа расшифрует, перепрошьет свою память и выполнит некогда затертый участок.

А вообще если не заморачиваться, то ломается это просто.
После того как прога расшифрует и перепрошьет делаем дамп и весь код у нас на руках. Далее прошиваем программу сами этим котом. Ломаем проверки целостности, если они есть и готово. Скрещиваем пальцы и надеемся что ничего кроме не изменилось.


 
oxffff ©   (2007-09-29 18:13) [71]


> vpbar ©   (29.09.07 17:46) [69]
> >>oxffff ©   (27.09.07 22:59) [62]
> Истину глаголишь, но я имел ввиду следующее. Копируем машинный-
> код процедуры (например,на сервер  как в сабже). Затираем
> процедуру (например, $C3C3C3C3C3C3C3C3.... :) )
> И ели  записывам эту же процедуру (с сервера) назад на то
> же место, то работать оно будет.


А в чем тогда состоит защита? :)


 
vpbar ©   (2007-09-29 18:18) [72]

Ни в чем см [70], почти, только в том что для получения кода надо пару лишних телодвижений.


 
oxffff ©   (2007-09-29 18:20) [73]


> vpbar ©   (29.09.07 18:18) [72]
> Ни в чем см [70], почти, только в том что для получения
> кода надо пару лишних телодвижений.


И я о том же. Cмотри последние два знака [71], а именно :)


 
oxffff ©   (2007-09-29 18:22) [74]

to vpbar.

Загляни сюда. Это полезней. :)

http://excastle.com/blog/archive/2007/09/28/49839.aspx


 
vpbar ©   (2007-09-29 18:44) [75]

>>oxffff ©   (29.09.07 18:22) [74]
Хм. Спасибо, действительно интересно. Чтото мне инфа в руки идет, я как раз хочу компилятор для своего языка писать (уже года два хочу :) да все некогда), а тут то один пример, до другой.


 
FearG0 ©   (2007-09-29 19:36) [76]

Всем спасибо за информацию, вроде разобрался что к чему. Понял тему, знаю куда копать и что усовершенствовывать.


 
vpbar ©   (2007-09-29 19:44) [77]

успехов. CrackMe сделай :)


 
FearG0 ©   (2007-09-29 20:09) [78]

Обязательно как только релиз будет.


 
Dmitry S   (2007-09-30 18:05) [79]

А почему нельзя загрузить недостающее в виде dll?


 
TStas ©   (2007-10-01 21:15) [80]

А почему тогда нельзя dllю на сервер положить и грузить её явно и без заморочек?



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

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

Наверх




Память: 0.65 MB
Время: 0.022 c
2-1196486249
Ravshan
2007-12-01 08:17
2007.12.23
Как можна скопировать структуру и данные из формата dbf на Oracle


2-1196426968
webpauk
2007-11-30 15:49
2007.12.23
Папка верхнего уровня


2-1196497132
Pacific
2007-12-01 11:18
2007.12.23
Ошибка


1-1191582712
Checkmate-maker
2007-10-05 15:11
2007.12.23
Обмен данными между процессами


15-1195544501
DelphiN!
2007-11-20 10:41
2007.12.23
VCL c потдержкой Unicode для Delphi6