• 标 题:搞了个超级简单的正好出出气,呵呵,不知道分析有错误没有!! (6千字)
  • 作 者:Turkey2001
  • 时 间:2002-1-4 23:12:25
  • 链 接:http://bbs.pediy.com

**********************************
* 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