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

Вниз

Нужна вычитка статьи   Найти похожие ветки 

 
Rouse_ ©   (2016-02-28 01:13) [40]

Да нормально, как мне статью то править, если я все мнения со стороны не услышу? Не для себя ж пишу :)


 
Германн ©   (2016-02-28 01:25) [41]

Ну тогда извини, что техническую часть я даже не читал. :(


 
NoUser ©   (2016-02-28 23:59) [42]

DWORD-ы в примерах (при работе с адресами) было бы поучительно (дженерики то внедрил) заменить на Pointer и/или IntPtr/UIntPtr.

Тогда вместо, возможно ошибочного,
"(плюс 2 дворда что в 32 битном, что в 64 битном варианте)"
два слова сказать про отличия указателей в x64 и заменить "4" на
const cbPtr = SizeOf(Pointer/IntPtr) ;)

PS.
В тексте многовато "но" - можно попробовать заменить на "а", "и", "а вот"  или просто убрать,
но )) это так, - косметика.

<< Но_ это в Visual Studio, а вот в Дельфи такого сделать так сходу нельзя - не умеет она, но!!!
Но_ есть небольшой трюк, связанный с тем что разработчики компилера_ Дельфи, уж не знаю по каким причинам, но_ немного нам помогли, создав неинициализированную TLS секцию в исполняемом файле. С какого времени это началось - я не знаю, но_ начиная … >>

<< то мы инициализирует_ ее >>
<< убиваем_ ее значение  >>

PPS.
http://pritchi.castle.by/ras-013-402.html (http://static2.ozone.ru/multimedia/books_covers/1007045216.jpg)


 
Rouse_ ©   (2016-02-29 13:38) [43]


> Тогда вместо, возможно ошибочного,
> "(плюс 2 дворда что в 32 битном, что в 64 битном варианте)"
> два слова сказать про отличия указателей в x64 и заменить
> "4" на
> const cbPtr = SizeOf(Pointer/IntPtr) ;)

Нет тут код не ошибочный (2 дворда в структуре идет последними в обоих вариантах)

 _IMAGE_TLS_DIRECTORY64 = record
   StartAddressOfRawData: ULONGLONG;
   EndAddressOfRawData: ULONGLONG;
   AddressOfIndex: ULONGLONG;         // PDWORD
   AddressOfCallBacks: ULONGLONG;     // PIMAGE_TLS_CALLBACK *;
   SizeOfZeroFill: DWORD;
   Characteristics: DWORD;
 end;

 _IMAGE_TLS_DIRECTORY32 = record
   StartAddressOfRawData: DWORD;
   EndAddressOfRawData: DWORD;
   AddressOfIndex: DWORD;         // PDWORD
   AddressOfCallBacks: DWORD;     // PIMAGE_TLS_CALLBACK *;
   SizeOfZeroFill: DWORD;
   Characteristics: DWORD;
 end;


А про указатели - для демо достаточно и такого, нельзя же все выкладывать на блюдечке с голубой каемкой, человек и сам должен немного мозг включить прежде чем использовать сторонний код.
По остальному вечером попричесываю тем более тут один нюансик вскрылся, который придется подправить.


 
Rouse_ ©   (2016-02-29 14:57) [44]

Ну вроде как причесал - если за вечер никто ничего не найдет, завтра тогда на паблик выложу


 
Тимохов Дима ©   (2016-02-29 15:06) [45]

Прочитал. Идейно понятно.

Чисто философский вопрос.

Реверсер же сразу поймет при следующем запуске, что его пытаются обхитрить.
Неужели он не найдет управу? Да хоть дампы в Parallels Desktop сделать с уже запущенной программой.

Суть вопроса стоит ли делать подобную защиту (у реверсера же наверняка рука набита на противодействии таким трюкам)?


 
Rouse_ ©   (2016-02-29 16:06) [46]


> Тимохов Дима ©   (29.02.16 15:06) [45]
> Реверсер же сразу поймет при следующем запуске, что его
> пытаются обхитрить.

Конечно поймет.


> Неужели он не найдет управу? Да хоть дампы в Parallels Desktop
> сделать с уже запущенной программой.
>
> Суть вопроса стоит ли делать подобную защиту (у реверсера
> же наверняка рука набита на противодействии таким трюкам)?
>

