Форум: "Основная";
Текущий архив: 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