Форум: "Прочее";
Текущий архив: 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.054 c