Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2007.12.23;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.63 MB
Время: 0.05 c
15-1195910267
VladOil
2007-11-24 16:17
2007.12.23
Картинку в RichEdit


15-1195736888
Denis__
2007-11-22 16:08
2007.12.23
Лукьяненко


2-1195811107
Phoenix
2007-11-23 12:45
2007.12.23
Можно ли в парадоксе в запросе вытащить год из даты?


15-1195570715
peregrooz
2007-11-20 17:58
2007.12.23
Производная


2-1196417567
Pacific
2007-11-30 13:12
2007.12.23
Как





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский