+113
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
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).
Чувствую, что говнорешение, но не могу придумать что-то более умное. Обфускаторы тоже не очень катят, ибо плохо дружат с моно.
Запостил: cfdev,
18 Мая 2010
bober_maniac 19.05.2010 00:27 # 0
cfdev 19.05.2010 02:38 # 0
В принципе по существу только первые два предложения описания, далее просто к сведению (о говноподвигах в области безопасности) (была бы возомжность постредактирования, вырезал бы :\)
Так вот, вопрос открыт пока: есть ли в дотнете какие-то иные способы защиты от вызова интернал- и прайвет-методов через рефлексию? (забудем, что можно в рефлекторе просто так посмотреть сам код). Логично предположить, что есть что-то связанное с аттрибутами (допустим), но при фул-трасте, похоже, рантайму на всё насрать.
pushkoff 19.05.2010 12:49 # 0
bober_maniac 19.05.2010 19:43 # 0
Говногость 19.05.2010 13:58 # 0
Lure Of Chaos 19.05.2010 15:54 # 0
pushkoff 20.05.2010 16:51 # 0
хотя при помощи рефлексии в питоне мы выгружаем описание данных, это немного удобнее чем описывать их в XML.
bober_maniac 19.05.2010 19:44 # 0
Единственный реальный способ - делать проверки у себя, что-то вроде того, что у вас, только более вменяемое.
cfdev 19.05.2010 02:48 # +2
Плюс собранный mkbundleом эксешник хотя и содержит внутри себя как контейнер реальные CIL-образы, валидным CIL-образом мейнстримным рефлектором не считается и не открывается, тут кулхацкеры тоже будут репы долго чесать.
А ежли кулхацкеры каким-то образом смогут извлечь оригинальный эксешник (может, mkbundle имеют такую опцию (как и upx) - не в курсе), то, не желая морочиться с реверсингом алгоритма, решат просто вызвать рефлексией GetKey и посмотреть результат - им это тоже не удастся. Вроде бы.
А некулхацкеры они любую "замкнутую систему" (т.е. без ключа на стороне) поломают, тут сопротивляться особо не стоит. Поэтому говнобезопасность - правильное решение.
guest 26.05.2015 14:10 # 0