【文章标题】: SpywareStormer1.4.0.7的注册过程(入门级)
【文章作者】: thinkSJ
【作者邮箱】: thinkersj@163.com
【作者主页】: meiyou
【软件名称】: SpywareStormer
【软件大小】: 908KB
【下载地址】: 附件
【编写语言】: Microsoft Visual Basic 5.0 / 6.0
【使用工具】: OD1.1
【操作平台】: WIN2K SP4
【作者声明】: 不妥之处,敬请指正
--------------------------------------------------------------------------------
【详细过程】
    今天上午在上网时,我的浏览器突然"热情"地向我推荐一个软件,说它可以扫出系统中的间谍软件以及其它的一些垃圾,
  于是就试用了一下,感觉良好,但它在退出的时候需要注册。真烦!看来只能按原规办事了.....
  
  1:收集信息
  
    它的右上角有一个Register按钮,点它后来到注册页面,上面有一段对于我们并不重要的内容,除此之外还有用于输入
  Order Number和Activation Key的地方。好的,在此我们分别输入456987 和7899 4566 1233 6544,然后点Activate按钮
  ,就会弹出一个对话框说"Your registration information is incorrect,Please re-enter.",先将它记下来吧,关掉
  它之后用PEID查一下,信息为:Microsoft Visual Basic 5.0 / 6.0 表明没有壳,那就好办多了。
  
  2:正文
  
  用OD载入,我们断在这里:
    00404CC4 > $  68 606D4000                push SS.00406D60       ;停在这里
    00404CC9   .  E8 F0FFFFFF                call <jmp.&MSVBVM60.#100>
    00404CCE   .  0000                       add byte ptr ds:[eax],al
    00404CD0   .  60                         pushad
  由于刚才有提示框出现,所以先看一下有没有这样的函数:
    在CPU窗口中点右键,选查找---->所有模块间的调用,然后点击窗口主方的目标文件,就可以在窗口中寻找.......
  不一会儿就看到函数:rtcMsgBox,就是这个了,右键---->在每次调用到rtcMsgBox上设置断点。然后返回CPU窗口F9运行
  注册,再把刚才的信息输入一遍,点击后断在这里:
    004DB813   .  C745 80 0A000000           mov dword ptr ss:[ebp-80],0A
    004DB81A   .  C785 58FFFFFF AC2F4100     mov dword ptr ss:[ebp-A8],SS.00412FAC    ;  UNICODE "Your registration information is incorrect. Please re-enter."
    004DB824   .  C785 50FFFFFF 08000000     mov dword ptr ss:[ebp-B0],8
    004DB82E   .  8D95 50FFFFFF              lea edx,dword ptr ss:[ebp-B0]
    004DB834   .  8D4D 90                    lea ecx,dword ptr ss:[ebp-70]
    004DB837   .  FF15 54124000              call dword ptr ds:[<&MSVBVM60.__vbaVarDu>;  MSVBVM60.__vbaVarDup
    004DB83D   .  8D8D 60FFFFFF              lea ecx,dword ptr ss:[ebp-A0]
    004DB843   .  51                         push ecx
    004DB844   .  8D95 70FFFFFF              lea edx,dword ptr ss:[ebp-90]
    004DB84A   .  52                         push edx
    004DB84B   .  8D45 80                    lea eax,dword ptr ss:[ebp-80]
    004DB84E   .  50                         push eax
    004DB84F   .  6A 10                      push 10
    004DB851   .  8D4D 90                    lea ecx,dword ptr ss:[ebp-70]
    004DB854   .  51                         push ecx
    004DB855   .  FF15 AC104000              call dword ptr ds:[<&MSVBVM60.#595>]     ;  确定后断在这里
  
  如果在004DB855处F9就有出错信息了。好的那就往上分析吧,会来到这里:
    004DB387   .  85D2                       test edx,edx
    004DB389   .  74 0D                      je short SS.004DB398
    004DB38B   .  C745 FC 10000000           mov dword ptr ss:[ebp-4],10
    004DB392   .  66:C745 D4 0000            mov word ptr ss:[ebp-2C],0
    004DB398   >  C745 FC 12000000           mov dword ptr ss:[ebp-4],12
    004DB39F   .  FF15 C0104000              call dword ptr ds:[<&MSVBVM60.#598>]     ;  MSVBVM60.rtcDoEvents
    004DB3A5   .  C745 FC 13000000           mov dword ptr ss:[ebp-4],13
    004DB3AC   .^ E9 59FEFFFF                jmp SS.004DB20A
    004DB3B1   >  C745 FC 14000000           mov dword ptr ss:[ebp-4],14
    004DB3B8   .  66:837D D4 FF              cmp word ptr ss:[ebp-2C],0FFFF
    004DB3BD   .  0F85 88020000              jnz SS.004DB64B                          ;  将此处改为je
    004DB3C3   .  C745 FC 15000000           mov dword ptr ss:[ebp-4],15
    004DB3CA   .  C785 68FFFFFF 04000280     mov dword ptr ss:[ebp-98],80020004
  此时将004DB3BD处的跳转改掉就可以暴破了,但在下次启动时它还会要求注册。所以要彻底解决它,再向上找,就会看到:
    004DAC1D   .  C785 58FFFFFF 444D4100     mov dword ptr ss:[ebp-A8],SS.0>;  UNICODE "Please enter your order number and activation key exactly as it appeared when you purchased Spyware "
  
  很明显的只有当注册信息不完整时,才会弹出此内容,所以注册码的算法是在这之后完的。
  我在这里下了断点:
    004DAC84   > \C745 FC 07000000           mov dword ptr ss:[ebp-4],7         ;  在这里下断
    004DAC8B   .  66:C785 F0FEFFFF 0300      mov word ptr ss:[ebp-110],3
    004DAC94   .  66:C785 F4FEFFFF 0100      mov word ptr ss:[ebp-10C],1
    004DAC9D   .  66:C745 DC 0000            mov word ptr ss:[ebp-24],0
    004DACA3   .  EB 15                      jmp short SS.004DACBA
    004DACA5   > /66:8B55 DC                 mov dx,word ptr ss:[ebp-24]
    004DACA9   . |66:0395 F4FEFFFF           add dx,word ptr ss:[ebp-10C]
    004DACB0   . |0F80 680C0000              jo SS.004DB91E
    004DACB6   . |66:8955 DC                 mov word ptr ss:[ebp-24],dx
    004DACBA   > |66:8B45 DC                 mov ax,word ptr ss:[ebp-24]
    004DACBE   . |66:3B85 F0FEFFFF           cmp ax,word ptr ss:[ebp-110]
    004DACC5   . |0F8F 3B020000              jg SS.004DAF06                     ;  如计算完则跳出循环
  然后重新加载程序,并重复注册过程就会断在004DAC84处。
  
  经分析从004DAF01到004DACA5是一个大的循环,分四次将我们输入的假KEY转换并保存,跳出这个循环后一路F8,不一会就
  不到这里:
    004DAF95   .  8985 B0FEFFFF              mov dword ptr ss:[ebp-150],eax
    004DAF9B   .  EB 0A                      jmp short SS.004DAFA7
    004DAF9D   >  C785 B0FEFFFF 00000000     mov dword ptr ss:[ebp-150],0
    004DAFA7   >  8B55 B4                    mov edx,dword ptr ss:[ebp-4C]      ;  指向order number:465987
    004DAFAA   .  8995 CCFEFFFF              mov dword ptr ss:[ebp-134],edx     ;  保存指针
    004DAFB0   .  C745 B4 00000000           mov dword ptr ss:[ebp-4C],0        ;  清空
    004DAFB7   .  8B85 CCFEFFFF              mov eax,dword ptr ss:[ebp-134]
    004DAFBD   .  8945 98                    mov dword ptr ss:[ebp-68],eax
    004DAFC0   .  C745 90 08000000           mov dword ptr ss:[ebp-70],8
    004DAFC7   .  8D4D 90                    lea ecx,dword ptr ss:[ebp-70]
    004DAFCA   .  51                         push ecx 
    004DAFCB   .  8D55 80                    lea edx,dword ptr ss:[ebp-80]
    004DAFCE   .  52                         push edx
    004DAFCF   .  FF15 08114000              call dword ptr ds:[<&MSVBVM60.#528>;  MSVBVM60.rtcUpperCaseVar
  在这之后就开始计算OrderNumber了,又是一路F8来到:
  
    004DB0F8   .  8D4D B0                    lea ecx,dword ptr ss:[ebp-50]
    004DB0FB   .  FF15 0C124000              call dword ptr ds:[<&MSVBVM60.__vb>;  MSVBVM60.__vbaStrCopy
    004DB101   .  8B45 B4                    mov eax,dword ptr ss:[ebp-4C]      ;  指向order number:465987
    004DB104   .  8985 C8FEFFFF              mov dword ptr ss:[ebp-138],eax     ;  保存指针
    004DB10A   .  C745 B4 00000000           mov dword ptr ss:[ebp-4C],0        ;  指针清空
    004DB111   .  8B8D C8FEFFFF              mov ecx,dword ptr ss:[ebp-138]
    004DB117   .  894D 98                    mov dword ptr ss:[ebp-68],ecx
    004DB11A   .  C745 90 08000000           mov dword ptr ss:[ebp-70],8
    004DB121   .  8D95 1CFFFFFF              lea edx,dword ptr ss:[ebp-E4]
    004DB127   .  52                         push edx
    004DB128   .  8D45 B0                    lea eax,dword ptr ss:[ebp-50]
    004DB12B   .  50                         push eax
    004DB12C   .  8D4D 90                    lea ecx,dword ptr ss:[ebp-70]
    004DB12F   .  51                         push ecx
    004DB130   .  E8 DBDBFFFF                call SS.004D8D10                   ;  关键CALL
    004DB135   .  8BD0                       mov edx,eax
    004DB137   ?  8D4D D8                    lea ecx,dword ptr ss:[ebp-28]
    004DB13A   >  FF15 84124000              call dword ptr ds:[<&MSVBVM60.__vb>;  MSVBVM60.__vbaStrMove
    004DB140   .  8D4D B0                    lea ecx,dword ptr ss:[ebp-50]
    004DB143   .  FF15 C8124000              call dword ptr ds:[<&MSVBVM60.__vb>;  MSVBVM60.__vbaFreeStr
    004DB149   .  8D4D AC                    lea ecx,dword ptr ss:[ebp-54]
    004DB14C   .  FF15 CC124000              call dword ptr ds:[<&MSVBVM60.__vb>;  MSVBVM60.__vbaFreeObj
    004DB152   .  8D4D 90                    lea ecx,dword ptr ss:[ebp-70]
    004DB155   .  FF15 20104000              call dword ptr ds:[<&MSVBVM60.__vb>;  MSVBVM60.__vbaFreeVar
    004DB15B   .  C745 FC 0C000000           mov dword ptr ss:[ebp-4],0C
    004DB162   .  BA 641A4100                mov edx,SS.00411A64
    004DB167   .  8D4D B4                    lea ecx,dword ptr ss:[ebp-4C]
    004DB16A   .  FF15 0C124000              call dword ptr ds:[<&MSVBVM60.__vb>;  MSVBVM60.__vbaStrCopy
    004DB170   .  8D55 BC                    lea edx,dword ptr ss:[ebp-44]
  
  注意到004DB130处的CALL了吗?这就是算法了,但我没有跟进去,是从它的返回值看出的,此时为:
    eax=0018C8DC, (UNICODE "1719-1216-FC1A-1A1A")
    edx=0013A5A8
  
  竟然是明文的!!试一下吧,真的成功了!
  但任务还没有结束,我准备DIY一下让它在输入OrderNumber之后会弹出正确的注册码。
  上面代码的004DB13A处的CALL是将KEY转移到bep-28处,这个地址是动态的,每一次都不一样。所以要从这里开始将KEY的
  地址保存起来,以便以后显示。
  先从代码中找一段不用的地方写上我们自己的代码,我找的在004E0C95处,所以要将004DB135处的指令改为jmp 004E0C95
  
  004DB12F   .  51                         push ecx
  004DB130   .  E8 DBDBFFFF                call SS.004D8D10                      ;  关键CALL,是算法
  004DB135      E9 5B5B0000                jmp SS.004E0C95                       ;  改过之后
  004DB13A   .  FF15 84124000              call dword ptr ds:[<&MSVBVM60.__vbaSt>;  MSVBVM60.__vbaStrMove
  
  要记得保存原先的两条指令。来到004E0C95处,写上如下代码:
    004E0C95      50                         push eax
    004E0C96      8F05 FCFF1200              pop dword ptr ds:[12FFFC]             ;  保存到12FFFC处
    004E0C9C      8BD0                       mov edx,eax
    004E0C9E      8D4D D8                    lea ecx,dword ptr ss:[ebp-28]
    004E0CA1    ^ E9 94A4FFFF                jmp SS.004DB13A
  为什么要保存到0012FFFC处呢?我找了很久,发现只有这个地方不会被以后的代码覆盖,最合适不过了,在数据窗口中它是
  最后的四个字节。
  
  改完后再一路F8,会看到如下的地方:
    004DB7DD   .  C745 FC 1E000000           mov dword ptr ss:[ebp-4],1E
    004DB7E4   .  C785 68FFFFFF 04000280     mov dword ptr ss:[ebp-98],80020004
    004DB7EE   .  C785 60FFFFFF 0A000000     mov dword ptr ss:[ebp-A0],0A
    004DB7F8   .  C785 78FFFFFF 04000280     mov dword ptr ss:[ebp-88],80020004
    004DB802   .  C785 70FFFFFF 0A000000     mov dword ptr ss:[ebp-90],0A
    004DB80C   .  C745 88 04000280           mov dword ptr ss:[ebp-78],80020004
    004DB813   .  C745 80 0A000000           mov dword ptr ss:[ebp-80],0A
    004DB81A   .  C785 58FFFFFF AC2F4100     mov dword ptr ss:[ebp-A8],SS.00412FAC      ;  UNICODE "Your registration information is incorrect. Please re-enter."
    004DB824   .  C785 50FFFFFF 08000000     mov dword ptr ss:[ebp-B0],8
    004DB82E   .  8D95 50FFFFFF              lea edx,dword ptr ss:[ebp-B0]
    004DB834   .  8D4D 90                    lea ecx,dword ptr ss:[ebp-70]
    004DB837   .  FF15 54124000              call dword ptr ds:[<&MSVBVM60.__vbaVarDup>>;  MSVBVM60.__vbaVarDup
    004DB83D   .  8D8D 60FFFFFF              lea ecx,dword ptr ss:[ebp-A0]
    004DB843   .  51                         push ecx
    004DB844   .  8D95 70FFFFFF              lea edx,dword ptr ss:[ebp-90]
    004DB84A   .  52                         push edx
    004DB84B   .  8D45 80                    lea eax,dword ptr ss:[ebp-80]
    004DB84E   .  50                         push eax
    004DB84F   .  6A 10                      push 10
    004DB851   .  8D4D 90                    lea ecx,dword ptr ss:[ebp-70]
    004DB854   .  51                         push ecx
    004DB855   .  FF15 AC104000              call dword ptr ds:[<&MSVBVM60.#595>]       ;  确定后断在这里
    004DB85B   .  8D95 60FFFFFF              lea edx,dword ptr ss:[ebp-A0]
  这就是我们一开始中断的地方,已经快完成了。
  现在004DB81A处是将错误信息送入ebp-A8处,只要将它改为往ebp-A8放入刚才保存的KEY的地址就行了。好的动手吧,先将
  004DB81A处改为jmp 004E0CAC,改过之后有点乱,按CTRL+A就OD分析一下,如下:
  
    004DB81A   . /E9 8D540000                jmp SS.004E0CAC                            ;  改过之后
    004DB81F     |FF                         db FF
    004DB820     |AC2F4100                   dd SS.00412FAC                             ;  UNICODE "Your registration information is incorrect. Please re-enter."
    004DB824   . |C785 50FFFFFF 08000000     mov dword ptr ss:[ebp-B0],8
    004DB82E   . |8D95 50FFFFFF              lea edx,dword ptr ss:[ebp-B0]
  
  只要让我们的代码跳回004DB824处就可以了。来到004E0CAC写入代码:
    004E0CAC      FF35 FCFF1200              push dword ptr ds:[12FFFC]
    004E0CB2      8F85 58FFFFFF              pop dword ptr ss:[ebp-A8]                  ;  注意应写为:pop [ebp-0a8]
    004E0CB8    ^ E9 67ABFFFF                jmp SS.004DB824
  唯一要注意的就是pop 指令的写法,应写为:pop [ebp-0a8]否则会无法写入。
  至此所有工作已经完成了,在CPU窗口中点右键--->复制到可执行文件--->所以修改--->全部复制--->右键--->保存文件
  填上一个文件名,保存为EXE文件就可以了。
  
  试一下,只需要在OrderNumber中输入字符,点Activate按钮就会弹出正确的注册码了,注册完之后Register按钮就消失了。
  
  如果想写出注册机的话,应该要进入 004DB130 处的CALL中分析。
  
  全文完!
  
--------------------------------------------------------------------------------
【经验总结】
  第一次写文章,希望大家能看得懂,如有疑问,可以发邮件给我!
  
--------------------------------------------------------------------------------
【版权声明】: 欢迎转载,但请保留完整信息,谢谢!

                                                       2006年04月15日 下午 10:26:24