Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
private static void assertNoReflection()
{
foreach (StackFrame stackFrame in new StackTrace().GetFrames())
{
if (stackFrame.GetMethod().DeclaringType.Namespace == "System.Reflection")
{
throw new MethodAccessException();
}
}
}
internal static string GetKey()
{
assertNoReflection();
// ...
}
Вот так вот приходится говнить, потому что в дотнете рефлексией можно спокойно вызывать internal- и private- методы.
assertNoReflection(); проверяет, что вверх по стеку вызовов никто не балуется рефлексией.
После assertNoReflection(); из нативной длл получаем обфусцированную (вручную, лол) строку, которая далее с помощью запутанных алгоритмов (некоторые параметры для "расшифровки" опять берутся из нативной длл) приводит её в вид пароля (для доступа к запароленному архиву).
Софт не прямо уж суперсекретный, просто нужно скрыть ресурсы хотя бы для приличия. Пароль через подключение к серверу не катит.
Ко всему этому оно собрано в одно exe моновским mkbundle'ом (рефлектор не может открыть!) и поверх upx'ом. В общем, большое количество кулхацкеров отсекается (должны знать ассемблер и MSIL).
Чувствую, что говнорешение, но не могу придумать что-то более умное. Обфускаторы тоже не очень катят, ибо плохо дружат с моно.
Сделано для галочки же: "софт не прямо уж суперсекретный, просто нужно скрыть ресурсы хотя бы для приличия".
В принципе по существу только первые два предложения описания, далее просто к сведению (о говноподвигах в области безопасности) (была бы возомжность постредактирования, вырезал бы :\)
Так вот, вопрос открыт пока: есть ли в дотнете какие-то иные способы защиты от вызова интернал- и прайвет-методов через рефлексию? (забудем, что можно в рефлекторе просто так посмотреть сам код). Логично предположить, что есть что-то связанное с аттрибутами (допустим), но при фул-трасте, похоже, рантайму на всё насрать.
мне для собственного развития... а то по всему инету распиарена рефлексия в С#, а я ума не приложу где ее можно применить в реальных проектах...
хотя при помощи рефлексии в питоне мы выгружаем описание данных, это немного удобнее чем описывать их в XML.
А вообще тут как бы логика в том, что средний обыватель вообще об этом ничего не знает, а кулхацкер в x86 скорей всего мало шарит в MSIL и наоборот (часть дешифровки происходит в нативе, а часть - в маенеджед + ресурсы добываются так же), ибо малопересекающиеся миры на самом деле (те, кто пишет пинвоки, в основном только спеки умеют читать).
Плюс собранный mkbundleом эксешник хотя и содержит внутри себя как контейнер реальные CIL-образы, валидным CIL-образом мейнстримным рефлектором не считается и не открывается, тут кулхацкеры тоже будут репы долго чесать.
А ежли кулхацкеры каким-то образом смогут извлечь оригинальный эксешник (может, mkbundle имеют такую опцию (как и upx) - не в курсе), то, не желая морочиться с реверсингом алгоритма, решат просто вызвать рефлексией GetKey и посмотреть результат - им это тоже не удастся. Вроде бы.
А некулхацкеры они любую "замкнутую систему" (т.е. без ключа на стороне) поломают, тут сопротивляться особо не стоит. Поэтому говнобезопасность - правильное решение.
В принципе по существу только первые два предложения описания, далее просто к сведению (о говноподвигах в области безопасности) (была бы возомжность постредактирования, вырезал бы :\)
Так вот, вопрос открыт пока: есть ли в дотнете какие-то иные способы защиты от вызова интернал- и прайвет-методов через рефлексию? (забудем, что можно в рефлекторе просто так посмотреть сам код). Логично предположить, что есть что-то связанное с аттрибутами (допустим), но при фул-трасте, похоже, рантайму на всё насрать.
хотя при помощи рефлексии в питоне мы выгружаем описание данных, это немного удобнее чем описывать их в XML.
Единственный реальный способ - делать проверки у себя, что-то вроде того, что у вас, только более вменяемое.
Плюс собранный mkbundleом эксешник хотя и содержит внутри себя как контейнер реальные CIL-образы, валидным CIL-образом мейнстримным рефлектором не считается и не открывается, тут кулхацкеры тоже будут репы долго чесать.
А ежли кулхацкеры каким-то образом смогут извлечь оригинальный эксешник (может, mkbundle имеют такую опцию (как и upx) - не в курсе), то, не желая морочиться с реверсингом алгоритма, решат просто вызвать рефлексией GetKey и посмотреть результат - им это тоже не удастся. Вроде бы.
А некулхацкеры они любую "замкнутую систему" (т.е. без ключа на стороне) поломают, тут сопротивляться особо не стоит. Поэтому говнобезопасность - правильное решение.