Если код защиты под виртуальной машиной - очень долго искать придется.

А так вообще - тут же только сам принцип, на практике антидамп в разы сложнее делается :)


 
Тимохов Дима ©   (2016-02-29 16:29) [47]


> А так вообще - тут же только сам принцип, на практике антидамп
> в разы сложнее делается :)


Не, ну все же чем Parallels тебе не нравится?
Запустил, снял дамп, потом сколько хочешь восстанавливай.
Ты же защищается от повторного запуска по снятому дампу. А тут и запуска не будет повторного.

Я не в части критики, просто интересно.
Я то в свое время поставил на виртуальную машину (чужую), которую натравил на некую свою виртуальную машину. Расчет на то - задолбаются 100мб мусора фильтровать.
Может, обновляться придется. Вот, думаю - надо ли мне это.

ЗЫ Саш, извиняй плз за оффтоп))


 
Rouse_ ©   (2016-02-29 16:47) [48]


> Тимохов Дима ©   (29.02.16 16:29) [47]
> Не, ну все же чем Parallels тебе не нравится?
> Запустил, снял дамп, потом сколько хочешь восстанавливай.

Понятно - статью ты не читал, там описано почему нужно делать дамп :)


 
Тимохов Дима ©   (2016-02-29 17:03) [49]


> Понятно - статью ты не читал, там описано почему нужно делать
> дамп :)

Читал. Я все понял)) Правда.
Я ж тебе говорю - запускаешь программу под виртуалкой, она распаковывется, делаешь дамп при ЗАПУЩЕННОЙ программе. с уже правильными "секретным числом".
Потом из дампа сколько хочешь раз восстанавливай и работай - программа то уже запущена.


 
Rouse_ ©   (2016-02-29 17:27) [50]


> Тимохов Дима ©   (29.02.16 17:03) [49]
> Читал. Я все понял)) Правда.
> Я ж тебе говорю - запускаешь программу под виртуалкой, она
> распаковывется, делаешь дамп при ЗАПУЩЕННОЙ программе. с
> уже правильными "секретным числом".
> Потом из дампа сколько хочешь раз восстанавливай и работай
> - программа то уже запущена.

Значит читал но не понял - там в BIN лежит экзешник - сдампь и запусти :)


 
Rouse_ ©   (2016-02-29 17:31) [51]

Можешь просто последнюю гифку посмотреть в статье - там показанно что будет и как работает "секретное число" :) (Напомню - при старте оно должно быть равно нулю, иначе никакого фокуса не получится :)


 
virex(home) ©   (2016-03-01 07:59) [52]

// сам колбэк
VOID NTAPI tls_callback(HMODULE hModule,
DWORD  ul_reason_for_call,LPVOID lpReserved)
{
MessageBox(0, L"TLS Callback Message", L"", 0);
}
на скрине MyTLS Callback Message


 
virex(home) ©   (2016-03-01 08:14) [53]

Writeln("Какая-то бяда в GetSectionDataList.");

з.ы. "мясной рулет с черносливом" атмосферней будет


 
Rouse_ ©   (2016-03-01 18:34) [54]


> virex(home) ©

Угу, код поправлял - картинка старая осталась. А с исключениями - ну ща ченить нормальное напишу, они там вообще по факту не сильно и нужны.


 
Rouse_ ©   (2016-03-01 19:18) [55]

Ну вроде все - всем спасибо, резная версия тут (правленные исходники там-же)

http://alexander-bagel.blogspot.ru/2016/03/early-execution.html


 
Rouse_ ©   (2016-03-01 19:30) [56]

Блин, ребята с http://delphifeeds.ru/ меня убьют :)))
Забыл CAT поставить и к ним в новостную ленту статья целиком залилась, вместо шапки - бггг, ппц :)
Тот еще натюрморт :)))


 
Rouse_ ©   (2016-03-01 19:33) [57]

А, не - все поправили, оперативно работают - респект :)


 
Тимохов Дима ©   (2016-03-02 10:59) [58]


