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

Вниз

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

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

Наверх





Память: 0.61 MB
Время: 0.064 c
15-1455465762
pavelnk
2016-02-14 19:02
2017.01.15
С праздником!


15-1455467104
Bjdob
2016-02-14 19:25
2017.01.15
Исторические справочники


15-1457194325
MsGuns
2016-03-05 19:12
2017.01.15
Нужна ли видеокарта ?


2-1426163311
Aleshka
2015-03-12 15:28
2017.01.15
Из реестра в TDateTime


2-1420137726
Боб
2015-01-01 21:42
2017.01.15
Загрузка аудиозаписей в VK





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