【破解作者】 Bmzy
【作者主页】 http://www.9ycn.com/
【使用工具】 OllyDbg v1.10 , PEiD v0.92 , DeDe v3.20.04
【破解平台】 WinXP SP2
【软件名称】 Hide Window Now V2.5
【下载地址】 http://www.skycn.com/soft/19655.html
【软件简介】 隐藏窗口的软件。
【破解声明】 我是菜鸟,请各位高手指教
--------------------------------------------------------------------------------
【破解内容】
软件打开,显示NAG窗口,提示"注册"或"试用"。点击注册,显示注册对话框。
首先用PEiD检查,是Delphi编写的,无壳。
用DeDe分析,有一个名为TRegisterForm的Class,猜测其中的ImgBtn1Click为注册框的确定按钮相应,地址为474558,OD载入,设断474558。
F9运行,在注册框填用户名:"Bmzy[PCG]",注册码:"1234abcd",按确定,停在474558处。
00474558 PUSH EBP
00474559 MOV EBP,ESP
0047455B MOV ECX,8
00474560 PUSH 0
00474562 PUSH 0
00474564 DEC ECX
00474565 JNZ SHORT HWN.00474560
00474567 PUSH EBX
00474568 MOV EBX,EAX
0047456A XOR EAX,EAX
0047456C PUSH EBP
0047456D PUSH HWN.00474773
00474572 PUSH DWORD PTR FS:[EAX]
00474575 MOV DWORD PTR FS:[EAX],ESP
00474578 LEA EAX,DWORD PTR SS:[EBP-4]
0047457B MOV EDX,HWN.00474788 ; ASCII 0D," Name is "
00474580 CALL HWN.004040D0
00474585 LEA EAX,DWORD PTR SS:[EBP-8]
00474588 MOV EDX,HWN.004747AC ; ASCII "Thank you for buying our software . Please restart Hide Window Now."
0047458D CALL HWN.004040D0
00474592 LEA EAX,DWORD PTR SS:[EBP-C]
00474595 MOV EDX,HWN.004747FC ; ASCII "The Key you entered appears to be invalid."
0047459A CALL HWN.004040D0
0047459F LEA EDX,DWORD PTR SS:[EBP-14] 以上程序在装载字符串,与验证无关
004745A2 MOV EAX,DWORD PTR DS:[EBX+300]
004745A8 CALL HWN.0044BE1C
004745AD MOV EAX,DWORD PTR SS:[EBP-14]
004745B0 CALL HWN.0046F038
004745B5 AND AL,BYTE PTR DS:[478D60]
004745BB JE SHORT HWN.004745C7
004745BD MOV EDX,EBX
004745BF MOV EAX,DWORD PTR SS:[EBP-4]
004745C2 CALL HWN.0046FCA0
004745C7 CMP BYTE PTR DS:[478D60],0
004745CE JE SHORT HWN.004745DA
004745D0 MOV EDX,EBX
004745D2 MOV EAX,DWORD PTR SS:[EBP-8]
004745D5 CALL HWN.0046FCA0
004745DA CMP BYTE PTR DS:[478D60],0
004745E1 JE SHORT HWN.00474607
004745E3 LEA EDX,DWORD PTR SS:[EBP-18]
004745E6 MOV EAX,DWORD PTR DS:[EBX+300]
004745EC CALL HWN.0044BE1C
004745F1 MOV EAX,DWORD PTR SS:[EBP-18]
004745F4 CALL HWN.0046F038
004745F9 TEST AL,AL
004745FB JE SHORT HWN.00474607
004745FD MOV EDX,EBX
004745FF MOV EAX,DWORD PTR SS:[EBP-C]
00474602 CALL HWN.0046FCA0
00474607 LEA EDX,DWORD PTR SS:[EBP-1C]
0047460A MOV EAX,HWN.00474830 ; ASCII "!!!!!O`ld!hr!sdpthsde/!!!"
0047460F CALL HWN.0046F3B4
00474614 MOV ECX,DWORD PTR SS:[EBP-1C]
00474617 MOV EAX,HWN.00478D54
0047461C MOV EDX,HWN.00474854
00474621 CALL HWN.00404344
00474626 LEA EDX,DWORD PTR SS:[EBP-20]
00474629 MOV EAX,HWN.00474860 ; ASCII "Ui`oj!xnt!gns!ctxhof!nts!"
0047462E CALL HWN.0046F3B4
00474633 PUSH DWORD PTR SS:[EBP-20]
00474636 PUSH HWN.00474854
0047463B LEA EDX,DWORD PTR SS:[EBP-24]
0047463E MOV EAX,HWN.00474884 ; ASCII "rnguv`sd!/!Qmd`rd!sdru`su!"
00474643 CALL HWN.0046F3B4
00474648 PUSH DWORD PTR SS:[EBP-24]
0047464B PUSH HWN.00474854
00474650 LEA EDX,DWORD PTR SS:[EBP-28]
00474653 MOV EAX,HWN.004748A8 ; ASCII "Ihed!Vhoenv!Onv/!;!("
00474658 CALL HWN.0046F3B4
0047465D PUSH DWORD PTR SS:[EBP-28]
00474660 MOV EAX,HWN.00478D58
00474665 MOV EDX,5
0047466A CALL HWN.004043B8
0047466F LEA EDX,DWORD PTR SS:[EBP-2C]
00474672 MOV EAX,HWN.004748C8 ; ASCII "Uid!Jdx!xnt!doudsde!`qqd`sr"
00474677 CALL HWN.0046F3B4
0047467C PUSH DWORD PTR SS:[EBP-2C]
0047467F PUSH HWN.00474854
00474684 LEA EDX,DWORD PTR SS:[EBP-30]
00474687 MOV EAX,HWN.004748EC ; ASCII "un!cd!how`mhe/"
0047468C CALL HWN.0046F3B4
00474691 PUSH DWORD PTR SS:[EBP-30] 以上字符串与验证无关
00474694 MOV EAX,HWN.00478D5C
00474699 MOV EDX,3
0047469E CALL HWN.004043B8
004746A3 LEA EDX,DWORD PTR SS:[EBP-34]
004746A6 MOV EAX,DWORD PTR DS:[EBX+304]
004746AC CALL HWN.0044BE1C
004746B1 CMP DWORD PTR SS:[EBP-34],0
004746B5 JNZ SHORT HWN.004746C5
004746B7 MOV EDX,EBX
004746B9 MOV EAX,DWORD PTR DS:[478D54]
004746BE CALL HWN.0046FCA0
004746C3 JMP SHORT HWN.00474731
004746C5 LEA EDX,DWORD PTR SS:[EBP-38]
004746C8 MOV EAX,DWORD PTR DS:[EBX+300]
004746CE CALL HWN.0044BE1C
004746D3 MOV EAX,DWORD PTR SS:[EBP-38]
004746D6 LEA EDX,DWORD PTR SS:[EBP-D]
004746D9 CALL HWN.0046FD10 执行过这个CALL后判断显示注册是否正确的信息
004746DE TEST AL,AL
004746E0 JE SHORT HWN.00474725
004746E2 LEA EDX,DWORD PTR SS:[EBP-3C]
004746E5 MOV EAX,DWORD PTR DS:[EBX+300]
004746EB CALL HWN.0044BE1C
004746F0 MOV EAX,DWORD PTR SS:[EBP-3C]
004746F3 PUSH EAX
004746F4 LEA EDX,DWORD PTR SS:[EBP-40]
004746F7 MOV EAX,DWORD PTR DS:[EBX+304]
004746FD CALL HWN.0044BE1C
00474702 MOV EAX,DWORD PTR SS:[EBP-40]
00474705 POP EDX
00474706 CALL HWN.0046FB5C
0047470B MOV EDX,EBX
0047470D MOV EAX,DWORD PTR DS:[478D58]
00474712 CALL HWN.0046FCA0 通过改前面的跳转,发现执行这个CALL显示注册正确信息
00474717 MOV EAX,DWORD PTR DS:[477268]
0047471C MOV EAX,DWORD PTR DS:[EAX]
0047471E CALL HWN.0046BB88
00474723 JMP SHORT HWN.00474731
00474725 MOV EDX,EBX
00474727 MOV EAX,DWORD PTR DS:[478D5C]
0047472C CALL HWN.0046FCA0 不断运行下来,发现执行这个CALL会显示注册错误信息
00474731 XOR EAX,EAX
00474733 POP EDX
00474734 POP ECX
00474735 POP ECX
00474736 MOV DWORD PTR FS:[EAX],EDX
00474739 PUSH HWN.0047477A
0047473E LEA EAX,DWORD PTR SS:[EBP-40]
00474741 MOV EDX,4
00474746 CALL HWN.0040405C
0047474B LEA EAX,DWORD PTR SS:[EBP-30]
0047474E MOV EDX,6
00474753 CALL HWN.0040405C
00474758 LEA EAX,DWORD PTR SS:[EBP-18]
0047475B MOV EDX,2
00474760 CALL HWN.0040405C
00474765 LEA EAX,DWORD PTR SS:[EBP-C]
00474768 MOV EDX,3
0047476D CALL HWN.0040405C
00474772 RETN
00474773 JMP HWN.00403A3C
00474778 JMP SHORT HWN.0047473E
0047477A POP EBX
0047477B MOV ESP,EBP
0047477D POP EBP
0047477E RETN
-------------------------------------------------------------------------------------------
在这一层调用,先走到了4747C2出现注册错误信息,向上分析,找到4746D9处的CALL和其下面的跳转。
重新进来设断停在4746D9处,按F8,在4746E0处修改标志位,使其不跳,运行到474712的CALL出现注册
正确信息。经过分析,4746D9处的CALL 46FD10是验证的部分,下面进入它分析。
-------------------------------------------------------------------------------------------
重新进来,设断4746D9,F7进入
0046FD10 PUSH EBP
0046FD11 MOV EBP,ESP
0046FD13 MOV ECX,7
0046FD18 PUSH 0 这里的循环在堆栈开了14个临时变量,并
0046FD1A PUSH 0 初始为0,下面大量使用这些变量进行计算
0046FD1C DEC ECX 在OD中监视窗口设上"string[[EBP-04]]"
0046FD1D JNZ SHORT HWN.0046FD18 到"string[[EBP-38]]",后面可以可以
0046FD1F PUSH EBX 很方便的观察这些变量的变化
0046FD20 PUSH ESI
0046FD21 PUSH EDI
0046FD22 MOV ESI,EDX
0046FD24 MOV DWORD PTR SS:[EBP-4],EAX
0046FD27 MOV EAX,DWORD PTR SS:[EBP-4]
0046FD2A CALL HWN.004044E8 这步调用以后,变量[EBP-4]中放的是注册
0046FD2F XOR EAX,EAX 码字串的指针,已经获得字串
0046FD31 PUSH EBP
0046FD32 PUSH HWN.0046FEF2
0046FD37 PUSH DWORD PTR FS:[EAX]
0046FD3A MOV DWORD PTR FS:[EAX],ESP
0046FD3D MOV BYTE PTR DS:[ESI],0
0046FD40 XOR EBX,EBX
0046FD42 XOR EAX,EAX
0046FD44 PUSH EBP
0046FD45 PUSH HWN.0046FECB
0046FD4A PUSH DWORD PTR FS:[EAX]
0046FD4D MOV DWORD PTR FS:[EAX],ESP
0046FD50 CMP DWORD PTR SS:[EBP-4],0 比较字串长不能为0
0046FD54 JE HWN.0046FEC1
0046FD5A MOV EAX,DWORD PTR SS:[EBP-4]
0046FD5D CALL HWN.004044F8
0046FD62 CALL HWN.00408AA0 此CALL将字串全部变为大写
0046FD67 MOV EDX,EAX
0046FD69 LEA EAX,DWORD PTR SS:[EBP-8]
0046FD6C CALL HWN.00404230 此处CALL复制一个字串将指针放入变量[EBP-8]
0046FD71 LEA EAX,DWORD PTR SS:[EBP-C]
0046FD74 MOV EDX,DWORD PTR SS:[EBP-8]
0046FD77 MOV DL,BYTE PTR DS:[EDX+2]
0046FD7A CALL HWN.00404220 从此开始连续调用4次404220,传入三个变量,每
0046FD7F LEA EAX,DWORD PTR SS:[EBP-10] 次都传入[EBP-8],是上面复制的注册码字串的指针,
0046FD82 MOV EDX,DWORD PTR SS:[EBP-8] 另一个传入的变量是返回的字串指针,还有一个是
0046FD85 MOV DL,BYTE PTR DS:[EDX+6] 要复制的字符。这个函数四次调用将注册码偏移
0046FD88 CALL HWN.00404220 0x2、0x6、0xA、0x10处的四个字符分别复制并将指
0046FD8D LEA EAX,DWORD PTR SS:[EBP-14] 针放到[EBP-C]、[EBP-10]、[EBP-14]、[EBP-18]中
0046FD90 MOV EDX,DWORD PTR SS:[EBP-8]
0046FD93 MOV DL,BYTE PTR DS:[EDX+A]
0046FD96 CALL HWN.00404220
0046FD9B LEA EAX,DWORD PTR SS:[EBP-18]
0046FD9E MOV EDX,DWORD PTR SS:[EBP-8]
0046FDA1 MOV DL,BYTE PTR DS:[EDX+10]
0046FDA4 CALL HWN.00404220
0046FDA9 LEA EAX,DWORD PTR SS:[EBP-2C]
0046FDAC MOV EDX,DWORD PTR SS:[EBP-8]
0046FDAF MOV DL,BYTE PTR DS:[EDX+7]
0046FDB2 CALL HWN.00404220 从这里开始CALL 404220和CALL 46F2F4两个一组调用
0046FDB7 MOV EAX,DWORD PTR SS:[EBP-2C] 四次,追踪发现CALL 404220和上面一样,分别把偏移
0046FDBA LEA EDX,DWORD PTR SS:[EBP-1C] 0x7、0xB、0x12、0x3处的四个字符分别复制并将指
0046FDBD CALL HWN.0046F2F4 针放到[EBP-2C]、[EBP-30]、[EBP-34]、[EBP-38]中
0046FDC2 LEA EAX,DWORD PTR SS:[EBP-30] 而CALL 46F2F4是将CALL 404220刚复制的字符经过变
0046FDC5 MOV EDX,DWORD PTR SS:[EBP-8] 换然后存分别指针到[EBP-1C]、[EBP-20]、[EBP-24]
0046FDC8 MOV DL,BYTE PTR DS:[EDX+B] 、[EBP-28]中
0046FDCB CALL HWN.00404220
0046FDD0 MOV EAX,DWORD PTR SS:[EBP-30]
0046FDD3 LEA EDX,DWORD PTR SS:[EBP-20]
0046FDD6 CALL HWN.0046F2F4
0046FDDB LEA EAX,DWORD PTR SS:[EBP-34]
0046FDDE MOV EDX,DWORD PTR SS:[EBP-8]
0046FDE1 MOV DL,BYTE PTR DS:[EDX+12]
0046FDE4 CALL HWN.00404220
0046FDE9 MOV EAX,DWORD PTR SS:[EBP-34]
0046FDEC LEA EDX,DWORD PTR SS:[EBP-24]
0046FDEF CALL HWN.0046F2F4
0046FDF4 LEA EAX,DWORD PTR SS:[EBP-38]
0046FDF7 MOV EDX,DWORD PTR SS:[EBP-8]
0046FDFA MOV DL,BYTE PTR DS:[EDX+3]
0046FDFD CALL HWN.00404220
0046FE02 MOV EAX,DWORD PTR SS:[EBP-38]
0046FE05 LEA EDX,DWORD PTR SS:[EBP-28]
0046FE08 CALL HWN.0046F2F4
0046FE0D MOV EAX,DWORD PTR SS:[EBP-8]
0046FE10 CALL HWN.004042F8
0046FE15 CMP EAX,13 查字串长度必须等于0x13,既19个字符
0046FE18 JNZ HWN.0046FEC1
0046FE1E MOV EAX,DWORD PTR SS:[EBP-C] 下面CALL 404444四次是进行比较,分别比较开始
0046FE21 MOV EDX,DWORD PTR SS:[EBP-1C] CALL 404220得到的4个字符和CALL 46F2F4变换出
0046FE24 CALL HWN.00404444 的四个字符是否相等,如不等则跳46FEC1,码错误
0046FE29 JNZ HWN.0046FEC1
0046FE2F MOV EAX,DWORD PTR SS:[EBP-10]
0046FE32 MOV EDX,DWORD PTR SS:[EBP-20]
0046FE35 CALL HWN.00404444
0046FE3A JNZ HWN.0046FEC1
0046FE40 MOV EAX,DWORD PTR SS:[EBP-14]
0046FE43 MOV EDX,DWORD PTR SS:[EBP-24]
0046FE46 CALL HWN.00404444
0046FE4B JNZ SHORT HWN.0046FEC1
0046FE4D MOV EAX,DWORD PTR SS:[EBP-18]
0046FE50 MOV EDX,DWORD PTR SS:[EBP-28]
0046FE53 CALL HWN.00404444
0046FE58 JNZ SHORT HWN.0046FEC1
0046FE5A MOV EAX,DWORD PTR SS:[EBP-8] 从此处开始是比较注册码的一些固定位是否等于
0046FE5D CMP BYTE PTR DS:[EAX],41 一些固定的字符,如不等则跳46FEC1,码错误
0046FE60 JNZ SHORT HWN.0046FEC1
0046FE62 MOV EAX,DWORD PTR SS:[EBP-8]
0046FE65 CMP BYTE PTR DS:[EAX+1],31
0046FE69 JNZ SHORT HWN.0046FEC1
0046FE6B MOV EAX,DWORD PTR SS:[EBP-8]
0046FE6E CMP BYTE PTR DS:[EAX+4],2D
0046FE72 JNZ SHORT HWN.0046FEC1
0046FE74 MOV EAX,DWORD PTR SS:[EBP-8]
0046FE77 CMP BYTE PTR DS:[EAX+5],57
0046FE7B JNZ SHORT HWN.0046FEC1
0046FE7D MOV EAX,DWORD PTR SS:[EBP-8]
0046FE80 CMP BYTE PTR DS:[EAX+8],46
0046FE84 JNZ SHORT HWN.0046FEC1
0046FE86 MOV EAX,DWORD PTR SS:[EBP-8]
0046FE89 CMP BYTE PTR DS:[EAX+9],2D
0046FE8D JNZ SHORT HWN.0046FEC1
0046FE8F MOV EAX,DWORD PTR SS:[EBP-8]
0046FE92 CMP BYTE PTR DS:[EAX+C],53
0046FE96 JNZ SHORT HWN.0046FEC1
0046FE98 MOV EAX,DWORD PTR SS:[EBP-8]
0046FE9B CMP BYTE PTR DS:[EAX+D],52
0046FE9F JNZ SHORT HWN.0046FEC1
0046FEA1 MOV EAX,DWORD PTR SS:[EBP-8]
0046FEA4 CMP BYTE PTR DS:[EAX+E],2D
0046FEA8 JNZ SHORT HWN.0046FEC1
0046FEAA MOV EAX,DWORD PTR SS:[EBP-8]
0046FEAD CMP BYTE PTR DS:[EAX+F],43
0046FEB1 JNZ SHORT HWN.0046FEC1
0046FEB3 MOV EAX,DWORD PTR SS:[EBP-8]
0046FEB6 CMP BYTE PTR DS:[EAX+11],5A
0046FEBA JNZ SHORT HWN.0046FEC1
0046FEBC MOV BYTE PTR DS:[ESI],1
0046FEBF MOV BL,1 如注册码正确,将运行到这里,BL置1,后面
0046FEC1 XOR EAX,EAX 46FEF9将EBX送EAX,作为返回值,码错误,最后
0046FEC3 POP EDX 返回零
0046FEC4 POP ECX
0046FEC5 POP ECX
0046FEC6 MOV DWORD PTR FS:[EAX],EDX
0046FEC9 JMP SHORT HWN.0046FED7
0046FECB JMP HWN.00403788
0046FED0 XOR EBX,EBX
0046FED2 CALL HWN.00403AF0
0046FED7 XOR EAX,EAX
0046FED9 POP EDX
0046FEDA POP ECX
0046FEDB POP ECX
0046FEDC MOV DWORD PTR FS:[EAX],EDX
0046FEDF PUSH HWN.0046FEF9
0046FEE4 LEA EAX,DWORD PTR SS:[EBP-38]
0046FEE7 MOV EDX,0E
0046FEEC CALL HWN.0040405C
0046FEF1 RETN
0046FEF2 JMP HWN.00403A3C
0046FEF7 JMP SHORT HWN.0046FEE4
0046FEF9 MOV EAX,EBX
0046FEFB POP EDI
0046FEFC POP ESI
0046FEFD POP EBX
0046FEFE MOV ESP,EBP
0046FF00 POP EBP
0046FF01 RETN
-------------------------------------------------------------------------------------------
在这一层调用,我们可以看到注册码验证的大概了:
1. 注册码必须是19位的。
2. 分别取注册码3、7、11、17位与用46F2F4函数变换后的注册码8、12、19、4进行比较。
3. 分别比较注册码1、2、5、6、9、10、13、14、15、16、18位是否是指定的字符。
基本知道了验证结构,唯一不清楚的就是CALL 46F2F4进行变换的机制,好,下面追入分析。
-------------------------------------------------------------------------------------------
设断进来
0046F2F4 PUSH EBP
0046F2F5 MOV EBP,ESP
0046F2F7 ADD ESP,-0C
0046F2FA PUSH EBX
0046F2FB PUSH ESI
0046F2FC PUSH EDI
0046F2FD MOV DWORD PTR SS:[EBP-8],EDX
0046F300 MOV DWORD PTR SS:[EBP-4],EAX
0046F303 MOV EAX,DWORD PTR SS:[EBP-4]
0046F306 CALL HWN.004044E8
0046F30B XOR EAX,EAX
0046F30D PUSH EBP
0046F30E PUSH HWN.0046F396
0046F313 PUSH DWORD PTR FS:[EAX]
0046F316 MOV DWORD PTR FS:[EAX],ESP
0046F319 MOV ESI,1
0046F31E MOV EAX,DWORD PTR SS:[EBP-4]
0046F321 CALL HWN.004042F8
0046F326 MOV EDI,EAX
0046F328 TEST EDI,EDI
0046F32A JLE SHORT HWN.0046F375
0046F32C MOV EBX,1
0046F331 MOV EAX,DWORD PTR SS:[EBP-4] 从此处到46F373的循环是关键
0046F334 MOV AL,BYTE PTR DS:[EAX+EBX-1] 取传进来的字符
0046F338 AND AL,0F 与0F与运算,只要低4位
0046F33A MOV EDX,HWN.0046F3AC ; ASCII "anloer" (本行是OD自动分析添的注释)
0046F33F MOV DL,BYTE PTR DS:[EDX+ESI-1] 取"anloer"的一个字符(每次都就循环一次,都是"a")
0046F343 AND DL,0F 与0F与运算,获得低4位
0046F346 XOR AL,DL 将字符的低四位与a字符的低四位进行异或运算
0046F348 MOV BYTE PTR SS:[EBP-9],AL 结果存入临时变量[EBP-9]
0046F34B LEA EAX,DWORD PTR SS:[EBP-4]
0046F34E CALL HWN.00404550
0046F353 MOV EDX,DWORD PTR SS:[EBP-4]
0046F356 MOV DL,BYTE PTR DS:[EDX+EBX-1] 再次取字符
0046F35A AND DL,0F0 与0F与运算,只要高4位
0046F35D MOV CL,BYTE PTR SS:[EBP-9] 从变量[EBP-9]取刚才异或的结果放入CL
0046F360 ADD DL,CL 与字符取高4位的结果相加
0046F362 MOV BYTE PTR DS:[EAX+EBX-1],DL 保存结果
0046F366 INC ESI
0046F367 CMP ESI,6
0046F36A JLE SHORT HWN.0046F371
0046F36C MOV ESI,1
0046F371 INC EBX
0046F372 DEC EDI
0046F373 JNZ SHORT HWN.0046F331 循环,这处循环体应该是将一个字串一个一个的与"anloer"
0046F375 MOV EAX,DWORD PTR SS:[EBP-8] 进行计算处理,但验证码的时候每次调用这个函数传的字串
0046F378 MOV EDX,DWORD PTR SS:[EBP-4] 都只有一个字符,因此每次都没循环,只走一次
0046F37B CALL HWN.0040408C
0046F380 XOR EAX,EAX
0046F382 POP EDX
0046F383 POP ECX
0046F384 POP ECX
0046F385 MOV DWORD PTR FS:[EAX],EDX
0046F388 PUSH HWN.0046F39D
0046F38D LEA EAX,DWORD PTR SS:[EBP-4]
0046F390 CALL HWN.00404038
0046F395 RETN
0046F396 JMP HWN.00403A3C
0046F39B JMP SHORT HWN.0046F38D
0046F39D POP EDI
0046F39E POP ESI
0046F39F POP EBX
0046F3A0 MOV ESP,EBP
0046F3A2 POP EBP
0046F3A3 RETN
-------------------------------------------------------------------------------------------
好,46F2F4这个函数也分析清楚了,它将传入的字符的低四位与字符"a"的低四位作异或运算,变换传入的字符。
按追出的算法计算出一个可用的注册码:A1ED-WEDF-EDSR-CEZD,填入注册,成功!
--------------------------------------------------------------------------------
【破解总结】
注册码验证算法如下:
1. 注册码必须是19位的。
2. 分别将注册码8、12、19、4位的字符的低四位与字符"a"的低四位进行XOR运算,高四位不动,结果分别
与注册码3、7、11、17位比较是否相等。
3. 分别比较注册码1、2、5、6、9、10、13、14、15、16、18位是否是"A、1、-、W、F、-、S、R、-、C、Z"。
这个程序的用户名信息没有参与验证,注册成功后信息加密保存在注册表 HKEY_LOCAL_MACHINE\SOFTWARE\Anloer
Software\Hide Window Now\中名为SN的键值中,删掉就又变为不注册的了。函数46FD10是验证函数,如注册表里有
相应键值,程序初始处也要调用这个函数验证,以确定是否显示NAG窗口。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)