对《XXX查询大全 8.0 大众版》主程序OVERLAY的处理
说明:本文对该软件的OVERLAY数据的处理,纯属菜鸟学习技术,与该软件的破解基本无关。
程序安装完毕后有两个版本,其中一个是大众版。
分析如下:
1.查壳脱壳:
PEID:UPX 0.89.6 - 1.02 / 1.05 - 1.24 (Delphi) stub -> Markus & Laszlo [Overlay]
OD载入:
00464F80 h> 60 pushad 入口点
00464F81 BE 00104400 mov esi,herbs1.00441000
...
004650DA 61 popad
004650DB ^ E9 147EFEFF jmp herbs1.0044CEF4
dump,PEID:Borland Delphi 3.0
运行提示:VFP&Exe1.32以下版本,无法运行,请升级。。。
参考文章:应该是OVERLAY的问题。
2.对Overlay的处理:
2.1 OD载入未脱壳程序,下断CreateFileA & SetFilePointer :
0012F5C8 00407147 /CALL 到 CreateFileA 来自 herbs1.00407142
0012F5CC 00D0485C |FileName = "E:\herbs1.exe"
F9,第一个SetFilePointer:
0012F5DC 004071D2 /CALL 到 SetFilePointer 来自 herbs1.004071CD
0012F5E0 00000080 |hFile = 00000080 (window)
0012F5E4 FFFFFFF8 |OffsetLo = FFFFFFF8 (-8.)
0012F5E8 00000000 |pOffsetHi = NULL
0012F5EC 00000002 \Origin = FILE_END
F9一下,第二个SetFilePointer :
0012F5DC 004071D2 /CALL 到 SetFilePointer 来自 herbs1.004071CD
0012F5E0 00000080 |hFile = 00000080 (window)
0012F5E4 00025A00 |OffsetLo = 25A00 (154112.)
0012F5E8 00000000 |pOffsetHi = NULL
0012F5EC 00000000 \Origin = FILE_BEGIN
F9又一下,第三个SetFilePointer :
0012F5DC 004071D2 /CALL 到 SetFilePointer 来自 herbs1.004071CD
0012F5E0 00000080 |hFile = 00000080 (window)
0012F5E4 00025E00 |OffsetLo = 25E00 (155136.)
0012F5E8 00000000 |pOffsetHi = NULL
0012F5EC 00000000 \Origin = FILE_BEGIN
都是由下面代码入栈参数产生的:
004071C8 51 push ecx
004071C9 6A 00 push 0
004071CB 52 push edx
004071CC 50 push eax
004071CD E8 12E8FFFF call herbs1.004059E4 ; jmp to KERNEL32.SetFilePointer
004071D2 C3 retn
OffsetLo 是由push edx入栈参数决定的,好,找源头。
返回到:0044B340 . E8 83BEFBFF call upherbs1.004071C8
往上翻,看到都是SetFilePointer的指针调用:
0044B308 > \B9 02000000 mov ecx,2
0044B30D . BA F8FFFFFF mov edx,-8
0044B312 . 8BC6 mov eax,esi
0044B314 . E8 AFBEFBFF call upherbs1.004071C8 第一个SetFilePointer
0044B319 . BA E4F74400 mov edx,upherbs1.0044F7E4
0044B31E . B9 04000000 mov ecx,4
0044B323 . 8BC6 mov eax,esi
0044B325 . E8 46BEFBFF call upherbs1.00407170
0044B32A . 8D55 F4 lea edx,dword ptr ss:[ebp-C]
0044B32D . B9 04000000 mov ecx,4
0044B332 . 8BC6 mov eax,esi
0044B334 . E8 37BEFBFF call upherbs1.00407170 赋值指针位置
0012F5C8 00407189 /CALL 到 ReadFile 来自 herbs1.00407184
0012F5CC 00000080 |hFile = 00000080 (window)
0012F5D0 0012FE3C |Buffer = 0012FE3C
0012F5D4 00000004 |BytesToRead = 4
0012F5D8 0012F5E0 |pBytesRead = 0012F5E0
0012F5DC 00000000 \pOverlapped = NULL
0044B339 . 33C9 xor ecx,ecx
0044B33B . 8B55 F4 mov edx,dword ptr ss:[ebp-C] 0012FE3C 00 5A 02 00
0044B33E . 8BC6 mov eax,esi
0044B340 . E8 83BEFBFF call upherbs1.004071C8 第二个SetFilePointer
0044B345 . 8B55 F4 mov edx,dword ptr ss:[ebp-C]
0044B348 . 81C2 00040000 add edx,400
0044B34E . 33C9 xor ecx,ecx
0044B350 . 8BC6 mov eax,esi
0044B352 . E8 71BEFBFF call upherbs1.004071C8 第三个SetFilePointer
2.2 OD载入脱壳后程序,下断 CreateFileA & SetFilePointer :
第1个SetFilePointer:
0012F5DC 004071D2 /CALL 到 SetFilePointer 来自 up.004071CD
0012F5E0 00000080 |hFile = 00000080 (window)
0012F5E4 FFFFFFF8 |OffsetLo = FFFFFFF8 (-8.)
0012F5E8 00000000 |pOffsetHi = NULL
0012F5EC 00000002 \Origin = FILE_END
第二个SetFilePointer:
0012F5DC 004071D2 /CALL 到 SetFilePointer 来自 up.004071CD
0012F5E0 00000080 |hFile = 00000080 (window)
0012F5E4 00000000 |OffsetLo = 0
0012F5E8 00000000 |pOffsetHi = NULL
0012F5EC 00000000 \Origin = FILE_BEGIN
第三个SetFilePointer:
0012F5DC 004071D2 /CALL 到 SetFilePointer 来自 up.004071CD
0012F5E0 00000080 |hFile = 00000080 (window)
0012F5E4 00000400 |OffsetLo = 400 (1024.)
0012F5E8 00000000 |pOffsetHi = NULL
0012F5EC 00000000 \Origin = FILE_BEGIN
2.3小结:
比较上面两个跟踪结果发现,主要变化在于第二个SetFilePointer,脱壳后的值变为0,未脱壳的为25A00。
程序先是把指针(第一个SetFilePointer)指向文件最后,然后读取8位的数值,赋值给指针(第二个SetFilePointer),也就是读取的开始位置,然后再这个指针的值加400,指向第三个指针。
因此关键在第一个SetFilePointer后读取的数值。
2.4 PEID 查看未脱壳文件的区段:
.rsrc=24600+1400=25A00
也就是从25A00开始,后面都是OVERLAY数据。
2.5用UE(Winhex也一样)打开文件搜索005A0200(就是00025A00):
搜索到一个,竟然在文件的最尾部:
000979c0h: 44 E0 5C A9 6C 60 14 5D 17 56 37 A7 66 49 4B E2 ; D嘬╈`.].V7фIK?
000979d0h: F7 F6 CF C6 AE 74 2F C7 8A 38 D7 CF 0D A9 0A 04 ; 黯掀?/?8紫.?.
000979e0h: 1B B9 E4 8F B5 60 08 FA 74 FE F6 2B 2A D0 10 81 ; .逛?`.??+*??
000979f0h: 90 1D 8A C7 55 C0 B8 55 29 B8 14 9C B7 4A A5 61 ; ??U栏U)??Jメ
00097a00h: C0 1C 07 00 00 5A 02 00 ; ?...Z..
00025A00可能就是起始点;
00071CC0可能就是长度(因为00097A00-00025A00=0007200约等于00071CC0,所以估计它就是长度)。
脱壳的没有找到,而且尾部全部是00。怪不得跟踪SetFilePointer的时候返回值是0。估计就是因为这个情况使得脱壳的文件不能运行。
2.6在Winhex中进行拷贝未脱壳的尾部数据
从00025A00开始到结束97A00(00097A00-00025A00=0007200约等于00071CC0,全拷贝算了)。
粘贴于脱壳后的软件的最后面,从00068000开始,这样,要修改最后的起始点,将00 5A 02 00(00025A00)改为00 80 06 00(00068000)。
运行ok,PEID:Borland Delphi 3.0 [Overlay]
3.后记:
参考看雪精华6的附加数据处理的文章,不过里面没有关于upx加壳的overlay处理。
基础知识的贫乏,所以过程中大部分靠猜&运气,感觉不知其所以然,请达者指教,谢谢。
[课程]FART 脱壳王!加量不加价!FART作者讲授!