> Rouse_ ©   (29.02.16 17:31) [51]
> Можешь просто последнюю гифку посмотреть в статье - там
> показанно что будет и как работает "секретное число" :)
> (Напомню - при старте оно должно быть равно нулю, иначе
> никакого фокуса не получится :)


Невнимательное чтение чужого кода-текста - болезнь многих программистов (личное наблюдение).

Еще раз.

Чего ты добиваешься?

Ты хочешь, чтобы реверсер сказал неприличное слово(а) и убился об стену в следующем сценарии:
1. Реверсер запустил твою программу. Допустим, это офигеть как сложно - три дня сидел, не ел, не пил. Но получил в памяти чистый код!
2. Программа при старте заменила 0 на правильное число, без которого работать не может. Число лежит в глоб. переменной.
3. Реверсер снял дамп памяти (с правильным для работы числом - в той самой глоб. переменной).
4. Реверсер запустил дамп. В глоб. переменной лежит правильное для работы число, но не 0. Поэтому после запуска в глоб. перменной не окажется правильного для работы числа (см. п. 2).
5. В итоге программа не работает.
6. Реверсер матерясь убивает себя об стену.

Но реверес мог читать твою статью и не делать шаг 3.
Вместо него - сделать snapshot виртуальной машины - с запущенной и работоспобной твоей программой.
После чего он может восстанавливать ситуацию из snapshot"а сколько угодно раз - пока не вырежет твой стартовый TLS-callback.

Ну как-то так)))

И где я не прав?


 
Тимохов Дима ©   (2016-03-02 10:59) [59]


> Rouse_ ©   (29.02.16 17:31) [51]
> Можешь просто последнюю гифку посмотреть в статье - там
> показанно что будет и как работает "секретное число" :)
> (Напомню - при старте оно должно быть равно нулю, иначе
> никакого фокуса не получится :)


Невнимательное чтение чужого кода-текста - болезнь многих программистов (личное наблюдение).

Еще раз.

Чего ты добиваешься?

Ты хочешь, чтобы реверсер сказал неприличное слово(а) и убился об стену в следующем сценарии:
1. Реверсер запустил твою программу. Допустим, это офигеть как сложно - три дня сидел, не ел, не пил. Но получил в памяти чистый код!
2. Программа при старте заменила 0 на правильное число, без которого работать не может. Число лежит в глоб. переменной.
3. Реверсер снял дамп памяти (с правильным для работы числом - в той самой глоб. переменной).
4. Реверсер запустил дамп. В глоб. переменной лежит правильное для работы число, но не 0. Поэтому после запуска в глоб. перменной не окажется правильного для работы числа (см. п. 2).
5. В итоге программа не работает.
6. Реверсер матерясь убивает себя об стену.

Но реверес мог читать твою статью и не делать шаг 3.
Вместо него - сделать snapshot виртуальной машины - с запущенной и работоспобной твоей программой.
После чего он может восстанавливать ситуацию из snapshot"а сколько угодно раз - пока не вырежет твой стартовый TLS-callback.

Ну как-то так)))

И где я не прав?


 
han_malign ©   (2016-03-02 11:54) [60]


> Невнимательное чтение чужого кода-текста - болезнь многих программистов (личное наблюдение).

- поиск в ознакомительной статье законченного полнофункционального ноу-хау - болезнь ...


 
Тимохов Дима ©   (2016-03-02 12:42) [61]


> han_malign ©   (02.03.16 11:54) [60]
>
> > Невнимательное чтение чужого кода-текста - болезнь многих
> программистов (личное наблюдение).
>
> - поиск в ознакомительной статье законченного полнофункционального
> ноу-хау - болезнь ...


Не, ты не прав.
Нет поиска ноу-хау.
Есть попытка разобраться в философии защиты.
Я в свое время у Саши многому научился. Чему и благодарен безмерно. Будь я реверсером, я бы люто ненавидел этого Розыча!
Любая защита строится на соотношении времени на взлом и ценности.
Вот и интересно, насколько указанный прием увеличивает знаменатель указанного отношения.

