-
Да нормально, как мне статью то править, если я все мнения со стороны не услышу? Не для себя ж пишу :)
-
Ну тогда извини, что техническую часть я даже не читал. :(
-
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)
-
> Тогда вместо, возможно ошибочного, > '(плюс 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;
А про указатели - для демо достаточно и такого, нельзя же все выкладывать на блюдечке с голубой каемкой, человек и сам должен немного мозг включить прежде чем использовать сторонний код. По остальному вечером попричесываю тем более тут один нюансик вскрылся, который придется подправить.
-
Ну вроде как причесал - если за вечер никто ничего не найдет, завтра тогда на паблик выложу
-
Прочитал. Идейно понятно.
Чисто философский вопрос.
Реверсер же сразу поймет при следующем запуске, что его пытаются обхитрить. Неужели он не найдет управу? Да хоть дампы в Parallels Desktop сделать с уже запущенной программой.
Суть вопроса стоит ли делать подобную защиту (у реверсера же наверняка рука набита на противодействии таким трюкам)?
-
> Тимохов Дима © (29.02.16 15:06) [45] > Реверсер же сразу поймет при следующем запуске, что его > пытаются обхитрить.
Конечно поймет.
> Неужели он не найдет управу? Да хоть дампы в Parallels Desktop > сделать с уже запущенной программой. > > Суть вопроса стоит ли делать подобную защиту (у реверсера > же наверняка рука набита на противодействии таким трюкам)? >
Если код защиты под виртуальной машиной - очень долго искать придется.
А так вообще - тут же только сам принцип, на практике антидамп в разы сложнее делается :)
-
> А так вообще - тут же только сам принцип, на практике антидамп > в разы сложнее делается :)
Не, ну все же чем Parallels тебе не нравится? Запустил, снял дамп, потом сколько хочешь восстанавливай. Ты же защищается от повторного запуска по снятому дампу. А тут и запуска не будет повторного.
Я не в части критики, просто интересно. Я то в свое время поставил на виртуальную машину (чужую), которую натравил на некую свою виртуальную машину. Расчет на то - задолбаются 100мб мусора фильтровать. Может, обновляться придется. Вот, думаю - надо ли мне это.
ЗЫ Саш, извиняй плз за оффтоп))
-
> Тимохов Дима © (29.02.16 16:29) [47] > Не, ну все же чем Parallels тебе не нравится? > Запустил, снял дамп, потом сколько хочешь восстанавливай.
Понятно - статью ты не читал, там описано почему нужно делать дамп :)
-
> Понятно - статью ты не читал, там описано почему нужно делать > дамп :)
Читал. Я все понял)) Правда. Я ж тебе говорю - запускаешь программу под виртуалкой, она распаковывется, делаешь дамп при ЗАПУЩЕННОЙ программе. с уже правильными "секретным числом". Потом из дампа сколько хочешь раз восстанавливай и работай - программа то уже запущена.
-
> Тимохов Дима © (29.02.16 17:03) [49] > Читал. Я все понял)) Правда. > Я ж тебе говорю - запускаешь программу под виртуалкой, она > распаковывется, делаешь дамп при ЗАПУЩЕННОЙ программе. с > уже правильными "секретным числом". > Потом из дампа сколько хочешь раз восстанавливай и работай > - программа то уже запущена.
Значит читал но не понял - там в BIN лежит экзешник - сдампь и запусти :)
-
Можешь просто последнюю гифку посмотреть в статье - там показанно что будет и как работает "секретное число" :) (Напомню - при старте оно должно быть равно нулю, иначе никакого фокуса не получится :)
-
// сам колбэк VOID NTAPI tls_callback(HMODULE hModule, DWORD ul_reason_for_call,LPVOID lpReserved) { MessageBox(0, L"TLS Callback Message", L"", 0); } на скрине MyTLS Callback Message
-
Writeln('Какая-то бяда в GetSectionDataList.');
з.ы. "мясной рулет с черносливом" атмосферней будет
-
> virex(home) ©
Угу, код поправлял - картинка старая осталась. А с исключениями - ну ща ченить нормальное напишу, они там вообще по факту не сильно и нужны.
-
-
Блин, ребята с http://delphifeeds.ru/ меня убьют :))) Забыл CAT поставить и к ним в новостную ленту статья целиком залилась, вместо шапки - бггг, ппц :) Тот еще натюрморт :)))
-
А, не - все поправили, оперативно работают - респект :)
-
> Rouse_ © (29.02.16 17:31) [51] > Можешь просто последнюю гифку посмотреть в статье - там > показанно что будет и как работает "секретное число" :) > (Напомню - при старте оно должно быть равно нулю, иначе > никакого фокуса не получится :)
Невнимательное чтение чужого кода-текста - болезнь многих программистов (личное наблюдение).
Еще раз.
Чего ты добиваешься?
Ты хочешь, чтобы реверсер сказал неприличное слово(а) и убился об стену в следующем сценарии: 1. Реверсер запустил твою программу. Допустим, это офигеть как сложно - три дня сидел, не ел, не пил. Но получил в памяти чистый код! 2. Программа при старте заменила 0 на правильное число, без которого работать не может. Число лежит в глоб. переменной. 3. Реверсер снял дамп памяти (с правильным для работы числом - в той самой глоб. переменной). 4. Реверсер запустил дамп. В глоб. переменной лежит правильное для работы число, но не 0. Поэтому после запуска в глоб. перменной не окажется правильного для работы числа (см. п. 2). 5. В итоге программа не работает. 6. Реверсер матерясь убивает себя об стену.
Но реверес мог читать твою статью и не делать шаг 3. Вместо него - сделать snapshot виртуальной машины - с запущенной и работоспобной твоей программой. После чего он может восстанавливать ситуацию из snapshot'а сколько угодно раз - пока не вырежет твой стартовый TLS-callback.
Ну как-то так)))
И где я не прав?
-
> Rouse_ © (29.02.16 17:31) [51] > Можешь просто последнюю гифку посмотреть в статье - там > показанно что будет и как работает "секретное число" :) > (Напомню - при старте оно должно быть равно нулю, иначе > никакого фокуса не получится :)
Невнимательное чтение чужого кода-текста - болезнь многих программистов (личное наблюдение).
Еще раз.
Чего ты добиваешься?
Ты хочешь, чтобы реверсер сказал неприличное слово(а) и убился об стену в следующем сценарии: 1. Реверсер запустил твою программу. Допустим, это офигеть как сложно - три дня сидел, не ел, не пил. Но получил в памяти чистый код! 2. Программа при старте заменила 0 на правильное число, без которого работать не может. Число лежит в глоб. переменной. 3. Реверсер снял дамп памяти (с правильным для работы числом - в той самой глоб. переменной). 4. Реверсер запустил дамп. В глоб. переменной лежит правильное для работы число, но не 0. Поэтому после запуска в глоб. перменной не окажется правильного для работы числа (см. п. 2). 5. В итоге программа не работает. 6. Реверсер матерясь убивает себя об стену.
Но реверес мог читать твою статью и не делать шаг 3. Вместо него - сделать snapshot виртуальной машины - с запущенной и работоспобной твоей программой. После чего он может восстанавливать ситуацию из snapshot'а сколько угодно раз - пока не вырежет твой стартовый TLS-callback.
Ну как-то так)))
И где я не прав?
|