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"