密码监听器注册算法解析[网络技术]
本文“密码监听器注册算法解析[网络技术]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
本篇文章源自《黑客防线》2007年10月刊
转载请注明版权
文/图 落叶树
===================================
Pswmonitor 3.0是一款用于监听网页密码的软件,只需在一台电脑上运行,便可以监听局域网内肆意一台电脑登录的账号和密码,并将密码显示、保存,或发送到用户指定的邮箱.开辟者很诚恳,未注册版本除了监听到的最后一位密码显示为"?"外没做什么限制,固然如此,但是每次都要穷举几十次最后一位也是很麻烦的,贫民自有穷办法,着手吧.
用PEiD侦测显示软件为ASPACK加壳,用PEiD自带的通用脱壳插件脱掉便可,如图1所示.通用脱壳插件利用很简单,先侦测OEP,再点unpack便可以了,普通大大都壳都能脱掉.这里我们需求重建一下导入表,再用PEiD看看脱壳后的文件,显示用Microsoft Visual C++ 6.0编写,运行,正常.OK,脱壳的工作就完成了.
图1
解析前我们需求获得一些相关信息.运行软件,即刻出来的就是注册界面,随便输入一些东西点"肯定",关键的东西出来了:"注册失利!".除了这个重要信息外,我们还可以发现用户名输入的字母只会显示大写,而注册码只能输入数字,这在我们的破解历程中应当有效,先记下来.
用OllyDBG载入软件,点击"右键搜索搜索全部参考文本字符串",大概看了一下没什么发现,持续用超级字符串查找插件(Ultra String Reference)搜索ASCII字符,这次找到了,如图2所示.这里有三处"注册失利!"字符串,有一处"您成功注册!"字符串,我们该怎么挑选呢?普通来说都是选失利的,为什么呢?略微想想就知道了,我们看到的是"注册失利"啊,这也恰是我们要中止的,假如随便输入都能出来个"您成功注册!",那我倡议您去买彩票,^_^.
图2
问题是我们要怎么下断点呢?很简单,有时笨办法未必不是好办法,我们全部下断,然后渐渐试.后果软件显示"注册失利"时断在了004104D1处,往上一瞧,发现偏移地址004104C4是从0041032D跳过来的,我们前往那边看看吧.呵呵,0041032A处是一个对比,看来是这里了,那么我们怎么找这段判断注册码的代码开始处呢?用RETN规律一路往上,直到发现第一个RETN,它下面004100F0处有对esp的操作,我们就在这里下断吧.所谓RETN规律就是汇编代码中每段子程序的完毕处都要用ret指令返回上层调用,而每段子程序的开始普通都是push ebp、mov ebp,esp、sub ebp,n或sub esp,n或add ebp,-n这类仓库操作,所以我们判断这是注册算法代码的开始处.下断后按Ctrl+F2重新运行,输入用户名注册码,肯定后公然中止在这里,万事开首难,我们已经开好头了,接下来就是渐渐解析咯.一路F8,下面的解析省去了机械码.
00410147 call <jmp.&MFC42.#6282>
;取用户名到eax
0041014C lea ecx,dword ptr ss:[ebp-10]
0041014F call <jmp.&MFC42.#6283>
;取注册码到eax
00410154 mov eax,dword ptr ss:[ebp-14]
00410157 cmp dword ptr ds:[eax-8],edi
0041015A je pswmonit.004104DD
00410160 mov eax,dword ptr ss:[ebp-10]
00410163 cmp dword ptr ds:[eax-8],edi
00410166 je pswmonit.004104DD
;这两个对比用户名和密码能否为空,为空显示注册失利
0041016C lea eax,dword ptr ss:[ebp-2C]
0041016F push 2
00410171 push eax
00410172 lea ecx,dword ptr ss:[ebp-10]
00410175 call <jmp.&MFC42.#4129>
;取注册码前两位
0041017A mov eax,dword ptr ds:[eax]
0041017C mov esi,dword ptr ds:[<&msvcrt._mbscmp>]
00410182 push pswmonit.00419A0C
00410187 push eax
00410188 call esi
0041018A pop ecx
0041018B pop ecx
0041018C test eax,eax
0041018E lea ecx,dword ptr ss:[ebp-2C]
00410191 setne bl
00410194 call <jmp.&MFC42.#800>
00410199 test bl,bl
0041019B je short pswmonit.004101A8
;假如注册码前两位不等于30则失利
从这里可以得知注册码的前两位,重新来一遍吧.输入新的30xxxx注册码后接着上面的历程,我们来到下面的代码处.
004101D2 call <jmp.&MFC42.#4202>
;用户名转成小写
004101D7 xor ebx,ebx
004101D9 cmp dword ptr ds:[41CC10],edi
004101DF jle short pswmonit.00410220
004101EB call pswmonit.00407196
004101F0 lea ecx,dword ptr ss:[ebp-24]
004101F3 mov byte ptr ss:[ebp-4],3
004101F7 call <jmp.&MFC42.#4202>
004101FC push dword ptr ss:[ebp-14]
004101FF lea ecx,dword ptr ss:[ebp-24]
00410202 call <jmp.&MFC42.#2764>
00410207 test eax,eax
00410209 jge short pswmonit.0041026F
0041020B lea ecx,dword ptr ss:[ebp-24]
0041020E mov byte ptr ss:[ebp-4],1
00410212 call <jmp.&MFC42.#800>
00410217 inc ebx
00410218 cmp ebx,dword ptr ds:[41CC10]
; 取黑名单用户名举行对比
0041021E jl short pswmonit.004101E1
这段对比好玩,假如你输入的用户名和黑名单里的相同就注册失利,十多个名字中有很多大家都熟习的.通过了黑名单的磨练后,持续F8往下走.
004102AE mov ebx,pswmonit.00419A00
;ASCII "whm_w"
004102B3 lea ecx,dword ptr ss:[ebp-14]
004102B6 push ebx
004102B7 call <jmp.&MFC42.#941>
;用户名衔接固定字符串whm_w
004102BC mov eax,dword ptr ss:[ebp-14]
这里呈现了一串固定字符,衔接到我们输入的用户名,有什么作用呢?还是往下看.
004102CB movsx esi,byte ptr ds:[ecx+eax]
004102CF add dword ptr ss:[ebp-24],esi
;用户名每个字符的ASCII值相加.
004102D2 inc ecx
004102D3 cmp ecx,edx
004102D5 jl short pswmonit.004102CB
本来是将用户名ASCII码求一个值放到[esp-24]里,这个值我们假定为SUM,接下来可以说是算法核心了.
004102D7 xor edi,edi ;清空EDI
004102D9 mov eax,dword ptr ss:[ebp-10]
;取除开首30的剩余注册码
004102DC lea ecx,dword ptr ss:[ebp-10]
004102DF mov eax,dword ptr ds:[eax-8]
;剩余注册码长度
004102E2 add eax,-2 ;长度减掉2
004102E5 push eax
004102E6 lea eax,dword ptr ss:[ebp-2C]
004102E9 push edi
004102EA push eax
004102EB call <jmp.&MFC42.#4278>
;得到除去最后两位后的注册码
004102F0 push dword ptr ds:[eax]
004102F2 mov esi,dword ptr ds:[<&msvcrt.atol>]
004102F8 call esi
;atol函数把字符转成数值
004102FA pop ecx
004102FB mov edi,eax ;数值放到EDI
004102FD lea ecx,dword ptr ss:[ebp-2C]
00410300 call <jmp.&MFC42.#800>
00410305 lea eax,dword ptr ss:[ebp-2C]
00410308 push 2
0041030A push eax
0041030B lea ecx,dword ptr ss:[ebp-10]
0041030E call <jmp.&MFC42.#5710>
;取最后两位注册码
00410313 push dword ptr ds:[eax]
00410315 call dword ptr ds:[<&msvcrt.atoi>]
;atoi函数转换
0041031B pop ecx
0041031C mov dword ptr ss:[ebp-28],eax
0041031F lea ecx,dword ptr ss:[ebp-2C]
00410322 call <jmp.&MFC42.#800>
00410327 xor edi,dword ptr ss:[ebp-28]
;EDI与注册码最后两位举行异或
0041032A cmp dword ptr ss:[ebp-24],edi
;SUM与EDI对比
0041032D jnz pswmonit.004104C4
;不相等则跳向失利.
关键的地方解析完了,背面的代码大约作用是注册成功后将注册码举行一定的变更,然后写入到Option.ini文件中,所以想在0041032D处搞爆破的要注意了,呵呵.想反复实行可以把Option.ini里的REGINFO段内容删掉便可.
这算法真的很简单,简单到连我都有点不敢相信是这种功效蛮不错的软件所利用的.下面我们用C语言写一个注册机.
/*TC 2.0下调试通过*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
main()
{
char username[35];
int AscSum=0,b,c,i;
printf("http://blog.csdn.net/hkbyest\n");
printf("CODE BY 落叶树 2007-09-06\n\n");
printf("请输入用户名:");
gets(username);
strcat(username,"whm_w");
//衔接用户名和固定字符串
for(i=0;i<strlen(username);i++)
{
username[i] = tolower(username[i]);
//新用户名字符串转成小写
AscSum+=username[i];
//趁便求字符串的ASCII SUM值
}
randomize();
while(1)
{
c=random(100);
if(c>=10 && c<=99) break;
}//产生注册码的最后两位,这里用随机值,大家用固定的也行
b=AscSum ^ c;
//XOR的逆运算,哈哈.EDI啊EDI.
printf("注册码为:");
printf("%d",30); //注册码开首两位固定为30
printf("%d",b);
printf("%d\n\n",c);
}
本来我不想写注册机的,只是后来我找了2.8版本的软件调试,后果发现只有注册码开首的30变成了28,一气之下……要知道,程序逆向并不平等"盗版",有矛才有盾,有攻才会有防嘛
本文引用地址: | 与您的QQ/MSN好友分享! |
以上是“密码监听器注册算法解析[网络技术]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |