题目:寻找MagicTweak之注册码
软件功能:为优化Windows提供一站式服务,使用此软件可以修改几百个XP/2000/Me/98设置,不必费力地查找注册表了。在其帮助下,
你就是Windows 专家了。
软件来源:电脑爱好者2003光盘
引子:刚刚分析完那个“网络收藏夹转换器”,接着安装了这个小软件,运行时出现提示框,要你输入用户名和注册码。用PEID查看,
是Pecompact1.68-1.84加壳的。输入用户名任意,注册码87654321。点击Register按钮,接着出现“感谢您的注册,请重新启动程序激
活注册码”。我一看就知道不是当场比较注册码的,而是在重新启动后从某个地方读出注册码进行比较的。把这个软件卸载掉,启动
Registry Monitor监视其安装过程,发现在注册表内没有太大动作,倒是发现在\windows目录下写入2个文件,一个是mgreg.ini,另一
个mgwin.ini,打开第二个文件发现你输入的注册码和用户名在里面呢。现在调出SOFTICE,下断点bpx setfilepointer,F5退出,运行
程序,被拦截。不要屏蔽断点,因为总共3次中断,最后一次中断后,我们用F10经过一段艰苦卓绝的跟踪,终于来到下面代码处:
0197:004470D3 LEA EAX,[ESP+DC] //假码地址送EAX。
0197:004470DA MOV ECX,EBP
0197:004470DC PUSH EAX
0197:004470DD CALL 00447E00 //真假码进行比较啦。里面猫腻不少。
0197:004470E2 TEST EAX,EAX //判断EAX标志。
0197:004470E4 JNZ NEAR 00447327 //如果不为0则成功。
0197:004470EA PUSH EAX
0197:004470EB LEA ECX,[ESP+0738]
0197:004470F2 MOV [004D8464],EAX
0197:004470F7 CALL 004572B0
0197:004470FC LEA ECX,[ESP+0734]
0197:00447103 MOV BYTE [ESP+1B40],0D
0197:0044710B CALL 0048878B //这里出现NAG窗口,提示你注册。
0197:00447110 CMP EAX,BYTE +01
================================================================================
下面是:004470DD处的函数代码分析:
0197:004470D3 LEA EAX,[ESP+DC] //假码地址送EAX。
0197:004470DA MOV ECX,EBP
0197:004470DC PUSH EAX
*省去很多*
0197:00447E96 SUB EDI,ECX
0197:00447E98 MOV EAX,ECX
0197:00447E9A MOV ESI,EDI //真注册码地址送ESI。
0197:00447E9C MOV EDI,EDX //复制真注册码到EDI处。
0197:00447E9E LEA EDX,[ESP+08A8]
0197:00447EA5 SHR ECX,02
0197:00447EA8 REP MOVSD //大量真注册码出现。
0197:00447EAA MOV ECX,EAX
0197:00447EAC XOR EAX,EAX
0197:00447EAE AND ECX,BYTE +03
0197:00447EB1 REP MOVSB
0197:00447EB3 MOV EDI,004D1638
0197:00447EB8 OR ECX,BYTE -01
0197:00447EBB REPNE SCASB
0197:00447EBD NOT ECX
0197:00447EBF SUB EDI,ECX
0197:00447EC1 MOV EAX,ECX
0197:00447EC3 MOV ESI,EDI
0197:00447EC5 MOV EDI,EDX
0197:00447EC7 LEA EDX,[ESP+1140]
0197:00447ECE SHR ECX,02
0197:00447ED1 REP MOVSD //大量真注册码出现。
0197:00447ED3 MOV ECX,EAX
0197:00447ED5 XOR EAX,EAX
0197:00447ED7 AND ECX,BYTE +03
0197:00447EDA REP MOVSB
0197:00447EDC MOV EDI,004D1304
0197:00447EE1 OR ECX,BYTE -01
0197:00447EE4 REPNE SCASB
0197:00447EE6 NOT ECX
0197:00447EE8 SUB EDI,ECX
0197:00447EEA MOV EAX,ECX
0197:00447EEC MOV ESI,EDI
0197:00447EEE MOV EDI,EDX
0197:00447EF0 SHR ECX,02
0197:00447EF3 REP MOVSD //大量真注册码出现。
0197:00447EF5 MOV ECX,EAX
0197:00447EF7 AND ECX,BYTE +03
0197:00447EFA REP MOVSB
0197:00447EFC MOV EDI,004D0B2C
0197:00447F01 OR ECX,BYTE -01
0197:00447F04 XOR EAX,EAX
0197:00447F06 LEA EDX,[ESP+2270]
0197:00447F0D REPNE SCASB
0197:00447F0F NOT ECX
0197:00447F11 SUB EDI,ECX
0197:00447F13 MOV EAX,ECX
0197:00447F15 MOV ESI,EDI
0197:00447F17 MOV EDI,EDX
0197:00447F19 LEA EDX,[ESP+19D8]
0197:00447F20 SHR ECX,02
0197:00447F23 REP MOVSD //大量真注册码出现。
0197:00447F25 MOV ECX,EAX
0197:00447F27 AND ECX,BYTE +03
0197:00447F2A REP MOVSB
0197:00447F2C LEA ECX,[ESP+0E]
0197:00447F30 PUSH ECX
0197:00447F31 PUSH EDX
0197:00447F32 CALL 004756D5
0197:00447F37 MOV EDI,[ESP+2B14]
0197:00447F3E ADD ESP,BYTE +08
0197:00447F41 TEST EAX,EAX
0197:00447F43 JZ 00447F8F
0197:00447F45 MOV ESI,EDI
0197:00447F47 MOV DL,[EAX] //真码送DL。
0197:00447F49 MOV BL,[ESI] //假码送BL。
0197:00447F4B MOV CL,DL
0197:00447F4D CMP DL,BL //真假比较。
0197:00447F4F JNZ 00447F6F //如果不为0则出错。
0197:00447F51 TEST CL,CL
0197:00447F53 JZ 00447F6B
0197:00447F55 MOV DL,[EAX+01]
0197:00447F58 MOV BL,[ESI+01]
0197:00447F5B MOV CL,DL
0197:00447F5D CMP DL,BL
0197:00447F5F JNZ 00447F6F
0197:00447F61 ADD EAX,BYTE +02
0197:00447F64 ADD ESI,BYTE +02
0197:00447F67 TEST CL,CL
0197:00447F69 JNZ 00447F47 //循环比较。总共8位注册码。
0197:00447F6B XOR EAX,EAX
0197:00447F6D JMP SHORT 00447F74
0197:00447F6F SBB EAX,EAX
0197:00447F71 SBB EAX,BYTE -01
0197:00447F74 TEST EAX,EAX //EAX=0说明正确。
0197:00447F76 JZ NEAR 00448122 //跳转。
*省去若干*
0197:00448122 POP EDI
0197:00448123 POP ESI
0197:00448124 MOV EAX,01
0197:00448129 POP EBX
0197:0044812A ADD ESP,2AFC
===========================================================================
后记:
这个软件的开发者要求15天后必须注册,根据帮助里面的提示,每个许可需要付only $29.95 USD。没有想到经过跟踪,发现里面那么多
,数以千记的现成的注册码在等待我们使用,真是太慷慨了!!这个软件是用Pecompact 加壳了,我暂时没有脱壳软件,手动脱壳好麻
烦,入口点不好找。干脆硬性跟踪得了。没有想到跟踪过程比较麻烦,后来我偶然查看了一个比较特殊的地址,然后向上翻页,在内存
窗口可以看到大量注册码样的东西,我就下内存断点bpm xxxxxxxx r ,结果真的能够进入核心比较部分,但怎么进去的,我想知道,所
以我试验了多种方法下断点,比如函数Createwindow,Createfile,Readfile,EnableWindow, 消息WM_destroy等,都不好用,根本无
法到达核心部位。最后,我只好试用SetFilePointer函数了,经过3次中断,最后终于来到核心地方,成功找出上面的代码,然后通过
TRW的U命令DUMP出来了。我这里只是说明跟踪方法,想进入这个软件比较核心的确费了周折,尽管都是用明码比较,这个软件费了我不
少时间,但是含金量不大。不过,希望对菜鸟有所启示!!我的失败就是您的经验嘛!!
最后,感谢看雪给予的支持!感谢各位大侠的关照!!!
结论:
用户名随便填,注册码随便给出几个吧:
8JXLZ4K5
X88KX5ZE
CZJEY5AJ
.......
省略1000多个注册码!!!
Qduwg
2006年1月25日晚结稿
[课程]Linux pwn 探索篇!