Decompiler-VB.Net
KR
로그인
VBReFormer Gen2 처음부터 다시 작성한 엔진, 완전한 P-code 지원, 그리고 공개 베타 중인 온라인 스튜디오. 발표 내용 읽기 →
문서
VBReFormer Desktop

VBReFormer Desktop 매뉴얼

VBReFormer Desktop 사용자 매뉴얼: 설치, 라이선스 활성화, 7가지 뷰 읽기, 바이너리 분석, IDE에서 다시 열 수 있는 VB6 프로젝트 내보내기.

2026. 9. 20. 업데이트14개 장

Windows 컴퓨터에 설치하는 애플리케이션입니다. Visual Basic 5 및 6 실행 파일을 열고, 그 소스 코드를 재구성하여, VB6 IDE에서 다시 열 수 있는 프로젝트를 돌려줍니다. 바이트, 리소스, 디자이너, 그래프, 상호 참조, 바이너리 패치까지 완전한 작업대를 갖추고 있습니다.

번역에 관한 안내. 데스크톱 애플리케이션의 인터페이스는 영어, 프랑스어, 스페인어로 제공되며, 한국어로는 제공되지 않습니다. 이 매뉴얼에서는 메뉴와 뷰의 이름을 애플리케이션에 표시되는 영어 그대로 인용하고, 처음 나올 때 괄호 안에 한국어 번역을 덧붙입니다.

1. 설치

VBReFormer Desktop은 인터페이스 언어별로 하나씩 MSI 설치 관리자로 배포됩니다. 패키지는 자체 포함형입니다. 필요한 것을 모두 내장하고 있으므로 미리 설치해야 할 프레임워크가 없습니다.

요구 사항
시스템 Windows 10 버전 1607 이상 또는 Windows 11
아키텍처 x64
프레임워크 없음 — 패키지는 자체 포함형입니다
연결 디컴파일과 라이선스 검증에 필요합니다
인터페이스 언어 영어, 프랑스어, 스페인어

Windows XP, Vista, 7, 8은 지원되지 않습니다. 애플리케이션은 최소 Windows 10을 필요로 하는 플랫폼에 의존합니다. 사용 중인 컴퓨터가 그보다 오래된 경우 VBReFormer Online이 어떤 브라우저, 어떤 시스템에서든 작동합니다. 그 경우에는 이쪽이 권장되는 방법입니다.

엔진이 작동하는 곳

애플리케이션은 로컬에서 실행되지만, 코드 재구성은 당사 서버에서 수행됩니다. 에디션 이름 Desktop + Cloud가 뜻하는 바가 바로 이것입니다. 파일에서 읽어 내는 것(형식, 바이트, 디스어셈블리, 리소스)은 모두 사용자의 컴퓨터에서 계산되고, 재구성되는 것은 모두 서비스를 거칩니다.

Help ▸ About(도움말 ▸ 정보) 대화 상자는 언제든지 연결된 엔진의 버전, 계약의 버전, 그리고 capabilities served(제공되는 기능) 목록을 알려 줍니다. 어떤 기능이 보이지 않을 때 유용합니다. 그 목록에 없는 기능이라면, 그것을 거부하는 것은 인터페이스가 아닙니다.

2. 라이선스 활성화

라이선스가 없어도 애플리케이션은 열리고 작동합니다. 바이너리를 탐색하고, 디스어셈블리 전체, 바이트, 리소스, 디자이너를 읽을 수 있습니다. 라이선스가 여는 것은 VB6 코드 재구성과 프로젝트 내보내기입니다.

한 번에 한 시트

VBReFormer 라이선스는 한 번에 한 워크스테이션에서 사용할 수 있습니다. 이미 다른 곳에서 사용 중이라면 애플리케이션이 그 사실을 분명히 알리고 두 가지 해결책을 제시합니다. 계정에서 이 컴퓨터로 라이선스를 이전하거나, 시트를 추가하는 것입니다.

이것은 부드러운 거부입니다. 사용자는 이미 결제했고, 부족한 것은 없습니다. 메시지는 기술적 오류를 반환하는 대신 그렇게 말합니다.

VBReFormer Online을 열어 둔 브라우저도 한 시트로 계산됩니다. 웹 스튜디오와 데스크톱 애플리케이션은 같은 라이선스를 소비합니다.

3. 창

  1. 바이너리를 엽니다. File ▸ Open a VB6 binary(파일 ▸ VB6 바이너리 열기, Ctrl+O). 허용되는 형식은 .exe, .dll, .ocx, .scr입니다. 상태 표시줄에 진행 중인 분석이 표시되고, 이어서 파일 이름과 컴파일 형태(네이티브 코드 또는 P-code)가 표시됩니다.
  2. PROJECT(프로젝트) 패널을 둘러봅니다. 왼쪽에는 VB6가 보았던 그대로 바이너리가 표시됩니다. 폼, 클래스, 모듈, 그리고 그 프로시저입니다. 트리는 필요할 때 채워집니다. 노드를 펼치면 그 자식이 요청되며, 미리 계산되는 것은 없으므로 큰 실행 파일에서도 열기는 빠르게 유지됩니다.
  3. 프로시저를 선택합니다. 해당 노드의 뷰가 오른쪽에 나타납니다. 노드에 제공되는 뷰가 없으면 빈 패널 대신 그 이유가 화면에 적힙니다.

하단 패널

탭 용도
Output(출력) 작업 로그입니다. 인터페이스 언어를 바꾸더라도 각 줄이 작성된 언어를 그대로 유지합니다. 로그는 기록이지 표시가 아닙니다.
Diagnostics(진단) 엔진이 수행을 거부한 것과 그 이유. 결과가 놀랍게 느껴지는 순간 가장 먼저 확인해야 할 곳입니다.
Analyser(분석기) 상호 참조: 프로시저의 호출자, 심볼의 출현 위치. 결과는 클릭할 수 있습니다.

멤버 가시성

트리의 각 멤버에는 바이너리가 선언한 그대로의 가시성이 붙습니다. (Public), (Private), (Friend)입니다. 이는 VB6 키워드이며 번역되지 않습니다. 가시성을 읽을 수 없었던 멤버에는 아무 표시도 붙지 않습니다. 모르는 것은 적지 않기 때문입니다.

4. 7가지 뷰

뷰는 세 가지 계열로 나뉘며, 이 구분은 읽고 있는 것이 어디에서 왔는지를 알려 줍니다. 이것이 이해해야 할 가장 유용한 점입니다.

“Code” 계열 — 분석으로 재구성

뷰 표시 내용 볼 때
Visual Basic 6 재구성된 구조화 소스 기본 — 찾고 있는 것이 바로 이것입니다
IR 중간 표현 엔진이 무엇을 이해했는지 보려면
Disassembly(디스어셈블리) x86 기계어 명령 프로세서가 무엇을 실행하는지 보려면
P-code VB6 가상 머신의 opcode P-code 바이너리 전용

이 목록을 내려갈수록 기계에 가까워집니다. 어떤 줄이 의심스러울 때: Visual Basic 6는 의도를 말하고, Disassembly는 사실을 말합니다.

“Project files” 계열 — 추론이 아닌 읽기

Designer (.frm)(디자이너), Project (.vbp)(프로젝트), Structure(구조). 여기에 있는 것은 코드 재구성을 거치지 않습니다. 모두 바이너리 안의 테이블에서 읽어 낸 것이며, 읽을 수 없었던 것은 채워 넣는 대신 그렇다고 분명히 적힙니다. 제품에서 가장 신뢰할 수 있는 계열이며, 어떤 추론에도 의존하지 않습니다.

“Resources” 계열

9장을 참조하세요.

5. 컴파일이 남기는 것과 버리는 것

이 장에서는 코드의 일부는 거의 그대로 돌아오는데 다른 일부는 기술적인 이름으로 돌아오는 이유를 설명합니다. 규칙은 단순합니다.

Visual Basic이 실행 시에 필요로 하는 것은 파일에 기록되어 있으며, VBReFormer는 그것을 다시 찾아냅니다. 컴파일 후 더 이상 필요 없어진 것은 버려졌으며, 누구도 되찾을 수 없습니다.

남는 것: 폼, 클래스, 모듈의 이름 · 컨트롤의 이름 · 이벤트 핸들러 · 클래스의 public 멤버 · 모든 인터페이스 속성 · VB 런타임 호출(635개 함수) · Win32 API(15,680개 시그니처) · 코드의 구조 · 문자열.

파일에 없는 것: 주석 · 지역 변수의 이름 · 매개변수의 이름 · 값으로 대체된 명명된 상수 · .bas 모듈의 프로시저 이름 · 원래의 들여쓰기 · Option Explicit과 Enum.

실질적인 결과. 폼은 매우 읽기 쉽게 돌아옵니다. .bas 모듈은 올바르게 돌아오지만 기술적인 이름(proc_42C506)을 갖습니다. 그래서 Rename(이름 바꾸기) 기능(F2)이 있으며, 새 이름은 프로젝트 안의 모든 호출 지점에 전파됩니다. 7장을 참조하세요.

검증할 수 있는 두 가지 예

아래 발췌는 Visual Basic 6에 함께 제공되는 설치 마법사 SETUP1.EXE에서 가져온 것입니다. Microsoft는 같은 폴더에 그 소스 코드를 배포하므로, 이 비교를 직접 다시 해 볼 수 있습니다.

.bas 모듈 프로시저

원본 소스, COMMON.BAS:

Sub AddDirSep(strPathName As String)
    If Right(Trim(strPathName), Len(gstrSEP_URLDIR)) <> gstrSEP_URLDIR And _
       Right(Trim(strPathName), Len(gstrSEP_DIR)) <> gstrSEP_DIR Then
        strPathName = RTrim$(strPathName) & gstrSEP_DIR
    End If
End Sub

VBReFormer가 출력한 결과:

Public Sub proc_42C506(ByRef arg_8 As String)
    If ((Right(Trim(arg_8), Len("/")) <> "/") And (Right(Trim(arg_8), Len("\")) <> "\")) <> 0 Then
        arg_8 = (RTrim$(arg_8) & "\")
    End If
End Sub

논리는 한 줄 한 줄 동일합니다. Right, Trim, Len, RTrim$에는 이름이 있고, ByRef 전달은 올바르게 추론되었습니다. 반면 프로시저 이름과 매개변수 이름은 사라졌고, 상수는 그 값으로 나타납니다. 이를 대체한 것은 컴파일러이지 VBReFormer가 아닙니다.

이벤트 핸들러

원본 소스, BEGIN.FRM:

Private Sub cmdExit_Click()
    ExitSetup Me, gintRET_EXIT
End Sub

VBReFormer가 출력한 결과:

Private Sub cmdExit_Click()
    Set var_18 = Me
    basSetup1.proc_41CE2D var_18, var_1C
End Sub

폼 이름, 버튼 이름, 핸들러 이름은 그대로입니다. Me는 인식되고, 호출되는 모듈에는 이름이 있어 어디로 가야 할지 알려 줍니다. .bas에 있는 호출 대상 프로시저만 주소 이름을 유지합니다.

마커

VBReFormer는 절대 추측하지 않습니다. 확정할 수 없는 값은 지어내는 대신 표시됩니다. 그럴듯하지만 틀린 값은 디컴파일러가 만들어 낼 수 있는 최악의 결과이기 때문입니다.

마커 의미 대처
proc_42C506 주소로 지정된 프로시저 이름을 바꿉니다(F2)
var_18, arg_8 지역 변수 또는 매개변수 용도를 읽은 뒤 이름을 바꿉니다
vtbl_3C 해결되지 않은 가상 테이블 호출 Object Browser가 어느 라이브러리인지 알려 주는 경우가 많습니다
? 확정되지 않은 값 같은 위치를 Disassembly 뷰에서 확인합니다

?가 포함된 파일은 VB6 IDE에서 거부됩니다. 마커는 사용자가 판단하도록 있는 것이지, 그대로 다시 컴파일하라고 있는 것이 아닙니다.

6. 분석 도구

데스크톱 에디션이 가장 크게 다른 점이 여기에 있습니다. 웹 스튜디오가 읽기, 디컴파일, 내보내기에 집중하는 반면, 데스크톱 에디션은 완전한 작업대를 제공합니다.

도구 단축키 얻는 것
Analyse references(참조 분석) Shift+F12 프로시저의 호출자, 심볼의 출현 위치. 결과는 클릭할 수 있으며, 커버리지가 수치화됩니다. 분석이 보지 못한 것은 감춰지지 않고 집계됩니다
Symbol list(심볼 목록) Ctrl+Shift+S 전체 목록. 종류와 범위로 필터링할 수 있으며, 읽어 낸 이름과 합성한 이름을 구별합니다
Call graph(호출 그래프) Ctrl+Shift+A 무엇이 무엇을 호출하는지. 세 가지 축척, 호출자/피호출자 필터
Control-flow graph(제어 흐름 그래프) Ctrl+Shift+G 프로시저의 형태: 블록, 루프, 역방향 에지, 도달 불가능 블록
Object Browser(개체 브라우저) Ctrl+Shift+B 답이 바이너리 바깥에 있을 때의 “이것은 어디에 정의되어 있는가?”
API Browser(API 브라우저) Ctrl+Shift+P Win32 선언의 프로토타입, 별칭, 참고 사항
Cited libraries(참조 라이브러리) Ctrl+K 바이너리가 의존하는 것
Find VB programs(VB 프로그램 찾기) Ctrl+L 폴더 안의 VB 실행 파일 찾기
Find(찾기) Ctrl+Shift+F 제공되는 뷰 전체에서 텍스트 검색
Bookmarks(북마크) Ctrl+F2 위치를 표시하고 되돌아가기(F8 / Shift+F8)
Back / forward navigation(뒤로/앞으로 이동) Alt+← Alt+→ 브라우저와 같습니다

커버리지가 수치화되는 이유. 네이티브 호출 그래프는 직접 호출을 봅니다. 가상 테이블을 통한 호출이나 함수 포인터는 보지 못합니다. 부분적인 목록을 완전한 것처럼 제시하는 대신, VBReFormer는 생략한 것을 집계하여 보여 줍니다. 그러면 결과를 어디까지 신뢰할 수 있는지 알 수 있습니다.

7. 이름 바꾸기

바이너리 작업의 중심이 되는 동작입니다. 디컴파일러는 논리를 돌려주고, 사용자는 이름을 돌려줍니다. 심볼 위에서 F2를 누르거나, 심볼 목록에서 실행합니다.

대화 상자에는 디컴파일러가 보통 감추는 세 가지가 표시됩니다.

  • 현재 이름의 출처 — 사용자가 지정했는지, 디컴파일러가 추론했는지, 아니면 재구성되었는지.
  • 디컴파일러의 제안. 각각 우선순위와 출처가 함께 표시됩니다.
  • 원래 이름. 언제든지 되돌릴 수 있습니다.

이름 바꾸기는 전역적입니다. 프로시저의 이름을 한 번 바꾸면 다른 모듈의 호출 지점도 따라옵니다. 아직 열지 않은 모듈까지 포함해서입니다.

이름 바꾸기가 거부될 때는 반드시 이유와 함께 거부됩니다. 흔한 두 가지 경우: 엔진이 이 문서에 대해 이름 바꾸기 기능을 제공하지 않는 경우와, 현재 뷰가 어휘 조각만 갖고 있는 경우(텍스트에 색을 입히기에는 충분하지만 엔터티를 지정하기에는 부족한 경우)입니다. 두 경우 모두 아무것도 하지 않는 대신 메시지가 그 사실을 알립니다.

8. 바이트와 바이너리 패치

Navigate ▸ Show bytes(탐색 ▸ 바이트 표시, Ctrl+Shift+H)는 주석이 달린 16진 뷰를 엽니다. 바이트만 보여 주는 것이 아니라 각 영역이 무엇을 나타내는지 알려 줍니다. Go to address(주소로 이동, Ctrl+G)로 곧바로 그 위치에 갈 수 있습니다.

실행 파일 수정

“raw” 모드에서는 바이트를 기록하여 수정된 실행 파일을 만들 수 있습니다. 이 기능은 네 가지 거부로 둘러싸여 있으며, 각각이 무언가를 보호합니다.

거부 이유
분석 중인 파일은 결코 대상이 되지 않습니다 엔진은 그 파일을 쓰기용으로 열지 않으며, 인터페이스도 이 보장을 깨지 않습니다
기존 파일 덮어쓰기는 확인을 거칩니다 “되돌릴 수 없습니다”
Authenticode 서명은 제거됩니다 사전에 동의를 구합니다. 자신의 인증서로 다시 서명할 수 있습니다
거부된 패치는 아무것도 기록하지 않습니다 반쯤 쓰다 만 파일은 없습니다

웹 스튜디오는 바이너리 패치와 16진 뷰를 제공하지 않습니다. 이 둘은 데스크톱 에디션 고유의 기능입니다.

9. 리소스와 디자이너

바이너리의 리소스

아이콘, 커서, 비트맵, 문자열 테이블, 버전 정보: .res 파일이 담고 있었을 모든 것입니다. 각 항목은 종류, 크기, 가능한 작업을 표시하며, 항목별로 또는 한꺼번에 추출할 수 있습니다.

제품이 그릴 줄 모르는 리소스도 목록에 남으며 바이트로 표시됩니다. 결코 감춰지지 않습니다. 디렉터리의 항목을 따라갈 수 없었던 경우에는 경고가 그 사실을 알리므로, 목록이 바이너리가 실제로 담고 있는 것보다 짧다는 것을 알 수 있습니다.

폼 디자이너

폼의 표면은 바이너리에서 읽어 낸 속성을 바탕으로, 올바른 그리기 순서로, VB6가 표시했을 그대로 그려집니다. 폼의 이미지는 내보낼 수 있습니다(Ctrl+I).

속성은 읽기 전용입니다. VBReFormer는 폼의 표면을 읽을 줄은 알지만, 컴파일된 실행 파일에 다시 써넣을 줄은 아직 모릅니다. 13장을 참조하세요.

10. 프로젝트 내보내기

  1. 먼저 Diagnostics 패널을 확인합니다. 수행할 수 없었던 것이 적혀 있습니다. 내보내기 전에 읽어 두면 나중에 어떤 요소가 빠진 이유를 찾아 헤매지 않아도 됩니다.
  2. File ▸ Export the VB6 project(파일 ▸ VB6 프로젝트 내보내기). 빈 대상 폴더를 선택합니다.
  3. 내보내기 노트를 읽습니다. VBReFormer는 복구할 수 없었던 것과 그 이유를 기록합니다. 외부 참조, 컴파일 옵션, 시작 모드 같은 일부 정보는 바이너리의 어떤 구조에도 없습니다. 지워진 것이 아니라 애초에 거기 없었던 것입니다. 지어내는 대신 표시됩니다.
  4. .vbp를 Visual Basic 6에서 엽니다. IDE가 요구하는 헤더(VERSION, Attribute VB_Name)는 기록되어 있습니다. 참조가 빠져 있으면 Project ▸ References(프로젝트 ▸ 참조)에서 추가하세요.

사용자를 보호하는 두 가지 쓰기 거부. VB6 파일은 ANSI 1252로 기록됩니다. 이 문자 집합을 컴퓨터에서 사용할 수 없는 경우(다른 문자 집합으로 쓰면 조용히 잘못된 파일이 만들어집니다), 또는 코드의 어떤 문자가 그 문자 집합에 없는 경우 VBReFormer는 쓰기를 거부하며, 후자의 경우 어떤 문자인지와 그 코드 포인트를 알려 줍니다.

11. 옵션

설정 동작
Indentation width(들여쓰기 너비) 재구성된 코드에만 적용됩니다. 디스어셈블리, IR, P-code, 디자이너 블록, .vbp는 이 편집기로 서식이 지정되지 않습니다.
Code page (designer)(코드 페이지, 디자이너) 디자이너의 캡션과 텍스트를 읽는 코드 페이지입니다. VB6 바이너리는 자신의 코드 페이지를 어디에도 선언하지 않습니다(236개의 바이너리에서 측정). 폼의 레이블이 깨진 문자로 표시된다면 바꿔야 할 설정이 바로 이것입니다.
Group under With…End With(With…End With로 묶기) 기본값은 꺼짐. 컴파일러가 With 블록을 해소해 버리므로 이를 다시 만드는 것은 추측이 되기 때문에, 출력은 완전히 한정된 형태(Frame1.Caption)입니다. 충실함보다 가독성을 원한다면 켜세요.
Syntax colouring(구문 색상) 역할 하나에 색 하나. 역할은 엔진에서 오며, 엔진은 각 조각이 무엇인지 알려 줍니다. #RRGGBB 표기. 잘못된 팔레트는 어중간하게 적용되지 않습니다.
Interface language(인터페이스 언어) 영어, 프랑스어, 스페인어. 변경은 즉시 반영됩니다.

렌더링 설정은 표시 요청마다 함께 전달되며, 세션 상태로 저장되는 일은 없습니다. 따라서 들여쓰기를 바꿔도 아무것도 다시 분석되지 않습니다.

12. 단축키

단축키 동작
Ctrl+O VB6 바이너리 열기
F2 커서 아래 심볼의 이름 바꾸기
Shift+F12 참조 분석
Ctrl+Shift+F 프로젝트에서 찾기
Ctrl+G 주소로 이동
Ctrl+Shift+H 바이트 표시
Ctrl+Shift+S 심볼 목록
Ctrl+Shift+B Object Browser
Ctrl+Shift+P API Browser
Ctrl+Shift+G 제어 흐름 그래프
Ctrl+Shift+A 호출 그래프
Ctrl+K 참조 라이브러리
Ctrl+L 폴더의 VB 프로그램
Ctrl+F2 북마크 전환
F8 / Shift+F8 다음/이전 북마크
Ctrl+Shift+F2 북마크 목록
Alt+← / Alt+→ 뒤로/앞으로 이동
Ctrl+I 폼 이미지 저장

13. 알려진 제한

컴파일된 실행 파일의 인터페이스 수정

VBReFormer는 폼의 표면과 그 모든 속성을 읽지만, 실행 파일에 다시 써넣을 줄은 아직 모릅니다. 내장 리소스를 교체하거나 다시 컴파일하지 않고 숨은 속성을 추가하는 것은 제공되지 않습니다. 반면 바이너리 패치(주소에 바이트 기록)는 가능합니다(8장).

UserControl의 .ctx 리소스

내보내기 시 .ctx 파일은 기록되지 않습니다. 프로젝트에 영속화된 리소스를 가진 UserControl이 포함되어 있다면, 그 부분은 다시 구성해야 합니다.

Windows 10 이전

VBReFormer Online을 사용하세요. 시스템이 무엇이든 브라우저 하나면 충분합니다.

어떤 디컴파일러도 넘지 못하는 것

주석, 지역 변수 이름, 명명된 상수: 이들은 파일에 없습니다. 5장을 참조하세요.

14. 자주 묻는 질문

메뉴 기능이 반응하지 않습니다. 왜 그런가요? Help ▸ About을 열어 capabilities served 목록을 확인하세요. 그 기능이 거기에 없다면 거부하는 것은 인터페이스가 아닙니다. 엔진이 이 문서에 대해 그 기능을 제공하지 않는 것입니다. 애플리케이션의 메시지도 그 점을 명시적으로 알려 줍니다.

내보낸 코드는 그대로 다시 컴파일되나요? 대개 그렇습니다. 149개 프로젝트의 테스트 벤치에서 121개가 손대지 않고 다시 컴파일됩니다. 나머지는 참조를 추가하거나 몇몇 마커를 처리해야 합니다.

폼의 레이블을 읽을 수 없습니다. 코드 페이지 문제입니다. VB6 바이너리는 디자이너 텍스트의 코드 페이지를 어디에도 선언하지 않습니다. 옵션에서 설정하세요(11장).

왜 폼이 모듈보다 읽기 쉬운가요? VB6는 작동을 위해 컨트롤과 이벤트의 이름을 유지하는 반면, 모듈의 프로시저는 단순한 주소로 해석해 버리기 때문입니다. 5장을 참조하세요.

실행 파일이 패킹되어 있습니다. 문제가 되나요? 예. 먼저 언패킹해야 합니다. 그렇지 않으면 파일 안에서 VB6 구조가 보이지 않습니다.

.ocx나 ActiveX .dll도 디컴파일할 수 있나요? 예. COM은 public 멤버에 이름을 붙이도록 요구하므로, 그 목록은 일반적으로 더 풍부합니다.

제 바이너리가 어딘가로 전송되나요? 형식 읽기, 바이트, 디스어셈블리, 리소스는 사용자의 컴퓨터에서 처리됩니다. 코드 재구성은 당사 서버에서 수행됩니다. 이것이 Desktop + Cloud 에디션의 의미입니다.

합법인가요? 사용자의 관할 법역과 바이너리에 대한 권리에 따라 다릅니다. 의도된 용도는 자신의 코드, 또는 권리나 허가를 보유한 코드를 복구하는 것입니다.