首页
社区
课程
招聘
算法分析第一篇:网页梦工厂XP1.5算法发析
发表于: 2005-2-9 20:44 7350

算法分析第一篇:网页梦工厂XP1.5算法发析

2005-2-9 20:44
7350

网页梦工厂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期)!

收藏
免费 7
支持
分享
最新回复 (3)
雪    币: 238
活跃值: (250)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
2
支持!!!!
2005-2-9 22:23
0
雪    币: 3003
活跃值: (1853)
能力值: ( LV9,RANK:850 )
在线值:
发帖
回帖
粉丝
3
感谢看雪的鼓励!我不努力都不好意思了。
    愿看雪论坛在新的一年里更多红火!
2005-2-12 14:30
0
雪    币: 102419
活跃值: (201669)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
4
ok!
I see true!
2005-2-12 15:13
0
游客
登录 | 注册 方可回帖
返回