Tag Archives: 软件配置管理

[转载]vss密码破解

0
Digg me

今天一个同事来找我,说VSS的ADMIN口令给忘记了。项目组的源代码管理不了。我拿VSS的程序反汇编一看,天啊,VSS的认证过程莫道不消魂真是老土,当然对于具有本地管理员权限的人只需要覆盖掉dateum.dat文件就可以更改口令。而且VSS本身是靠文件共享的,安全性极差,不过如果不知道其口令,其文件的组织还是比较麻烦的,如果知道了口令的话,就容易处理的多。所以我这篇帖子都不好意思当文章提交的,其实这篇文章重点不是讲如何获取VSS的口令,而是讲一下算法破解的思路。

VSS的口令认证过程是这样的,从DATE目录下的UM文件读取口令加密字串,而这个文件是任何可以共享VSS目录的人都可以看见的,一般而言这个目录都会设置比较低级别的共享。VSS的加密口令实际上是一个2位的散列:格式如下:
55 55 FF D2 41 64 6D 69-6E 00 00 00 00 00 00 00   UU..Admin.......
00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
00 00 00 00 1A 69 00 00-A8 01 00 00 00 00 00 00   .....i..........
00 00 00 00 00 00 00 00-00 00 00 00 38 00 00 00   ............8...
55 55 90 80 47 75 65 73-74 00 00 00 00 00 00 00   UU..Guest.......
00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
00 00 00 00 55 69 00 00-3C 02 00 00 00 00 00 00   ....Ui..<.......
00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
其中1A 69就是ADMIN的散列
而  55 69就是GUEST的散列

跟踪一下VSS的算法可以得出如下的加密算法,另外在加密之前,串入的口令会先转化成大写格式的。

void envsspasswd(char * passwd,char * enpasswd,int len)
{
const char incstr[15]="BrianDavidHarry";
char passwd1[200];
int i;
WORD a;
WORD b;
if(len>15)
return 0;
memcpy(passwd1,passwd,len);
memcpy(passwd1+len,incstr,15-len);
passwd1[15]=0;
len = 15;
b = 0;
a = 0;
for(i=0;i<LEN;I++)
{
a =  passwd1[i];
a = a ^ 0x96;
a = a*(i+1);
b += a;
}
printf("%02x",b);
}

OK,其实我们讲到这里,关于VSS的口令破解就一点意义也没有了,而是在一个思路上,从上面可以看到,其口令只具2位长度,因此肯定存在很多散列一致的口令,因此无需真正找到口令,只需要找到一个具备同样散列的口令就可以了。
当然,如果只是暴力跑的话,效果会比较差的,因为上面这个算法会导致相同位数的散列是比较靠近的,不同位数的散类差距比较大,如果不知道口令的位数,一位的穷局举的话效果并不会很理想。那么如何来确定密码的位数呢?实际根据上面的加密算法我们可以知道其密码散列递增的规律,下面的实现就是根据这个算法可以最优先的找到密码位数,然后在位数以内进行穷举的实现,使得计算的速度非常高:
关键点在于这句:
d = a - b;
if((d/num)>154 && (d/num)<250)
因为我们知道,x^80肯定是会大于128的,对于‘0’到‘Z’的可能口令组合,最小生成的都应该大于154。从而判断这个长度是否可能存在可能的解。

