Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 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-сайт: xury.zx6.ru
 Профиль | | #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-сайт: basicproduction.nm.ru
 Профиль | | #8
Добавлено: 16.09.05 04:38
If A0001 >= 584 And A0003 >= 584 Then

 Учитывая что у компилятора 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-сайт: sharpc.livejournal.com
 Профиль | | #9
Добавлено: 16.09.05 05:30
Ты имеешь ввиду васмовую статью про сборку выражений в высокоуровневый код?
А декомпилировать VB можно, но только VB.NET :) Там задача декомпиляции даже не стоит, стоит задача защиты от этого :)

Ответить

Номер ответа: 10
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #10
Добавлено: 16.09.05 06:14
Неа, впервые слышу. Кинь ссылку на неё - гляну что за зверь. То что я написал - типичный приём при компиляции. Формула бьётся по два члена, причём приоритеты заложены в самом конечном автомате. В конечном итоге условие IF работает с одним операндом - это логическая единица <выражение>, которая может состоять из каких либо операций.
If <выражение> Then

То что внутри выражения, для этого условия не имеет значения. Код для выражения генерируется внутри него. А условие, в зависимости от логики, в качестве опранда <выражение> использует либо последний регистр/память приёмник либо специально отведённый для этого регистр/память.

Не знаю можно ли по машинному коду восстановить логику компилятора - я этим не пробовал заниматься, а предположить я уже предположил :)

Ответить

Номер ответа: 11
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #11
Добавлено: 16.09.05 06:49
Ну, и традиционная работа над ошибками

 Если ты подразумеваешь On Error, то там по моему используется SEH, который можно перечислить по FS:0

 Сегодня ради интереса наклепал код для LocASM по статье. Адресация через сегментные регистры у меня не поддерживается, так что прям в машинных кодах (по интеловским мануалам). Зато так нагляднее получилось.
;A1 MOV EAX,moffs32* Move doubleword at (seg:offset) to EAX.

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-сайт: www.gvozdsoft.com
 Профиль | | #12
Добавлено: 16.09.05 09:03
www.vb-decompiler.com

Ответить

Номер ответа: 13
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #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:
www.vb-decompiler.com

Вопрос:
I need to find a vb decompiler that will let me get the .bas along with the rest files in my game

Ответ:
What you are asking is illegal, and VBReformer author uses this forum aswell.


Все понятно... Тема закрыта.

Ответить

Страница: 1 | 2 | 3 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам