Прекрасная идея портируемости приложений, кроссплатформенности родила языки, использующие виртуальные машины, компилирующие промежуточный платформенно-независимый код (байт-код) в платформенно-специфичный код. Яркие примеры таких языков - Java, C#, VB, ActionScript etc. История, которую я хочу рассказать, будет именно о последнем, но общие моменты касаются всех языков, компилирующихся в промежуточный код.
Учеба - такое дело.... Экзамены - не самая любимая часть учебы :) И преподаватель решил устроить тесты. А тесты были хитрые. У него была оболочка на Adobe AIR, а вопросы к тестам брались из шифрованного xml файла ( более 600 вопросов). Для сдачи экзамена выбиралось 30 вопросов, менялись местами варианты ответов, чтобы студенты не могли механически вычислить, где какой правильный ответ. Надо было что-то делать. Удалось раздобыть оболочку. Что ж, здорово. Оказалось, что эйр - это обычный zip-архив. Распаковав его, обнаружилась file.swf, который вызвал дикое желание декомпильнуть его :) Гуглим Выбираем декомпилятор, открываем файл и ... как разработчика меня огорчило увиденное. Как злостного сообщника студентов-лодырей - порадовало. Чистый, ничем не тронутый ActionScript. Логика выбора вопросов из файла, перемешивания вариантов ответов, криптование и декриптование файла вопросов, подсчет реузльтатов... Даже контрольный пример для криптора имелся в коде, что позволило написать тест для декриптора (декриптор на С#):
[Fact]
public static void DectriptString_Test(){
var k1 = "x73bvs";
var k2 = "ma";
var k3 = "qrx9v";
var loc1 = new XorDecriptor(
k1 + k1.Length.ToString() + "XQAWDbsd7%#jsd"
+ k2 + k2.Length.ToString() + "gyVsd34R$sd"
+ k3 + k3.Length.ToString() + "jhJLwNe@$gaSd"
+ (k1.Length * k2.Length + k3.Length + 23).ToString()
);
var loc2 = "4X%5D%06%19%1D%161%22arg%03S%07VUJ%1EE@%0C%0D%12%08%1Fv4%16VU%12PS%26%03%1B%0CX%1F%14%04";
loc2 = loc1.xor_unescape(loc2);
Assert.Equal("London is %#a capit6$al of Grea@t Britai!n", loc2);
}
Обратите внимание, все строки, использующиеся при инициализации декриптора, хранились в коде в открытом виде. Для дешифровки файла с вопросами к тесту используется пароль из трех частей (k1, k2, k3). Правильность пароля проверяется приведенным выше тестом.
Вот такие пироги. Чем мог помочь обфускатор? Обфускация - процесс затруднения анализа исходного кода. Среди методик обфускации есть сокрытие строк, переименование методов, классов и тд - применил бы разработчик хоть что-то из этого и хоть как-то да усложнил и запутал злостных взломщиков. При правильном подходе можно было вобще сделать код нечитабельным. Нужно хоть как-то защищать свой труд.
Как-то при просмотре .net сборки в декомпиляторе попался не менее замечательный кусок кода:
static private string BuildConnectionString(string path)
{
return ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + ";User Id=Admin;Jet OLEDB:Database Password=securepasswrd1023!");
}
Не знаю, насколько трудно написать хотя бы так:
static private string BuildConnectionString(string path)
{
return ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + ";User Id="+Encoding.Default.GetString( Convert.FromBase64String("QWRtaW4=") )+";Jet OLEDB:Database Password="+Encoding.Default.GetString( Convert.FromBase64String("c2VjdXJlcGFzc3dyZDEwMjMh")
));
}
А еще можно строки, предварительно отконвертированные в Base64, в ресурсы запрятать. А еще... Вариантов много, главное, не хранить в открытом виде такую информацию. Но, к сожалению, и такое встречается.
Полезные ссылки:
Способы защиты Flash-приложений
Статья на хабре про обфускаторы для .net
Прелести байткода или зачем нужен обфускатор
Подписаться на:
Комментарии к сообщению (Atom)
Ярлыки
.net
(17)
.net framework
(4)
256
(1)
армагедон
(1)
Библиотека
(12)
видео
(1)
вконтакте
(1)
декомпилятор
(1)
задачки
(5)
итоги
(1)
кодировка
(1)
космос
(1)
маркет
(1)
монетизация
(2)
мысли в слух
(10)
обфускация
(1)
Оптимизация сайта
(1)
отдых
(3)
Ошибка 720
(1)
переводы
(5)
подкасты для разработчика
(3)
прибыль
(1)
приложение
(2)
Разное
(28)
разработка ПО
(31)
рефакторинг
(5)
скачивания
(1)
ссылки
(2)
статистика
(1)
юмор
(31)
Access
(1)
admin2012.ru
(1)
admob
(1)
AMD
(1)
android
(6)
android conventions
(1)
android studio
(1)
angular.js
(1)
ant
(1)
antipattern
(1)
atdd
(2)
autocomplete
(1)
backbone.js
(1)
background repeat
(1)
batch file
(1)
batman.js
(1)
bdd
(3)
bootstrap
(1)
bug
(1)
build
(1)
C#
(31)
clojurescript
(1)
codeigniter
(1)
coding style
(1)
coffeescript
(3)
components
(1)
css
(1)
Custom splash screen
(1)
DDD
(1)
DI
(1)
eclipse
(1)
facebook
(1)
gradle
(1)
hot keys
(1)
html
(4)
ide
(1)
IE
(4)
IE8
(2)
IoC
(6)
ion auth
(1)
jasmine
(1)
java
(3)
javas
(1)
javascript
(9)
jquery
(4)
jquery ui
(1)
justify
(1)
knockout.js
(2)
linq
(3)
localDB
(1)
massive
(1)
micro orm
(1)
mocha
(1)
mock
(1)
mono
(1)
monodroid
(1)
moq
(2)
mpress
(1)
ms sql ce
(8)
msswit2013
(2)
mvc framework
(1)
mysql
(2)
NetBeans
(1)
nodejs
(1)
nosql
(1)
npm
(1)
object db
(1)
opera apps
(1)
ORM
(2)
phonegap
(1)
php
(12)
phpunit
(3)
play market
(2)
qunit
(1)
RegExpr
(2)
require.js
(1)
samsung apps
(2)
screenshoot
(1)
sdk
(1)
Shortcut
(1)
Silverlight
(4)
singleton
(1)
slide me
(1)
soap
(2)
social network
(1)
spellcheck
(1)
SpicIE
(1)
sql
(3)
sqlite
(4)
style
(1)
SublimeText 2
(5)
Super Mario
(1)
svn
(1)
tdd
(14)
tddigest
(5)
testing
(7)
text align
(1)
Tools
(18)
torrents.ru
(1)
tortoisesvn
(1)
twitter
(1)
uml
(1)
unit testing
(5)
unity
(3)
usability
(2)
virus
(1)
visual studio
(7)
web services
(2)
Windows 7
(1)
xunit
(3)
ZenCoding
(2)
Копирайты
Авторские права на публикуемые материалы (кроме тех материалов, где явно указан источник) принадлежат автору блога (мне) и могут быть использованы где-либо еще только с моего согласия.
Блог о жизни вне кода
Постоянные читатели
Популярно
-
Понравился анекдот о колбасе и яйцах :) Жена посылает мужа-программиста в магазин: - Дорогой, купи, пожалуйста, палку колбасы, и если б...
-
Продолжаю серию постов о своём первом андроид-приложении. Сегодня мысли о публикации приложения в разных маркетах.
-
Бета-версия одиннадцатой cтудии вызвала много охов и ахов. Чтобы там ни говорили, работать в ней приятно, хоть по началу немного необычно. ...
-
Jquery.Inputmask - крутой (да-да, именно) плагин, добавляющий гибкости в работу с обычным текстовым полем для ввода. Плагин является ус...
-
Перевод поста "Top 10 Things That Annoy Programmers" Кевина Панга. Оригинал тут
-
Фридман А.Л. - Основы объектно-ориентированной разработки программных систем. ( скачать ) Книга написана как учебное пособие для студентов ...
-
Steve Freeman, Nat Pryce. Growing Object-Oriented Software, Guided by Tests ( скачать ) Test-Driven Development (TDD) is now an established...
-
Для некоторых методов класса Microsoft Code Analysis даёт такой совет: CA1822 : Microsoft.Performance : The 'this' parameter (or ...
-
Разделяй и влавствуй - подход на все времена. Концепция модульного программирования не нова, и хорошо себя зарекомендовала. В мире разрабо...
0 коммент.:
Отправить комментарий