int devsspasswd(char enp[4],char * dnp)
{
const char incstr[15]="BrianDavidHarry";
int i;
int j;
int k;
long c1;
long c2;
long c4;
int c3;

WORD a;
WORD b;
WORD c;
WORD d;
WORD e;
int num;

a = hextoint(enp[2])*16*16*16+hextoint(enp[3])*16*16+hextoint(enp[0])*16+hextoint(enp[1]);
c3 = 'Z'-'0'+1;

for(i=0;i<15;i++)
{
dnp[i]=0;
b =0;
for(j=0;j<15-i;j++)
{
c = incstr[j];
c = c ^ 0x96;
c = c*(j+1+i);
b += c;
}
if(i==0 && b==a)
{
printf("password is nulln");
return 0;
}
d = a - b;
num = 0;
c2 = 1;
for(j=0;j<I;J++)
{
num = num+j+1;
c2 = c3*c2;
}
if(num>0)
{
c1 = 0;
if((d/num)>154 && (d/num)<250)
{
memset(dnp,'0',i);
Sleep(100);
do{
c4 = 1;
for(j=1;j<I-1;J++)
{
c4 = c4 * c3;
if(c1%c4==0)
dnp[j]='0';
else
{
dnp[j]++;
break;
}
}
b = 0;
for(k=1;k<I;K++)
{
c = dnp[k];
c = c ^ 0x96;
c = c*(k+1);
b += c;
}
e=d-b;

if((e^0x96)>='0' && (e^0x96)<='Z')
{
dnp[0]=(e^0x96);
printf("%sn",dnp);
return i;
}
c1++;
}while(c1<C2);????????????????
}
}
}
return 0;
}

当然,这个算法对VSS口令破解本身意义不大,拥有um.dat写权限的直接拷贝别人的知道口令的um.dat文件覆盖就可以,或者修改其中的散列,不知道的呢,也可以直接通过共享拷贝数据文件再使用um.dat覆盖或者在vss程序中饶过口令达到图破权限,写这点东西是重点强调一下破解算法的思路

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=45114

Posted in 软件配置管理 | Tagged , | Leave a comment

Subversion备份

0
Digg me

作者:Rock Sun, Subversion中文站。如有转发请注明出处:http://www.subversion.org.cn/index.php?option=com_content&task=view&id=85&Itemid=9
版本控制最关键的一件事是保证数据的安全性,不能因为磁盘损坏,程序故障造成版本库无可挽回的错误,为此必须制定较完备的备份策略。在Subversion中,我们有三种备份方式:完全备份,增量备份和同步版本库。
1, 完全备份
最常见和简单的备份就是直接使用拷贝命令,将版本库目录拷贝到备份目录上,就可以了。但是这样不是很安全的方式,因为如果在拷贝时版本库发生变化,将会造成备份的结果不够准确,失去备份的作用,为此Subversion提供了“svnadmin hotcopy”命令,可以防止这种问题。
还记得我们的版本库目录吗?

D:SVNROOT├─project1│  ├─conf│  ├─dav│  ├─db│  │  ├─revprops│  │  ├─revs│  │  └─transactions│  ├─hooks│  └─locks└─project2    ├─conf    ├─dav    ├─db    │  ├─revprops    │  ├─revs    │  └─transactions    ├─hooks    └─locks   
如果要把project1备份到d:svnrootbak目录下,只需要运行:

svnadmin hotcopy d:svnrootproject1 d:svnrootbakproject1
但是我们作为配置管理员,必须想办法优化这个过程,如果我们这个目录下有许多版本库,需要为每个版本库写这样一条语句备份,为此我写了下面的脚本,实现备份一个目录下的所有版本库。我们在D:SVNROOT下创建了两个文件,simpleBackup.bat:

@echo 正在备份版本库%1......@%SVN_HOME%binsvnadmin hotcopy %1 %BACKUP_DIRECTORY%%2@echo 版本库%1成功备份到了%2!
这个文件仅仅是对“svnadmin hotcopy”的包装,然后是backup.bat:

