Сейчас на форуме: ManHunter, Magister Yoda, rtsgreg1989 (+10 невидимых)

 eXeL@B —› Основной форум —› Распаковка Reflector v4.1.58
Посл.ответ Сообщение


Ранг: 218.9 (наставник), 42thx
Активность: 0.160
Статус: Участник
dotnet

Создано: 10 июня 2005 18:25
· Личное сообщение · #1

Для распаковки рефлектора нужно, что бы он был загружен вместе с вашей прогой.

Для этого нужно добавить его в Referense проги. Как известно студия не позволяет exe добавлять в референс поэтому правте файл проекта вручную. Хотя если ваш проект не плагин к рефлектору тогда его можно просто переименовать в DLL

Собственно распаковку запротекченного модуля выполняет функция:

Sub ReflectorExtract()
'Цифра 1 здесь если запускаете функцию из плагина, но она должна быть другой из нормальной проги. В отладке посмотрите...

Dim RefAsm As Reflection.Assembly = AppDomain.CurrentDomain.GetAssemblies()(1)

Dim stream1 As IO.Stream = RefAsm.GetManifestResourceStream("Reflector.resources")
Dim num1 As Integer = stream1.Length
Dim buffer1 As Byte() = New Byte(num1 - 1) {}
stream1.Read(buffer1, 0, num1)
Dim num2 As Int32 = 137
Dim num3 As Int32 = 22
Dim num4 As Integer

For num4 = 0 To num1 - 1
buffer1(num4) = buffer1(num4) Xor num2
num2 = BitConverter.GetBytes(num2 + num3)(0)
Next num4

Dim t1 As System.Type = RefAsm.GetType("_3")

Dim _1 As Object = System.Activator.CreateInstance(t1, New Object() {New IO.MemoryStream(buffer1)})
_1.MoveNext()

Dim flags As Reflection.BindingFlags = Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance
Dim Dump() As Byte = _1.Current.GetType.GetFields(flags)(1).GetValue(_1.Current)

Dim FS As New IO.FileStream("Reflector.Application.dll", IO.FileMode.OpenOrCreate)
FS.Write(Dump, 0, Dump.Length - 1)
FS.Close()
End Sub

Защита рефлектора постронна так, что все функции из него вызываются через интерфейсы (через жопу короче) , а интерфейсы клеются к обьектам запротекченного модуля.

Почему я его стал ломать? Потому я пишу плагин и этот козел на своем форуме не удасужился в течении недели ответить мне на мой вопрос где я его спрашивал, как обойти его же косяк в рефлекторе. После распаковки вопросы отпали сами по себе



2086_Reflector.Application.JPG

-----
have a nice day





Ранг: 218.9 (наставник), 42thx
Активность: 0.160
Статус: Участник
dotnet

Создано: 10 июня 2005 18:30
· Личное сообщение · #2

После энкрипта идет распаковка ее делает функция _1.MoveNext(), чтоб не заморачиваться я вызываю эту функцию из него

6132_MoveNext.txt

-----
have a nice day





Ранг: 218.9 (наставник), 42thx
Активность: 0.160
Статус: Участник
dotnet

Создано: 10 июня 2005 18:43
· Личное сообщение · #3

В ресурсах рефлектора обнаруженна справка по IL командам может быть полезна...

f91d_Reflector.Disassembler.txt

-----
have a nice day





Ранг: 218.9 (наставник), 42thx
Активность: 0.160
Статус: Участник
dotnet

Создано: 10 июня 2005 18:47
· Личное сообщение · #4

Открою один секрет:

IL код поддерживает одинаковые имена методов, полей, переменных , этим свойством пользуются некоторые обфускаторы для усложнения анализа кода.

Однако ин должны различаться:

1. Возвращаемым типом (для переменных, полей или функций)
2. Количеством параметров (для функций и процедур)
3. Количество параметров может быть одинаковое но тогда должен отличаться тип хотябы одного из параметров (для функций и процедур)

Пример из рефлектора:

.method public hidebysig specialname instance string _1() cil managed { }
.method public hidebysig specialname instance unsigned int8[] _1() cil managed { }
.method public hidebysig specialname instance void _1(unsigned int8[]) cil managed { }
.method public hidebysig specialname instance void _1(string) cil managed { }
.field private string _1 { }
.field private unsigned int8[] _1 { }

-----
have a nice day



 eXeL@B —› Основной форум —› Распаковка Reflector v4.1.58
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати