**********************************
* NICEMC MEDIA PLUGIN FOR WINAMP *
* VERSION 1.8
*
* 08/18/00
*
* http://www.nicemcmedia.com *
**********************************
昨天晚上上网,一不小心,被人攻击了。害得我的天网防火墙非法操作,98系统崩溃。我赶紧换到2000下面,起初还没什么事,我又上网了,但当我下网的时候,系统居然反应奇慢,根本没法忍受。正常关机就失去响应了。我KAO,你TMD有种去干美国佬或日本人啊,在国人面前逞什么能啊。我本来对这种事是很随便的,反正我的机器里面没有什么秘密,随你看,只要不破坏我的系统就行了。唉,为什么总是有这么一些吃饱了撑着没事干的人了??想不通!!
不好意思啊,发了一通牢骚,我实在是太气愤了!下面转入正题。这次破的又是一个winamp的插件,它让winamp发生了质的变化,从单纯的播放声音变到可以播放视频,了不起吧!我很早就在用它了,一直是用从网上找来的注册机注册,这次重装系统后,翻遍整个硬盘也没有找到我当的那个注册机,唉,算了。自己动手,丰衣足食。刚好拿它出气!!
启动winamp,随便找张影碟放了,放一下停下来再放,就可以看到提示你注册的画面了,好,填入用户名:Turkey,注册码:987654321,先别点确定,启动trw,下断:bpx
hmemcpy,F5返回到程序,这时再点击确定,被trw拦下,按10下F12后(11下F12就出现注册码错误的画面了,这里pmodule不好用,会直接回到winamp去),再按N下F10来到这里:
0167:01E02F84 PUSH DWORD 82
0167:01E02F89 PUSH DWORD 01E304D8
0167:01E02F8E PUSH DWORD 03F9
0167:01E02F93 MOV EDX,[EBP+08]
0167:01E02F96 PUSH EDX
0167:01E02F97 CALL `USER32!GetDlgItemTextA`
0167:01E02F9D PUSH BYTE +1E //光标停在这里,看上面的函数,猜它是得到用户名,不用管它
0167:01E02F9F LEA EAX,[EBP-20]
0167:01E02FA2 PUSH EAX
0167:01E02FA3 PUSH DWORD 03FA
0167:01E02FA8 MOV ECX,[EBP+08]
0167:01E02FAB PUSH ECX
0167:01E02FAC CALL `USER32!GetDlgItemTextA`
0167:01E02FB2 LEA EDX,[EBP-20] //上面这个函数就是的到你输入的注册码了,过了这一行d
edx就可看到你输入的注册码
0167:01E02FB5 PUSH EDX //注册码进栈
0167:01E02FB6 CALL `MSVCRT!atoi` //调用一个标准函数,我不知道它是干什么的,我是根据后面的跟踪才猜出它是干什么的,呵呵(我不会编程)
0167:01E02FBB ADD ESP,BYTE +04
0167:01E02FBE MOV [01E304C8],EAX
0167:01E02FC3 MOV EAX,[01E304C8]
0167:01E02FC8 PUSH EAX //假码进栈
0167:01E02FC9 PUSH DWORD 01E304D8 //用户名进栈
0167:01E02FCE CALL 01E010AA //关键call,跟进去
0167:01E02FD3 ADD ESP,BYTE +08
0167:01E02FD6 CMP DWORD [01E30378],BYTE +00 //比较正确与否的标志位
0167:01E02FDD JZ 01E02FF7 //是0你就死翘翘了
0167:01E02FDF PUSH BYTE +00
0167:01E02FE1 PUSH DWORD 01E2C570
0167:01E02FE6 PUSH DWORD 01E2C4FC
0167:01E02FEB MOV ECX,[EBP+08]
0167:01E02FEE PUSH ECX
0167:01E02FEF CALL `USER32!MessageBoxA` //这里秀出注册成功的画面
0167:01E02FF5 JMP SHORT 01E0300D
0167:01E02FF7 PUSH BYTE +00
0167:01E02FF9 PUSH DWORD 01E2C570
0167:01E02FFE PUSH DWORD 01E2C4EC
0167:01E03003 MOV EDX,[EBP+08]
0167:01E03006 PUSH EDX
0167:01E03007 CALL `USER32!MessageBoxA` //这里秀出注册失败的画面
0167:01E0300D PUSH BYTE +00
0167:01E0300F MOV EAX,[EBP+08]
0167:01E03012 PUSH EAX
0167:01E03013 CALL `USER32!EndDialog`
0167:01E03019 MOV EAX,01
0167:01E0301E JMP SHORT 01E03022
0167:01E03020 XOR EAX,EAX
0167:01E03022 POP EDI
0167:01E03023 POP ESI
0167:01E03024 POP EBX
0167:01E03025 MOV ESP,EBP
0167:01E03027 POP EBP
0167:01E03028 RET 10 //这里就返回上一级了
好,废话少说,跟进那个关键call,来到这里:
0167:01E06EA0 PUSH EBP
0167:01E06EA1 MOV EBP,ESP
0167:01E06EA3 SUB ESP,BYTE +48
0167:01E06EA6 PUSH EBX
0167:01E06EA7 PUSH ESI
0167:01E06EA8 PUSH EDI
0167:01E06EA9 MOV DWORD [EBP-08],01620100 //初始化[EBP-08]
0167:01E06EB0 MOV DWORD [EBP-04],00 //初始化[EBP-04]
0167:01E06EB7 JMP SHORT 01E06EC2
0167:01E06EB9 MOV EAX,[EBP-04]
0167:01E06EBC ADD EAX,BYTE +01
0167:01E06EBF MOV [EBP-04],EAX
0167:01E06EC2 MOV ECX,[EBP+08] //用户名送到ECX
0167:01E06EC5 PUSH ECX //ecx进栈
0167:01E06EC6 CALL `MSVCRT!strlen` //取得用户名的长度放到eax
0167:01E06ECB ADD ESP,BYTE +04
0167:01E06ECE CMP [EBP-04],EAX //比较用户名是不是已经取完
0167:01E06ED1 JNC 01E06F14 //已经取完就跳出循环
0167:01E06ED3 MOV EDX,[EBP+08] //用户名位到edx
0167:01E06ED6 ADD EDX,[EBP-04] //[EBP-04]加edx到edx,第一次经过时[EBP-04]为0
0167:01E06ED9 MOVSX EAX,BYTE [EDX] //[EDX]第一位到eax
0167:01E06EDC SUB EAX,BYTE +01 //eax=eax-1
0167:01E06EDF MOV ECX,[EBP+08] //用户名位到ecx
0167:01E06EE2 ADD ECX,[EBP-04] //[EBP-04]加ecx到ecx,第一次经过时[EBP-04]为0
0167:01E06EE5 MOVSX EDX,BYTE [ECX] //[EDX]第一位到edx
0167:01E06EE8 ADD EDX,BYTE +02 //edx=edx+2
0167:01E06EEB IMUL EAX,EDX //eax=eax*edx
0167:01E06EEE MOV ECX,[EBP+08] //用户名位到ecx
0167:01E06EF1 ADD ECX,[EBP-04] //[EBP-04]加ecx到ecx,第一次经过时[EBP-04]为0
0167:01E06EF4 MOVSX EDX,BYTE [ECX] //[EDX]第一位到edx
0167:01E06EF7 ADD EDX,BYTE +05 //edx=edx+5
0167:01E06EFA IMUL EAX,EDX //eax=eax*edx
0167:01E06EFD IMUL EAX,EAX,BYTE +09 //eax=eax*9
0167:01E06F00 MOV ECX,[EBP-08] //用户名位到ecx
0167:01E06F03 LEA EDX,[ECX+EAX-0E] //edx=ecx+eax-E
0167:01E06F07 MOV [EBP-08],EDX //edx到[ebp-08]
0167:01E06F0A CMP DWORD [EBP-04],BYTE +0C //比较用户名是不是大于等于c
0167:01E06F0E JNZ 01E06F12 //小于则跳走,继续循环
0167:01E06F10 JMP SHORT 01E06F14
0167:01E06F12 JMP SHORT 01E06EB9 //往上跳,循环
0167:01E06F14 MOV EAX,[EBP-08] //[ebp-08]到eax,[ebp-08]是根据用户名算来的值
0167:01E06F17 CMP EAX,[EBP+0C] //比较[ebp-0c]和eax是否相等,此时看到[ebp-0c]中的值为3ade98b1,这是个什么东东啊,肯定是前面程序调用那个标准函数得来的。既然是个标准函数,那就有的猜了,呵呵,我运气好,一猜就中,它是987654321的16进制数(明天赶快去买彩票)。
0167:01E06F1A JNZ 01E06F26 //跳走你就玩完了,不能跳啊
0167:01E06F1C MOV DWORD [01E30378],01 //给标志位付值
0167:01E06F26 POP EDI
0167:01E06F27 POP ESI
0167:01E06F28 POP EBX
0167:01E06F29 MOV ESP,EBP
0167:01E06F2B POP EBP
0167:01E06F2C RET //这里就回上一级了
总结它的算法,设注册码为Z,从高到低位为Z1,Z2。。。。Zn为了方便,暂拿我的用户名--Turkey作例子,则作下列计算:
Z1=(T-1)*(T+2)*(T+5)*9+T-E
Z2=(u-1)*(u+2)*(u+5)*9+u-E
Z3=(r-1)*(r+2)*(r+5)*9+r-E
Z4=(k-1)*(k+2)*(k+5)*9+k-E
Z5=(e-1)*(e+2)*(e+5)*9+e-E
Z6=(y-1)*(y+2)*(y+5)*9+y-E
最后将Z转换成10进制的数,就是你的注册码了。
总结一下:
用户名:Turkey
注册码:96323386
就这么简单,哈哈,怎么样,你也试试吧,再说一点废话:
将HK_C_U\SOFTWARE\NiceMC\Media Plugin下的username的值改动一下就又可以注册了。我没有找到它存放注册码的地方,如果你知道的话,还烦请告诉小弟我一声,谢谢!!!
转载请保持其完整性!
Cracker:Turkey/灭害灵
2002.1.4@22:28
- 标 题:搞了个超级简单的正好出出气,呵呵,不知道分析有错误没有!! (6千字)
- 作 者:Turkey2001
- 时 间:2002-1-4 23:12:25
- 链 接:http://bbs.pediy.com