echo off
rem Subversion的安装目录set SVN_HOME="D:Subversion"
rem 所有版本库的父目录set SVN_ROOT=D:svnroot
rem 备份的目录set BACKUP_SVN_ROOT=D:svnrootbak
set BACKUP_DIRECTORY=%BACKUP_SVN_ROOT%%date:~0,10%if exist %BACKUP_DIRECTORY% goto checkBackecho 建立备份目录%BACKUP_DIRECTORY%>>%SVN_ROOT%/backup.log
mkdir %BACKUP_DIRECTORY%
rem 验证目录是否为版本库,如果是则取出名称备份for /r %SVN_ROOT% %%I in (.) do @if exist "%%Iconfsvnserve.conf" %SVN_ROOT%simpleBackup.bat "%%~fI" %%~nIgoto end
:checkBackecho 备份目录%BACKUP_DIRECTORY%已经存在,请清空。goto end
:end
你在使用的时候,只需要修改backup.bat开头的三个路径,将两个脚本拷贝到“SVN_ROOT”下就可以了。根据以上的配置,你只需要运行backup.bat,就可以把“SVN_ROOT”下的版本库都备份到“BACKUP_SVN_ROOT”里,并且存放在备份所在日的目录里,例如“D:svnrootbak2006-10-22”。
虽然这部分工作很简单,可是必须有人定时地去执行这个操作(例如每周一凌晨),为了避免发生遗忘的情况,我们可以将这个操作加入到系统的at任务当中去,例如还是上面的环境,为了安装at任务,我们运行:
at 1:00 /every:M D:svnrootbackup.bat
这样在每周一凌晨1:00都会执行这个备份过程。当然备份在本机也是不安全的,你也许需要上传到别的机器,这个就要靠你自己去实现了。
2, 增量备份
尽管完全备份非常简单,但是也是有代价的,当版本库非常巨大时,经常进行完全备份是不现实的,也并不必要,但是一旦版本库在备份之间发生问题,该如何呢,这里我们就用到了增量备份。
增量备份通常要与完全备份结合使用,就像oracle数据库的归档日志,记录着每次Subversion提交的变化,然后在需要恢复时能够回到最新的可用状态。在我们这个例子中我们使用的是,svnadmin dump命令进行增量的备份,使用方法是:

svnadmin dump project1 --revision 15 --incremental > dumpfile2
上面的命令实现了对修订版本15进行增量的备份,其中的输出文件dumpfile2只保存了修订版本15更改的内容。
为了记录每次提交的结果,我们需要使用一项Subversion的特性--钩子(hook),看看我们的project1目录:

├─project1│  ├─conf│  ├─dav│  ├─db│  │  ├─revprops│  │  ├─revs│  │  └─transactions│  ├─hooks│  └─locks
其中的hooks目录里存放的就是钩子脚本,我们在此处只使用post-commit钩子,这个钩子会在每次提交之后执行,为了实现我们的备份功能,我们在hooks下建立一个文件post-commit.bat,内容如下:

echo offset SVN_HOME="C :P rogram FilesSubversion"set SVN_ROOT=D:svnrootset UNIX_SVN_ROOT=D:/svnrootset DELTA_BACKUP_SVN_ROOT=D:svnrootbakdelta
set LOG_FILE=%1backup.logecho backup revision %2 >> %LOG_FILE%
for /r %SVN_ROOT% %%I in (.) do if D:/svnroot/%%~nI == %1 %SVN_ROOT%%%~nIhooksdeltaBackup.bat %%~nI %2goto end
:end
通过这个脚本,可以实现D:svnroot下的版本库提交时自动增量备份到D:svnrootbakdelta(确定这个目录存在),其中使用的deltaBackup.bat其实可以放在任何地方,只是对脚本的svnadmin dump的包装,内容如下:

@echo 正在备份版本库%2......%SVN_HOME%binsvnadmin dump %SVN_ROOT%%1 --incremental --revision %2 >> %DELTA_BACKUP_SVN_ROOT%%1.dump@echo 版本库%2成功备份到了%3!
以上两个脚本可以直接拷贝到project2的hooks目录下,不需要修改就可以实现project2的自动备份。
以上的操作已经OK了,现在需要做的是将完全备份和增量备份结合起来,也就是在完全备份后清理增量备份的结果,使之只保存完全备份后的结果。
当果真出现版本库的故障,就要求我们实现版本库的恢复操作了,这是用要使用svnadmin load命令,同时也需要上次的完全备份例如要把上次完全备份backuprepo,和之后的增量备份dumpfile:

svnadmin load backuprepo < dumpfile
最后的结果,可以下载svnroot.rar,将之解压缩到d:下,然后修改几个bat文件的SVN_HOME就可以使用了。
3, 版本库同步
Subversion 1.4增加了同步机制,可以实现一个版本库同另一个版本库的同步(但好像只是单向的),我们可以用来实现版本库的备份或镜像。
3.1. 对目标库初始化
svnsync init svn://localhost/project2 svn://localhost/project1
 
其中project2是目标的版本库,而project1是源版本库。其中的目标版本库必须为空,而且必须允许修订版本属性的修改,也就是在目标的版本库的hooks目录里添加一个文件pre-revprop-change.bat,内容为空即可。
3.2. 同步project2到project1
svnsync sync svn://localhost/project2
 
这时候你update一下你的project2的一个工作拷贝,就会发现有了project1的所有内容。如果project1又有提交,这时候project2的版本库无法看到最新的变化,还需要再运行一遍sync操作,这样才能将最新的变化同步。需要注意的是,目标版本库只能做成只读的,如果目标版本库发生了变更,则无法继续同步了。
3.3. 同步历史属性的修改
因为同步不会更新对历史属性的修改,所以svnsync还有子命令copy-revprops,可以同步某个版本的属性。
3.4. 钩子自动同步
希望在每次提交时同步,则需要在源版本库增加post-commit脚本,内容如下:
echo off
set SVN_HOME="D:Subversion"
%SVN_HOME%binsvnsync sync --non-interactive svn://localhost/project2
 
把以上内容存放为post-commit.bat,然后放到版本库project1下的hooks目录下,这样project1每次提交,都会引起project2的同步。

Posted in 软件配置管理 | Tagged , | Leave a comment

Windows 下cvsnt管理员操作指南2.0

0
Digg me

 
Windows 下cvsnt管理员操作指南2.0
 
 
                                     (适用于cvsnt2.0.8以及以下cvsnt版本)
 
 
 
 
 
 
 
 
引言
 
 
在windows平台上使用cvs的时候,难点就是观念的转换,不要用windows的思维来思考cvs的使用,这样怎么思考你都是想不通的.以下是第一个版本.只是起一个引导作用,以后会不断充实.
 
 
阅读方法:先了解下概念 在后续的操作中会用到些概念中提到的 不然你就不明白所以然
 
 
一,概念
 
 
Group : linux下组的管理就通过这个文件 在cvs上也使用这个来管理组;
 
 
Cvsnt : cvsnt是linux下cvs移植到windows上的服务器版本,其实在linux下cvs服务器版和客户端用的都是同一个cvs.exe  不同之处就是配置 一个配置成服务器.一个配置为客户端
 
 
Cvsuser : cvsuser 是管理员自行设置的windows系统用户,为了好记忆.用户名是cvsuser 也就是说这个用户可以根据管理员自行改变. 不过这个改变最好在第一次建库的时候就确定.应为这个用户涉及到cvs用户的权限分配.
 
 
Pserver: cvs登陆方式 该方式适合网络之间的访问 传送方式为明文.
 
 
 
 
 
二,使用频繁的命令;
 
 
1)Cvs password    设置用户密码
 
 
参数:    -a  xx           ##该条命令是设置cvs的内部用户 ,该用户设置好后可以在服务器本机登陆cvs 不能远程访问.
 
 
        -r  cvsuser  xx   ## 该命令是吧cvs内部用户和系统用户相绑定, 也就是前面提到cvsuser系统用户.
 
 
        -X(x)  xx          ## 删除cvs用户;
 
 
 例如: 建立用户:户张三 可以使用pserver 远程访问用户的步骤:
 
 
         第二步骤的前提是 操作系统中必须有cvsuser这个系统用户
 
 
l         Cvs passwd –a san.zhang 回车  输入密码
 
 
l         Cvs passwd –r cvsuser san.zhang 回车 输入密码(这个密码是远程访问需要的密码)
 
 
 
 
 
2)Cvs chacl      设置(模块)文件夹组权限
 
 
参数
 
 
        -R         ## 递归子目录;
 
 
        组名:rwc   ## r 只读权限,  w读写权限,   c新建删除权限. n 没有任何权限
 
 
 例如: Cvs chacl –R cvsroot:rwc
 
 
                  ## 该命令是 给cvsroot组分配rwc的权限   
 
 
 
 
 
3)cvs lsacl         查看(模块)文件夹的权限和建立人
 
 
 
 
 
 
 
 
 
 
 
 
 
 
三,具体操作;
 
 
创建用户和分配权限是cvs操作的重点.具体权限分配思路
 

 
 
(图1) 
 
 
以下操作使用系统管理员用户 登陆方式使用pserver  服务器端系统中需要建一个cvsuser用户.
 
 
 
 
 
 1,创建用户操作
 
 
a)         在服务器上建好库后. 用wincvs链接上(使用administrator 用户).
 
 
b)        导出cvsroot模块, 在其模块中建立group文件不要有后缀名.(概念中已经讲到cvs是linux下移植过来的)
 
 
c)         用记事本等工具打开group文档 在里面添加组和组员
 
 
例如: 需要分配 开发组 ,需求组, 项目经理等几个组
 
 
Codes: san.zhang bian.da
 
 
Requirements: si.li                       
 
 
Run: wu.wang
 
 
把这些放到group中就可以了 具体意思是: 开发组: codes  需求组 : requirementsr
 
 
项目经理 : run
 
 
具体的英文单词可以自己定.拼音也可以.只要自己理解. 组名和人员用冒号格开,各个人员用空格格开, 人名使用 名+点+姓  或 姓+点+名的格式  
 
 
d)        上传group文件 完成后 [调出命令窗口(右ctrl+L) 输入]使用cvs passwd建里cvs内部用户和绑定系统用户 顺序是 cvs passwd –a xx  然后在是cvspasswd –r cvsuser xx
 
 
 
 
 
 
 
 
2,组权限分配操作:
 
 
用户的权限也基于组的权限; 分配组权限依附模块,组权限对应的是对模块访问的权限

 
(图2)
 
 
 
 
 
e)         用户建完后 就可以对模块分权限了. (分权限的条件是cvs库里的有相应的模块了才能给该模块分配权限) 在wincvs 选中相应的模块后调出命令窗口(右ctrl+L) 输入
 
 
Cvs chacl  -R  rcordes:rwc  这个目录以及子目录都有了该权限了
 
 
f)          分完权限可以使用cvs lsacl查看该模块有权限没!  (模块建好后默认是所有用户都有读写擦权限)
 
 
  
 

Posted in 软件配置管理 | Tagged , | Leave a comment

[转] SVN迁移

0
Digg me

http://maomaode.bokeland.com/blog/3/94/2006/05/11/11524

SVN迁移可能有很多原因, 可能是我们想换Repository目录, 或者是想换一台机器, 等等.

SVN迁移很容易做, 按照下面步骤就可以:

1. 将原来的Repository导出为一个文件dumpfile

> svnadmin dump path/to/old-repo > dumpfile

2. 创建新的Repository, 创建方法可以参考 Windows 平台安装Subversion server

3. 将dumpfile导入到新的Repository

> svnadmin load path/to/new-repo < dumpfile

4. 检查新的Repository的conf/目录下的配置文件, 检查hooks/目录下的构子程序等等...

Posted in 软件配置管理 | Tagged , | Leave a comment