【文章标题】: 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
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课