xx维修助手v6.013
因为断点找不到,所以从算法查起,对算法定位点下断最后找到程序的算法核心,相当大的运气在里面。
安装程序后,主程序在C:\WINDOWS\SYSTEM32\pcwxzs\pcwxzs.exe。
UPX 0.89.6 - 1.02 / 1.05 - 1.24 (Delphi) stub -> Markus & Laszlo [Overlay]
Borland Delphi 6.0 - 7.0
机器码:4379315163
切入点:
BD的程序,没能定位注册按钮,消息框也断不下,于是想到查算法,对signature定位点下断。
cryptosearcher查脱壳后的程序:MD5,定位:0049FD80。
OD载入原程序,数据窗口一看,0049FD80不是想象中的01234567 89ABCDEF FEDCBA98 76543210,可能因为加壳的原因。
hr 0049FD80,运行,一直看到壳解压后的东西:
0049FD80 01 23 45 67 89 AB CD EF #Eg?惋
0049FD88 FE DC BA 98 76 54 32 10 ??vT2
好继续下断HR 0049FD80,转移了2次:
00D6A540 01 23 45 67 89 AB CD EF #Eg?惋
00D6A548 FE DC BA 98 76 54 32 10 ??vT2
00D6AC78 01 23 45 67 89 AB CD EF #Eg?惋
00D6AC80 FE DC BA 98 76 54 32 10 ??vT2
HR 00D6AC78:
00497B94 8B10 mov edx,dword ptr ds:[eax]
00497B96 895424 14 mov dword ptr ss:[esp+14],edx ; 断在此
一直往下,狂多的循环计算,好像是MD5加密,然后返回到:
00497A9D FF16 call dword ptr ds:[esi] ; md5?
00497A9F 8B53 04 mov edx,dword ptr ds:[ebx+4] ; 返回处
00497AA2 8B43 24 mov eax,dword ptr ds:[ebx+24]
00497AA5 8B4B 14 mov ecx,dword ptr ds:[ebx+14]
00497AA8 E8 DFAEF6FF call pcwxzs.0040298C ; 拷贝
拷贝后00D6AC78的数据变成:
00D6AC78 42 FA 23 91 8C D2 CC C1 B??姨
00D6AC80 F7 BB E4 63 EB 1B 78 48 骰溷?xH
然后又返回:
0049AE83 E8 74CFFFFF call pcwxzs.00497DFC
0049AE88 8B55 F0 mov edx,dword ptr ss:[ebp-10]
堆栈 ss:[0012FEC0]=00D6ACA8, (ASCII "42fa23918cd2ccc1f7bbe463eb1b7848")
F8步进,看到好几个md5值,又返回了几次,因为我们要找的是注册的NAG,一直到步过以下这个call的时候调出了注册的NAG:
0049ABC6 E8 B5150000 call pcwxzs.0049C180 ; 调出注册
在下一行代码下断,输入注册码后竟然先提示错误的注册码,然后再断下,看来所有的猫腻都在这个call里面,也许这个call里面还有好几层call。
跟进,F8步进不久看到可疑目标:
0049C1A2 8B93 78030000 mov edx,dword ptr ds:[ebx+378] ; 可疑目标出现
ds:[00D6316C]=00D6AEC8, (ASCII "bai5076hu740115jb")
0049C1A8 8A83 75030000 mov al,byte ptr ds:[ebx+375]
0049C1AE E8 C1D3FFFF call pcwxzs.00499574 ; 调出注册
hr 00d6aec8,步进call漫步:
当步过:00499658 FF92 04010000 call dword ptr ds:[edx+104] ; 00498754
此时断下:
004973BA 8A0410 mov al,byte ptr ds:[eax+edx]
004973BD 3206 xor al,byte ptr ds:[esi] ; 断在此
重新加载程序,为什么不跟踪继续?因为字符串ASCII "bai5076hu740115jb"是内置的,它怎么计算都是得到固定的值,我们没必要知道过程,只要结果,跟踪机器码才是硬道理,注册码总是跟机器码挂钩的。
跟进00499658的call,照旧F8步进:
00498784 FF91 F8000000 call dword ptr ds:[ecx+F8]
0049878A 8B45 F8 mov eax,dword ptr ss:[ebp-8] ; 出现机器码
堆栈 ss:[0012FEC4]=00D8451C, (ASCII "4379315163")
HR 00D8451C:
00497328 BB 01000000 mov ebx,1
0049732D 8D75 EF lea esi,dword ptr ss:[ebp-11]
00497330 8B45 FC mov eax,dword ptr ss:[ebp-4]
00497333 E8 00D1F6FF call pcwxzs.00404438
00497338 50 push eax
00497339 8BC3 mov eax,ebx
0049733B 48 dec eax
0049733C 5A pop edx
0049733D 8BCA mov ecx,edx
0049733F 99 cdq
00497340 F7F9 idiv ecx
00497342 8B45 FC mov eax,dword ptr ss:[ebp-4]
00497345 8A0410 mov al,byte ptr ds:[eax+edx] ; 断在此
00497348 50 push eax
00497349 8B45 FC mov eax,dword ptr ss:[ebp-4]
0049734C E8 E7D0F6FF call pcwxzs.00404438
00497351 5A pop edx
00497352 32D0 xor dl,al ; XOR 机器码长度
00497354 32D3 xor dl,bl ; XOR 序号
00497356 8816 mov byte ptr ds:[esi],dl
00497358 43 inc ebx
00497359 46 inc esi
0049735A 83FB 0A cmp ebx,0A
0049735D ^ 75 D1 jnz short pcwxzs.00497330
顺取机器码,XOR 长度,XOR 序号,结果:
0012FD77 3F 3B 3E 37 3C 3D 38 33 35 ?;>7<=835
再次XOR:
00497372 8B45 FC mov eax,dword ptr ss:[ebp-4]
00497375 E8 BED0F6FF call pcwxzs.00404438
0049737A 2BC3 sub eax,ebx
0049737C 8B55 FC mov edx,dword ptr ss:[ebp-4]
0049737F 8A0C02 mov cl,byte ptr ds:[edx+eax] ; 逆取机器码
00497382 8BC3 mov eax,ebx
00497384 48 dec eax
00497385 51 push ecx
00497386 B9 09000000 mov ecx,9
0049738B 99 cdq
0049738C F7F9 idiv ecx
0049738E 59 pop ecx
0049738F 304C15 EF xor byte ptr ss:[ebp+edx-11],cl
00497393 43 inc ebx
00497394 4E dec esi
00497395 ^ 75 DB jnz short pcwxzs.00497372
逆取机器码,对上次XOR结果再次XOR:
0012FD77 3F 3B 3E 37 3C 3D 38 33 35 ?;>7<=835
0012FD64 00D8451C ASCII "4379315163"
结果:
0012FD77 0C 0D 0F 02 0D 0E 01 04 06 ...
机器码有10位,多出了1位,即第一位4=34,再与结果中的第一字节0C异或,得到:
0012FD77 38 0D 0F 02 0D 0E 01 04 06 8..
然后与内置的字符串XOR:
0049739D BB 01000000 mov ebx,1
004973A2 8D75 EF lea esi,dword ptr ss:[ebp-11]
004973A5 8B45 F8 mov eax,dword ptr ss:[ebp-8]
004973A8 E8 8BD0F6FF call pcwxzs.00404438
004973AD 50 push eax
004973AE 8BC3 mov eax,ebx
004973B0 48 dec eax
004973B1 5A pop edx
004973B2 8BCA mov ecx,edx
004973B4 99 cdq
004973B5 F7F9 idiv ecx
004973B7 8B45 F8 mov eax,dword ptr ss:[ebp-8]
004973BA 8A0410 mov al,byte ptr ds:[eax+edx] ; 内置字符串
004973BD 3206 xor al,byte ptr ds:[esi] ; 机器码XOR值
004973BF 50 push eax
004973C0 8B45 F8 mov eax,dword ptr ss:[ebp-8]
004973C3 E8 70D0F6FF call pcwxzs.00404438
004973C8 5A pop edx
004973C9 32D0 xor dl,al
004973CB 32D3 xor dl,bl
004973CD 8816 mov byte ptr ds:[esi],dl
004973CF 43 inc ebx
004973D0 46 inc esi
004973D1 83FB 0A cmp ebx,0A
004973D4 ^ 75 CF jnz short pcwxzs.004973A5
运算过程是这样的,顺取内置字符串,XOR机器码计算值,XOR 字符串长度,XOR 序号。
参数:
0012FD77 38 0D 0F 02 0D 0E 01 04 06 // 机器码计算值
00D6AEC8 62 61 69 35 30 37 36 68 bai5076h // 内置字符串
00D6AED0 75 37 34 30 31 31 35 6A u740115j
00D6AED8 62 00 00 00 b...
得到结果:
0012FD77 4A 7F 74 22 29 2E 21 75 6B Jt").!uk
得到注册码:
00497405 E8 9AFDFFFF call pcwxzs.004971A4 ; 计算得到注册码
参数:0012FD77 4A 7F 74 22 29 2E 21 75 6B Jt").!uk
0049722D 83FB 03 cmp ebx,3
00497230 /7C 08 jl short pcwxzs.0049723A
00497232 |8A45 FB mov al,byte ptr ss:[ebp-5] ; 第3字节,74
00497235 |24 3F and al,3F
00497237 |8845 F8 mov byte ptr ss:[ebp-8],al ; 34
0049723A \83FB 02 cmp ebx,2
0049723D 7C 15 jl short pcwxzs.00497254
0049723F 8A45 FA mov al,byte ptr ss:[ebp-6] ; 第2字节,7F
00497242 C1E0 02 shl eax,2
00497245 33D2 xor edx,edx
00497247 8A55 FB mov dl,byte ptr ss:[ebp-5] ; 第3字节,74
0049724A C1EA 06 shr edx,6
0049724D 0AC2 or al,dl
0049724F 24 3F and al,3F
00497251 8845 F7 mov byte ptr ss:[ebp-9],al ; 3D
00497254 8A45 F9 mov al,byte ptr ss:[ebp-7] ; 第1字节,4A
00497257 8BD0 mov edx,eax
00497259 C1E2 04 shl edx,4
0049725C 33C9 xor ecx,ecx
0049725E 8A4D FA mov cl,byte ptr ss:[ebp-6] ; 第2字节,7F
00497261 C1E9 04 shr ecx,4
00497264 0AD1 or dl,cl
00497266 80E2 3F and dl,3F
00497269 8855 F6 mov byte ptr ss:[ebp-A],dl ; 27
0049726C 25 FF000000 and eax,0FF
00497271 C1E8 02 shr eax,2
00497274 24 3F and al,3F
00497276 8845 F5 mov byte ptr ss:[ebp-B],al ; 12
00497279 8D45 FC lea eax,dword ptr ss:[ebp-4]
取参数的前3字节,计算得到4个字节,逆序排列:
0012FD3D 12 27 3D 34 4A 7F 74 '=4Jt
然后对这4个字节查表:0012FD3D 12 27 3D 34
00497290 8D45 F0 lea eax,dword ptr ss:[ebp-10]
00497293 33D2 xor edx,edx
00497295 8A13 mov dl,byte ptr ds:[ebx] ; 取得字节
00497297 8A92 2DFD4900 mov dl,byte ptr ds:[edx+49FD2D] ; 查表
0049729D E8 BED0F6FF call pcwxzs.00404360
004972A2 8B55 F0 mov edx,dword ptr ss:[ebp-10]
004972A5 8BC7 mov eax,edi
004972A7 E8 94D1F6FF call pcwxzs.00404440
004972AC 43 inc ebx
004972AD 4E dec esi
004972AE ^ 75 E0 jnz short pcwxzs.00497290
表:
0049FD2D 49 59 41 47 50 58 44 4A 51 57 4D 48 56 43 4E 46 IYAGPXDJQWMHVCNF
0049FD3D 55 5A 52 42 4B 45 53 4F 4C 54 74 66 6B 79 73 62 UZRBKESOLTtfkysb
0049FD4D 6F 68 6C 75 6A 77 65 63 70 6D 69 61 71 6E 64 78 ohlujwecpmiaqndx
0049FD5D 7A 76 67 72 34 36 2B 30 32 35 37 33 2F 38 31 3D zvgr46+02573/81=
0049FD6D 39 8B C0 30 31 32 33 34 35 36 37 38 39 61 62 63 9?0123456789abc
0049FD7D 64 65 66 01 23 45 67 89 AB CD EF FE DC BA 98 76 def#Eg?惋??v
得到4个字符:Rc84。
因为参数总共是9个字节,所以得到12个字符:ASCII "Rc84QljdQOEa"
然后返回:
00497405 E8 9AFDFFFF call pcwxzs.004971A4 ; 计算得到注册码
0049740A 8B55 E0 mov edx,dword ptr ss:[ebp-20] ; 返回处
堆栈 ss:[0012FD68]=00E05BC0, (ASCII "Rc84QljdQOEa")
虽然注册码的计算没有涉及到MD5,我想可能是机器码的计算涉及到MD5,要不然对算法的定位点下断是到不了这里的。
然后返回n层,调出注册的NAG,进行比对:
004996B3 FF92 EC000000 call dword ptr ds:[edx+EC] ; 调出注册
没有进行跟踪,因为输入得到的注册码:ASCII "Rc84QljdQOEa"后就成功了,呵呵。
写入注册表:
HKCU\Software\eBook Edit Pro\Login\5318724F\LoginUser SUCCESS "4379315163"
HKCU\Software\eBook Edit Pro\Login\5318724F\LoginPassword SUCCESS "Rc84QljdQOEa"
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课