网页梦工厂XP1.5(来自一不知名光盘,光盘标为2002年,想必现在的新版都出来了好几版了。
主程序:
jsbuilder.exe
目的:找注册算法,并作出注册算号器
13:05 2005-2-6
peid v0.92 2004版
UPX 0.89.6 - 1.02 / 1.05 - 1.24 (Delphi) stub -> Markus & Laszlo
OEP:004F5ACC
用Peid2004脱壳
RecImport.exe修复输入表,得到:
JSbuilderunpack.exe
1.35MB
原文件432KB
未注册版只能用40次
软件在本机产生注册申请码(机器码):66050761
填入假认证码:1234567890,弹出出错信息:错误,网页特效梦工厂XP注册认证失败
启动W32Dasm V8.93 Gold版
查找字串,发现其中有:
还有:请重新启动本软件,以完成软件的注册,不会有重启效验吧,那刚才怎么不出现这一现象呢?
软件试用次数已到,是否马上注册本软件?
请输入注册认证码
网页特效梦工厂XP注册成功,谢谢你对本软件的支持 双击这个,会弹出Data Reference Not Found
网页特效梦工厂XP1.5(注册版)
有这么多好的信息呀!!
来:借用W32Dasm8.93Gold版,进行初步分析,然后用Ollydbg1.10正式版运态分析
追注册码算法,先看个初步:
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004D69A3(C)
|
:004D69E1 8D55F0 lea edx, dword ptr [ebp-10]
:004D69E4 8B861C0A0000 mov eax, dword ptr [esi+00000A1C]
:004D69EA E8F961F6FF call 0043CBE8 这里获取机器码
:004D69EF 8B45F0 mov eax, dword ptr [ebp-10]
:004D69F2 E8F126F3FF call 004090E8 关键Call1
:004D69F7 E88829FFFF call 004C9384 关键Call2
:004D69FC 8BD8 mov ebx, eax
:004D69FE 8B45FC mov eax, dword ptr [ebp-04]
:004D6A01 E8E226F3FF call 004090E8 关键Call3
:004D6A06 3BD8 cmp ebx, eax 关键比较
:004D6A08 0F8581000000 jne 004D6A8F 这里跳向注册认证错误
:004D6A0E B201 mov dl, 01
:004D6A10 A140B34600 mov eax, dword ptr [0046B340]
:004D6A15 E8264AF9FF call 0046B440
:004D6A1A 8BD8 mov ebx, eax
:004D6A1C BA02000080 mov edx, 80000002
:004D6A21 8BC3 mov eax, ebx
:004D6A23 E8B84AF9FF call 0046B4E0
:004D6A28 33C9 xor ecx, ecx
具体分析:
它们来自这里:
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004D68A4(C)
|
:004D690B 00 BYTE 0
省略许多代码
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004D6916(C)
|
:004D698C 8B86200A0000 mov eax, dword ptr [esi+00000A20] 就在这里按F2下断吧!!!!!,F9运行。
:004D6992 E85162F6FF call 0043CBE8 得到假注册码的位数
:004D6997 8B45F4 mov eax, dword ptr [ebp-0C] EAX=A即获得假认证码的位为为10位
:004D699A E88DE3F2FF call 00404D2C
:004D699F 8BD0 mov edx, eax EDX中得到假注册码的位数A
:004D69A1 85D2 test edx, edx
:004D69A3 7E3C jle 004D69E1 因为输入了十位的假码,这里没有跳,下面是OD中得到的数据:
:004D69A5 B801000000 mov eax, 00000001 EAX是计数器,赋值1
004D69AA 8B4D FC mov ecx,dword ptr ss:[ebp-4]
004D69AD 8A4C01 FF mov cl,byte ptr ds:[ecx+eax-1] 假码逐位与30,即数字0比较,没有跳
004D69B1 80F9 30 cmp cl,30
004D69B4 72 08 jb short JSbuilde.004D69BE
004D69B6 8B5D FC mov ebx,dword ptr ss:[ebp-4]
004D69B9 80F9 39 cmp cl,39 与9比较(即应该全为0-9之间的数字,否则会弹出“注册码输入有误……”)
004D69BC 76 1F jbe short JSbuilde.004D69DD 跳了
004D69BE B8 F06A4D00 mov eax,JSbuilde.004D6AF0 ; ASCII "注册码输入有误,请重新输入!"
004D69C3 E8 DCF4F5FF call JSbuilde.00435EA4
004D69C8 8B96 200A0000 mov edx,dword ptr ds:[esi+A20]
004D69CE A1 EC405000 mov eax,dword ptr ds:[5040EC]
004D69D3 E8 C412F8FF call JSbuilde.00457C9C
004D69D8 E9 BC000000 jmp JSbuilde.004D6A99
004D69DD 40 inc eax 因为1少于9,就到了这里,计数器自加1
004D69DE 4A dec edx EDX是假注册码的位数A,EDX自减1
004D69DF ^ 75 C9 jnz short JSbuilde.004D69AA
004D69E1 8D55 F0 lea edx,dword ptr ss:[ebp-10]
004D69E4 8B86 1C0A0000 mov eax,dword ptr ds:[esi+A1C]
004D69EA E8 F961F6FF call JSbuilde.0043CBE8 这个Call获得机器码
004D69EF 8B45 F0 mov eax,dword ptr ss:[ebp-10] 将机器给EAX
004D69F2 E8 F126F3FF call JSbuilde.004090E8 第一个关键Call 这个Call跟进看下面:雄飞(将机器码进行运算)
004D69F7 E8 8829FFFF call JSbuilde.004C9384 第二个关键Call 这个还不是比较用的Call 跟进去,看:爱兰(与wangshuang,yaoyuan,JSBuilder运算,得到一结果)
004D69FC 8BD8 mov ebx,eax
004D69FE 8B45 FC mov eax,dword ptr ss:[ebp-4]
004D6A01 E8 E226F3FF call JSbuilde.004090E8 第三个关键Call 这个Call就重要了,它会将假注册码运算,产生一个中间数,跟进看:珊册
004D6A06 3BD8 cmp ebx,eax 这里EBX=666C1398(机器码经过一系列运算得到的结果) EAX=499602D2 (假注册码经过运算后和结果)
004D6A08 0F85 81000000 jnz JSbuilde.004D6A8F 这里注跳向注册认证错误!!
004D6A0E B2 01 mov dl,1
004D6A10 A1 40B34600 mov eax,dword ptr ds:[46B340]
004D6A15 E8 264AF9FF call JSbuilde.0046B440
004D6A1A 8BD8 mov ebx,eax
004D6A1C BA 02000080 mov edx,80000002
004D6A21 8BC3 mov eax,ebx
004D6A23 E8 B84AF9FF call JSbuilde.0046B4E0
004D6A28 33C9 xor ecx,ecx
004D6A2A BA 146B4D00 mov edx,JSbuilde.004D6B14 ; ASCII "System\CurrentControlSet\Services\Class\knightsoft\JSBuilder"
004D6A2F 8BC3 mov eax,ebx
004D6A31 E8 EA4BF9FF call JSbuilde.0046B620
004D6A36 8D55 EC lea edx,dword ptr ss:[ebp-14]
004D6A39 8B86 1C0A0000 mov eax,dword ptr ds:[esi+A1C]
第一个关键Call,雄飞
004035D0 53 push ebx
004035D1 56 push esi
004035D2 57 push edi
004035D3 89C6 mov esi,eax
004035D5 50 push eax
004035D6 85C0 test eax,eax
004035D8 74 6C je short JSbuilde.00403646
004035DA 31C0 xor eax,eax
004035DC 31DB xor ebx,ebx
004035DE BF CCCCCC0C mov edi,0CCCCCCC
004035E3 8A1E mov bl,byte ptr ds:[esi] 机器码逐位放入BL,第一位是6,即ASCII码36
004035E5 46 inc esi ESi中是机器码的地址,自加1,原为00F10A4C,自加1变为00F10A4D,即到指向第二位机器码
004035E6 80FB 20 cmp bl,20 与空格相比较
004035E9 ^ 74 F8 je short JSbuilde.004035E3
004035EB B5 00 mov ch,0 ECX高位置0
004035ED 80FB 2D cmp bl,2D 与短横相比较
004035F0 74 62 je short JSbuilde.00403654
004035F2 80FB 2B cmp bl,2B 与 + 相比较
004035F5 74 5F je short JSbuilde.00403656
004035F7 80FB 24 cmp bl,24 不能是 $
004035FA 74 5F je short JSbuilde.0040365B
004035FC 80FB 78 cmp bl,78 N
004035FF 74 5A je short JSbuilde.0040365B
00403601 80FB 58 cmp bl,58 :
00403604 74 55 je short JSbuilde.0040365B
00403606 80FB 30 cmp bl,30 0
00403609 75 13 jnz short JSbuilde.0040361E
0040360B 8A1E mov bl,byte ptr ds:[esi]
0040360D 46 inc esi
0040360E 80FB 78 cmp bl,78
00403611 74 48 je short JSbuilde.0040365B
00403613 80FB 58 cmp bl,58
00403616 74 43 je short JSbuilde.0040365B
00403618 84DB test bl,bl
0040361A 74 20 je short JSbuilde.0040363C
0040361C EB 04 jmp short JSbuilde.00403622
0040361E 84DB test bl,bl
00403620 74 2D je short JSbuilde.0040364F
00403622 80EB 30 sub bl,30 得到机器码的十进制数6
00403625 80FB 09 cmp bl,9 与9相比较
00403628 77 25 ja short JSbuilde.0040364F
0040362A 39F8 cmp eax,edi EAX=0000000 EDI=0CCCCCCC
0040362C 77 21 ja short JSbuilde.0040364F 不会跳
0040362E 8D0480 lea eax,dword ptr ds:[eax+eax*4] EAX*5 第一次为0
00403631 01C0 add eax,eax EAX=0+0
00403633 01D8 add eax,ebx EAX=0+6
00403635 8A1E mov bl,byte ptr ds:[esi] 取得第二位机器码
00403637 46 inc esi ESI指向第三位机器码
00403638 84DB test bl,bl
0040363A ^ 75 E6 jnz short JSbuilde.00403622
*************************************************************************************************
第一次 EAX=6
EAX=6*5*2+6=6*A+6=42
EAX=42*A+0=294
EAX=294*A+5=19cd
EAX=19cd*A+0=10202
EAX=10202*A+7=A141B
EAX=A141B*A+6=64C914
EAX=64C914*A+1=3EFDAC9(最终结果)
****************************************************************************************************
省略许多代码
0040369A C3 retn 返回
0040369B 90 nop
[招生]科锐逆向工程师培训(2025年3月11日实地,远程教学同时开班, 第52期)!