├── CPeParser.cpp
├── CPeParser.h
├── README.md
├── decode.asm
├── decode.obj
├── hello15pb.exe
├── hello15pb_pb.exe
├── unpack02.cpp
├── unpack02.sln
├── unpack02.vcxproj
└── unpack02.vcxproj.user
/CPeParser.cpp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lantie/unpack02/21d3a4c22a2115030f8100947bd913e5028c1f5c/CPeParser.cpp
--------------------------------------------------------------------------------
/CPeParser.h:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lantie/unpack02/21d3a4c22a2115030f8100947bd913e5028c1f5c/CPeParser.h
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # unpack02
2 | upx静态脱壳机源码
3 |
4 | # 说明
5 | 本代码是15pb的一个小项目,Upx静态脱壳机的源码,通过分析upx壳代码,我们可以完成这个项目。
6 | 代码思路:
7 | ① 读取文件到内存
8 | 映射PE头到内存
9 | 映射每一个区段到内存
10 | ② 解密内存中的代码和数据
11 | 计算src和dest
12 | 调用解压缩函数
13 | ③ 在内存中获取IAT,获取导入表相关信息,还原导入表
14 | 找到原PE文件的导入表结构
15 | 修复导入表结构、IAT
16 | ④ dump内存
17 | 修正区段、oep,保存文件
18 |
19 | # 广告
20 | 逆向最有趣的就是突破自己,如果你也想突破自己,来15PB吧,学习真正的信息安全技术! http://www.15pb.com.cn/
21 |
--------------------------------------------------------------------------------
/decode.asm:
--------------------------------------------------------------------------------
1 | .386
2 | .model flat, stdcall ;32 bit memory model
3 | option casemap :none ;case sensitive
4 |
5 | include windows.inc
6 | include kernel32.inc
7 | include user32.inc
8 | include shell32.inc
9 | include msvcrt.inc
10 |
11 | includelib kernel32.lib
12 | includelib user32.lib
13 | includelib shell32.lib
14 | includelib msvcrt.lib
15 |
16 | decompress PROTO :DWORD,:DWORD
17 |
18 |
19 | .data?
20 |
21 | hInstance dd ?
22 |
23 | .code
24 |
25 | ;FixIAT proc codeBaseAddr:DWORD,iatAddr:DWORD
26 | ;
27 | ; pushad
28 | ; esi
29 | ;
30 | ; lea edi, [esi+37000h]
31 | ;
32 | ;loc_43ADDC: ; CODE XREF: UPX1:0043ADFEj
33 | ; mov eax, [edi]
34 | ; or eax, eax
35 | ; jz short loc_43AE27
36 | ; mov ebx, [edi+4]
37 | ; add ebx, esi
38 | ; push eax
39 | ; add edi, 8
40 | ; call LoadLibraryA
41 | ; xchg eax, ebp
42 | ;
43 | ;loc_43ADF9: ; CODE XREF: UPX1:0043AE1Fj
44 | ; mov al, [edi]
45 | ; inc edi
46 | ; or al, al
47 | ; jz short loc_43ADDC
48 | ; mov ecx, edi
49 | ; jns short near ptr loc_43AE0A+1
50 | ; movzx eax, word ptr [edi]
51 | ; inc edi
52 | ; push eax
53 | ; inc edi
54 | ;
55 | ;loc_43AE0A: ; CODE XREF: UPX1:0043AE02j
56 | ; mov ecx, 0AEF24857h
57 | ; push ebp
58 | ; call GetProcAddress
59 | ; or eax, eax
60 | ; jz short loc_43AE21
61 | ; mov [ebx], eax
62 | ; add ebx, 4
63 | ; jmp short loc_43ADF9
64 | ;; ---------------------------------------------------------------------------
65 | ;
66 | ;FixIAT endp
67 |
68 |
69 | decompress proc src:DWORD,dest:DWORD
70 |
71 | start:
72 | pushad
73 | mov esi, src
74 | mov edi, dest
75 | push edi
76 | or ebp, 0FFFFFFFFh
77 | jmp short loc_43ACF2
78 | ; ---------------------------------------------------------------------------
79 | ;align 8
80 |
81 | loc_43ACE8: ; CODE XREF: UPX1:loc_43ACF9j
82 | mov al, [esi]
83 | inc esi
84 | mov [edi], al
85 | inc edi
86 |
87 | loc_43ACEE: ; CODE XREF: UPX1:0043AD86j
88 | ; UPX1:0043AD9Dj
89 | add ebx, ebx
90 | jnz short loc_43ACF9
91 |
92 | loc_43ACF2: ; CODE XREF: UPX1:0043ACE0j
93 | mov ebx, [esi]
94 | sub esi, 0FFFFFFFCh
95 | adc ebx, ebx
96 |
97 | loc_43ACF9: ; CODE XREF: UPX1:0043ACF0j
98 | jb short loc_43ACE8
99 | mov eax, 1
100 |
101 | loc_43AD00: ; CODE XREF: UPX1:0043AD0Fj
102 | ; UPX1:0043AD1Aj
103 | add ebx, ebx
104 | jnz short loc_43AD0B
105 | mov ebx, [esi]
106 | sub esi, 0FFFFFFFCh
107 | adc ebx, ebx
108 |
109 | loc_43AD0B: ; CODE XREF: UPX1:0043AD02j
110 | adc eax, eax
111 | add ebx, ebx
112 | jnb short loc_43AD00
113 | jnz short loc_43AD1C
114 | mov ebx, [esi]
115 | sub esi, 0FFFFFFFCh
116 | adc ebx, ebx
117 | jnb short loc_43AD00
118 |
119 | loc_43AD1C: ; CODE XREF: UPX1:0043AD11j
120 | xor ecx, ecx
121 | sub eax, 3
122 | jb short loc_43AD30
123 | shl eax, 8
124 | mov al, [esi]
125 | inc esi
126 | xor eax, 0FFFFFFFFh
127 | jz short loc_43ADA2
128 | mov ebp, eax
129 |
130 | loc_43AD30: ; CODE XREF: UPX1:0043AD21j
131 | add ebx, ebx
132 | jnz short loc_43AD3B
133 | mov ebx, [esi]
134 | sub esi, 0FFFFFFFCh
135 | adc ebx, ebx
136 |
137 | loc_43AD3B: ; CODE XREF: UPX1:0043AD32j
138 | adc ecx, ecx
139 | add ebx, ebx
140 | jnz short loc_43AD48
141 | mov ebx, [esi]
142 | sub esi, 0FFFFFFFCh
143 | adc ebx, ebx
144 |
145 | loc_43AD48: ; CODE XREF: UPX1:0043AD3Fj
146 | adc ecx, ecx
147 | jnz short loc_43AD6C
148 | inc ecx
149 |
150 | loc_43AD4D: ; CODE XREF: UPX1:0043AD5Cj
151 | ; UPX1:0043AD67j
152 | add ebx, ebx
153 | jnz short loc_43AD58
154 | mov ebx, [esi]
155 | sub esi, 0FFFFFFFCh
156 | adc ebx, ebx
157 |
158 | loc_43AD58: ; CODE XREF: UPX1:0043AD4Fj
159 | adc ecx, ecx
160 | add ebx, ebx
161 | jnb short loc_43AD4D
162 | jnz short loc_43AD69
163 | mov ebx, [esi]
164 | sub esi, 0FFFFFFFCh
165 | adc ebx, ebx
166 | jnb short loc_43AD4D
167 |
168 | loc_43AD69: ; CODE XREF: UPX1:0043AD5Ej
169 | add ecx, 2
170 |
171 | loc_43AD6C: ; CODE XREF: UPX1:0043AD4Aj
172 | cmp ebp, 0FFFFF300h
173 | adc ecx, 1
174 | lea edx, [edi+ebp]
175 | cmp ebp, 0FFFFFFFCh
176 | jbe short loc_43AD8C
177 |
178 | loc_43AD7D: ; CODE XREF: UPX1:0043AD84j
179 | mov al, [edx]
180 | inc edx
181 | mov [edi], al
182 | inc edi
183 | dec ecx
184 | jnz short loc_43AD7D
185 | jmp loc_43ACEE
186 | ; ---------------------------------------------------------------------------
187 | align 4
188 |
189 | loc_43AD8C: ; CODE XREF: UPX1:0043AD7Bj
190 | ; UPX1:0043AD99j
191 | mov eax, [edx]
192 | add edx, 4
193 | mov [edi], eax
194 | add edi, 4
195 | sub ecx, 4
196 | ja short loc_43AD8C
197 | add edi, ecx
198 | jmp loc_43ACEE
199 | ; ---------------------------------------------------------------------------
200 |
201 | loc_43ADA2: ; CODE XREF: UPX1:0043AD2Cj
202 | pop esi
203 | mov edi, esi
204 | mov ecx, 0C0Fh
205 |
206 | loc_43ADAA: ; CODE XREF: UPX1:0043ADB1j
207 | ; UPX1:0043ADB6j
208 | mov al, [edi]
209 | inc edi
210 | sub al, 0E8h
211 |
212 | loc_43ADAF: ; CODE XREF: UPX1:0043ADD4j
213 | cmp al, 1
214 | ja short loc_43ADAA
215 | cmp byte ptr [edi], 11h
216 | jnz short loc_43ADAA
217 | mov eax, [edi]
218 | mov bl, [edi+4]
219 | shr ax, 8
220 | rol eax, 10h
221 | xchg al, ah
222 | sub eax, edi
223 | sub bl, 0E8h
224 | add eax, esi
225 | mov [edi], eax
226 | add edi, 5
227 | mov al, bl
228 | loop loc_43ADAF
229 | popad
230 |
231 | ret
232 |
233 | decompress endp
234 |
235 |
236 | end
237 |
--------------------------------------------------------------------------------
/decode.obj:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lantie/unpack02/21d3a4c22a2115030f8100947bd913e5028c1f5c/decode.obj
--------------------------------------------------------------------------------
/hello15pb.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lantie/unpack02/21d3a4c22a2115030f8100947bd913e5028c1f5c/hello15pb.exe
--------------------------------------------------------------------------------
/hello15pb_pb.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lantie/unpack02/21d3a4c22a2115030f8100947bd913e5028c1f5c/hello15pb_pb.exe
--------------------------------------------------------------------------------
/unpack02.cpp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lantie/unpack02/21d3a4c22a2115030f8100947bd913e5028c1f5c/unpack02.cpp
--------------------------------------------------------------------------------
/unpack02.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio 15
4 | VisualStudioVersion = 15.0.27703.2000
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unpack02", "unpack02.vcxproj", "{88576CD6-AFDD-40FE-A5A9-97AED3629E32}"
7 | EndProject
8 | Global
9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
10 | Debug|x64 = Debug|x64
11 | Debug|x86 = Debug|x86
12 | Release|x64 = Release|x64
13 | Release|x86 = Release|x86
14 | EndGlobalSection
15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
16 | {88576CD6-AFDD-40FE-A5A9-97AED3629E32}.Debug|x64.ActiveCfg = Debug|x64
17 | {88576CD6-AFDD-40FE-A5A9-97AED3629E32}.Debug|x64.Build.0 = Debug|x64
18 | {88576CD6-AFDD-40FE-A5A9-97AED3629E32}.Debug|x86.ActiveCfg = Debug|Win32
19 | {88576CD6-AFDD-40FE-A5A9-97AED3629E32}.Debug|x86.Build.0 = Debug|Win32
20 | {88576CD6-AFDD-40FE-A5A9-97AED3629E32}.Release|x64.ActiveCfg = Release|x64
21 | {88576CD6-AFDD-40FE-A5A9-97AED3629E32}.Release|x64.Build.0 = Release|x64
22 | {88576CD6-AFDD-40FE-A5A9-97AED3629E32}.Release|x86.ActiveCfg = Release|Win32
23 | {88576CD6-AFDD-40FE-A5A9-97AED3629E32}.Release|x86.Build.0 = Release|Win32
24 | EndGlobalSection
25 | GlobalSection(SolutionProperties) = preSolution
26 | HideSolutionNode = FALSE
27 | EndGlobalSection
28 | GlobalSection(ExtensibilityGlobals) = postSolution
29 | SolutionGuid = {35E21EE3-1F50-47AD-824D-47B563EE8816}
30 | EndGlobalSection
31 | EndGlobal
32 |
--------------------------------------------------------------------------------
/unpack02.vcxproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Debug
6 | Win32
7 |
8 |
9 | Release
10 | Win32
11 |
12 |
13 | Debug
14 | x64
15 |
16 |
17 | Release
18 | x64
19 |
20 |
21 |
22 | 15.0
23 | {88576CD6-AFDD-40FE-A5A9-97AED3629E32}
24 | Win32Proj
25 | unpack02
26 | 10.0.17134.0
27 |
28 |
29 |
30 | Application
31 | true
32 | v141
33 | Unicode
34 | Static
35 |
36 |
37 | Application
38 | false
39 | v141
40 | true
41 | Unicode
42 |
43 |
44 | Application
45 | true
46 | v141
47 | Unicode
48 |
49 |
50 | Application
51 | false
52 | v141
53 | true
54 | Unicode
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 | true
76 |
77 |
78 | true
79 |
80 |
81 | false
82 |
83 |
84 | false
85 |
86 |
87 |
88 | NotUsing
89 | Level3
90 | Disabled
91 | true
92 | WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
93 | true
94 |
95 |
96 | Console
97 | true
98 | /NODEFAULTLIB:library %(AdditionalOptions)
99 | msvcrt.lib
100 |
101 |
102 |
103 |
104 | Use
105 | Level3
106 | Disabled
107 | true
108 | _DEBUG;_CONSOLE;%(PreprocessorDefinitions)
109 | true
110 |
111 |
112 | Console
113 | true
114 |
115 |
116 |
117 |
118 | Use
119 | Level3
120 | MaxSpeed
121 | true
122 | true
123 | true
124 | WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
125 | true
126 |
127 |
128 | Console
129 | true
130 | true
131 | true
132 |
133 |
134 |
135 |
136 | Use
137 | Level3
138 | MaxSpeed
139 | true
140 | true
141 | true
142 | NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
143 | true
144 |
145 |
146 | Console
147 | true
148 | true
149 | true
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
--------------------------------------------------------------------------------
/unpack02.vcxproj.user:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------