Собсно сложность взлома - отделить защитный код, от полезного.
Если пораскинуть мозгами, то можно, видимо, в этот коллбек засунуть код, который и секрет инициализирует и делает реально что-то полезное, без чего программа работать не будет. Т.е. нельзя будет просто пропустить этот TLS-callback. Видимо, на это расчет идет.


 
Тимохов Дима ©   (2016-03-02 12:42) [62]


> han_malign ©   (02.03.16 11:54) [60]
>
> > Невнимательное чтение чужого кода-текста - болезнь многих
> программистов (личное наблюдение).
>
> - поиск в ознакомительной статье законченного полнофункционального
> ноу-хау - болезнь ...


Не, ты не прав.
Нет поиска ноу-хау.
Есть попытка разобраться в философии защиты.
Я в свое время у Саши многому научился. Чему и благодарен безмерно. Будь я реверсером, я бы люто ненавидел этого Розыча!
Любая защита строится на соотношении времени на взлом и ценности.
Вот и интересно, насколько указанный прием увеличивает знаменатель указанного отношения.

Собсно сложность взлома - отделить защитный код, от полезного.
Если пораскинуть мозгами, то можно, видимо, в этот коллбек засунуть код, который и секрет инициализирует и делает реально что-то полезное, без чего программа работать не будет. Т.е. нельзя будет просто пропустить этот TLS-callback. Видимо, на это расчет идет.


 
Rouse_ ©   (2016-03-02 13:24) [63]


> Ну как-то так)))
>
> И где я не прав?

В том что в боевом коде естественно должно быть по другому, я же просто идею показал, а на практике все делается в разы сложнее :)


 
KSergey ©   (2016-03-04 10:43) [64]

Скажите, я верно понял, что всё написанное можно применить на практике лишь для защиты ПО?
Или есть другие полезные применения?


 
Rouse_ ©   (2016-03-04 11:18) [65]

Ну по мимо того что в TLS Callback-е ты можешь отслеживать старт новых потоков + подгрузку библиотек (через CreateRemoteThread или хуком - там тоже отдельная нить стартует зачем-то) других применений в принципе нет.


 
Тимохов Дима ©   (2016-03-09 09:54) [66]


> Rouse_ ©   (02.03.16 13:24) [63]
>
> > Ну как-то так)))
> >
> > И где я не прав?
>
> В том что в боевом коде естественно должно быть по другому,
>  я же просто идею показал, а на практике все делается в
> разы сложнее :)


Спасибо, Саша! Полезная, безусловно, статья!

Имхо, самое полезная идея - подход с "правильным" числом.
А как это будет сделано (через TLS-колбек или через либу) - не важно. Опять же имхо.
В любом случае сложность взлома будет обусловлена разбором кода, выполняющегося при старте - а тут все средства хороши для защиты: и виртуализация кода, и прочее запутывание кода.


 
Тимохов Дима ©   (2016-03-09 09:54) [67]


> Rouse_ ©   (02.03.16 13:24) [63]
>
> > Ну как-то так)))
> >
> > И где я не прав?
>
> В том что в боевом коде естественно должно быть по другому,
>  я же просто идею показал, а на практике все делается в
> разы сложнее :)


Спасибо, Саша! Полезная, безусловно, статья!

Имхо, самое полезная идея - подход с "правильным" числом.
А как это будет сделано (через TLS-колбек или через либу) - не важно. Опять же имхо.
В любом случае сложность взлома будет обусловлена разбором кода, выполняющегося при старте - а тут все средства хороши для защиты: и виртуализация кода, и прочее запутывание кода.



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

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

Наверх




Память: 0.62 MB
Время: 0.144 c
15-1454450816
Konstantin-78
2016-02-03 01:06
2017.01.15
“Delphi-ий” вирус – TrojWare.Win32Downloader.Bandload.arh


2-1424681725
Эрнест
2015-02-23 11:55
2017.01.15
URLEncodeReservedChars


1-1343044311
Nilman
2012-07-23 15:51
2017.01.15
Сжатие данных в китайской Win7


2-1427929641
Drowsy
2015-04-02 02:07
2017.01.15
Как определить, установлены ли обновления RTL2, RTL3 на Дельфи 6?


15-1449783004
Юрий
2015-12-11 00:30
2017.01.15
С днем рождения ! 11 декабря 2015 пятница