Страница: 1 | 2 | 3 |
Вопрос: Декомпиляция VB приложения
Добавлено: 15.09.05 18:12
Автор вопроса: «UL.eXe» | ICQ: 197.895.916.247
Товарищи,
подскажите пожалуйста, возможно-ли
скомпилированный EXE файл декомпилировать обратно в код?
Да, вопрос бредовый, но так интерестно стало, возможно ??
Ответы
Всего ответов: 42
Номер ответа: 1
Автор ответа:
Страшный Сон
Вопросов: 46
Ответов: 848
Профиль | | #1
Добавлено: 15.09.05 18:44
Теоретически это возможно, но при компиляции много инфы теряется. Я полагаю, после декомпиляции получится примерно следющее (кусок моей программы):
Было:
Private Sub OBDispRect(ByVal X1&, ByVal Y1&, ByVal X2&, ByVal Y2&, ByVal Col As Byte)
Dim I&, D&, AX&, AY&
If Y1 >= 584 And Y2 >= 584 Then Exit Sub
If Y1 < 128 And Y2 < 128 Then Exit Sub
If X1 >= 800 And X2 >= 800 Then Exit Sub
If X1 < 0 And X2 < 0 Then Exit Sub
AX = Max(Y1, 128)
AY = Min(Y2, 583)
If X1 >= 0 And X1 < 800 Then
For I = AX To AY
pict(X1, I) = Col
Next I
End If
If X2 >= 0 And X2 < 800 Then
For I = AX To AY
pict(X2, I) = Col
Next I
End If
AX = Max(X1, 0)
AY = Min(X2, 799)
If Y1 >= 128 And Y1 < 584 Then FillMemory pict(AX, Y1), AY - AX, Col
If Y2 >= 128 And Y2 < 584 Then FillMemory pict(AX, Y2), AY - AX, Col
End Sub
Стало:
Private Sub S0008(ByVal A0000 As Long, ByVal A0001 As Long, ByVal A0002 As Long, ByVal A0003 As Long, ByVal A0004 As Byte)
Dim V0000 As Long, V0001 As Long, V0002 As Long, V0003 As Long
If A0001 >= 584 And A0003 >= 584 Then
Exit Sub
End If
If A0001 < 128 And A0003 < 128 Then
Exit Sub
End If
If A0000 >= 800 And A0002 >= 800 Then
Exit Sub
End If
If A0000 < 0 And A0002 < 0 Then
Exit Sub
End If
V0002 = F0058(A0001, 128)
V0003 = F0059(A0003, 583)
If A0000 >= 0 And A0000 < 800 Then
V0000 = V0002
L0000:
G0073(A0000, V0000) = A0004
V0000 = V0000 + 1
If V0000 <= V0003 Then GoTo L0000
End If
If A0002 >= 0 And A0002 < 800 Then
V0000 = V0002
L0000:
G0073(A0002, V0000) = A0004
V0000 = V0000 + 1
If V0000 <= V0003 Then GoTo L0000
End If
V0002 = F0058(A0000, 0)
V0003 = F0059(A0002, 799)
If A0001 >= 128 And A0001 < 584 Then RtlFillMemory G0073(V0002, A0001), A0003 - V0002, A0003
If A0003 >= 128 And A0003 < 584 Then RtlFillMemory G0073(V0002, A0003), A0003 - V0002, A0003
End Sub
Теперь скажи, где понятнее.
Номер ответа: 2
Автор ответа:
Страшный Сон
Вопросов: 46
Ответов: 848
Профиль | | #2
Добавлено: 15.09.05 18:48
Ну, и традиционная работа над ошибками:
If A0002 >= 0 And A0002 < 800 Then
V0000 = V0002
L0001:
G0073(A0002, V0000) = A0004
V0000 = V0000 + 1
If V0000 <= V0003 Then GoTo L0001
End If
Номер ответа: 3
Автор ответа:
Morpheus
Вопросов: 224
Ответов: 3777
Web-сайт:
Профиль | | #3
Добавлено: 15.09.05 18:53
2 Страшный Сон:
А чем декомпилил? не прогой Sereg'i?
Номер ответа: 4
Автор ответа:
«UL.eXe»
ICQ: 197.895.916.247
Вопросов: 72
Ответов: 540
Профиль | | #4
Добавлено: 15.09.05 21:57
В проэкте все название всех обьектов сохраняются 8)
Незнаю чем ты так декомпилировал, да не спорю - меняется, но не так-же убого!!
А реально декомпилировать как-нить можна?
Номер ответа: 5
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #5
Добавлено: 15.09.05 22:17
незнаю чем декомпилил Страшный Сон, но как мне известно полностью востановить исходный Вб код практически невозможно... Разве что дезассемблировать, и если знаешь асм, то по дезассемблированному коду самому ручками перенабрать ВБ код, но там стоко мусора... это такой гемор!!! Ты "хело вёрд" не перенаберёшь - 100% Ты просто потеряешся в том мусоре, и хело вёрд там просто ненайдёшь Я может хело вёрд и восоздам, но не больше
Номер ответа: 6
Автор ответа:
«UL.eXe»
ICQ: 197.895.916.247
Вопросов: 72
Ответов: 540
Профиль | | #6
Добавлено: 15.09.05 22:21
Да-а... Тогда это очень фигово, мля...
А может всеже кто еще что слыхал ??
Номер ответа: 7
Автор ответа:
Страшный Сон
Вопросов: 46
Ответов: 848
Профиль | | #7
Добавлено: 16.09.05 02:26
Я и не декомпилил. Я же написал, что это мое предположение. Зачем компу хранить в екзешнике названия переменных и т. п., если они ему до лампочки?
Номер ответа: 8
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #8
Добавлено: 16.09.05 04:38
Учитывая что у компилятора A0001 >= 584 And A0003 >= 584 является выражением и A0001 >= 584 является выражением и даже A0001 мли 584 являются выражениями нетрудно прийти к выводу что написать декомпилятор вполне может небольшая группа высококлассных специалистов какой нибудь малобюджетной организации типа IBM или Microsoft.
Формула разбивается на более простые члены для возможности записи её на языке машины:
1. А=(A0001 >= 584)
2. Б=(A0003 >= 584)
3. В=(А AND Б)
4. Если В=Истина Тогда
Исходного кода можно и не получить вовсе, зато декомпилироваться будет сразу в оптимизированный код (конечно у оптимизирующего компилятора).
Номер ответа: 9
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #9
Добавлено: 16.09.05 05:30
Ты имеешь ввиду васмовую статью про сборку выражений в высокоуровневый код?
А декомпилировать VB можно, но только VB.NET Там задача декомпиляции даже не стоит, стоит задача защиты от этого
Номер ответа: 10
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #10
Добавлено: 16.09.05 06:14
Неа, впервые слышу. Кинь ссылку на неё - гляну что за зверь. То что я написал - типичный приём при компиляции. Формула бьётся по два члена, причём приоритеты заложены в самом конечном автомате. В конечном итоге условие IF работает с одним операндом - это логическая единица <выражение>, которая может состоять из каких либо операций.
То что внутри выражения, для этого условия не имеет значения. Код для выражения генерируется внутри него. А условие, в зависимости от логики, в качестве опранда <выражение> использует либо последний регистр/память приёмник либо специально отведённый для этого регистр/память.
Не знаю можно ли по машинному коду восстановить логику компилятора - я этим не пробовал заниматься, а предположить я уже предположил
Номер ответа: 11
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #11
Добавлено: 16.09.05 06:49
Если ты подразумеваешь On Error, то там по моему используется SEH, который можно перечислить по FS:0
Сегодня ради интереса наклепал код для LocASM по статье. Адресация через сегментные регистры у меня не поддерживается, так что прям в машинных кодах (по интеловским мануалам). Зато так нагляднее получилось.
CONST PREFIX_CS=&H2E
CONST PREFIX_SS=&H36
CONST PREFIX_DS=&H3E
CONST PREFIX_ES=&H26
CONST PREFIX_FS=&H64
CONST PREFIX_GS=&H65
CONST MOV_EAX_ptrSREG EQU &HA1
Const OFFS_0 equ 0,0,0,0
;MOV EAX,FS:[0]
Mov_EAX_PtrFS0 DB PREFIX_FS,MOV_EAX_ptrSREG,OFFS_0
NextElem:
;последний элемент
cmp dword ptr [eax],-1
je Yes
mov eax,dword ptr [eax]
jmp NextElem
;если пришли к последнему элементу
Yes:
mov eax,[eax+4]
end
Номер ответа: 12
Автор ответа:
gvozd
Разработчик Offline Client
Вопросов: 164
Ответов: 1317
Web-сайт:
Профиль | | #12
Добавлено: 16.09.05 09:03
www.vb-decompiler.com
Номер ответа: 13
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #13
Добавлено: 16.09.05 09:58
http://wasm.ru/article.php?article=1009001
Номер ответа: 14
Автор ответа:
Страшный Сон
Вопросов: 46
Ответов: 848
Профиль | | #14
Добавлено: 16.09.05 13:09
1. А=(A0001 >= 584)
2. Б=(A0003 >= 584)
3. В=(А AND Б)
4. Если В=Истина Тогда
Дык декомпилятор тем и занимается, что распознает группы команд и объединяет их в выражения.
И не "Если В=Истина Тогда", а просто "Если В Тогда".
Номер ответа: 15
Автор ответа:
«UL.eXe»
ICQ: 197.895.916.247
Вопросов: 72
Ответов: 540
Профиль | | #15
Добавлено: 16.09.05 13:26
2gvozd:
Вопрос:
Ответ:
Все понятно... Тема закрыта.