用ASP备份还原SQL Server

<HTML>
<HEAD>
<TITLE>SQL Server 数据库的备份与恢复</TITLE>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</HEAD>
<BODY>

<script language="javascript">
function inputdir()
{
if(event.srcElement.value =="wdir")
{
myform.bakfileName.disabled = true;
}
else if (event.srcElement.value == "cdir")
{
myform.bakfileName.disabled = false;
}
}
</script>
<%
if request.ServerVariables("CONTENT_LENGTH")=0 then
call fillform()
else
call backupDB()
call fillform()
end if

sub fillform()%>
<form method="post" name=myform>
<table width="433" border="1" align="center" cellpadding="0" cellspacing="0">
<caption>
SQL Server 数据库的备份与恢复
</caption>
<tr>
<td>选择操作:<label for=act_restore></label></td>
<td>
<input type="radio" name="act" id="act_backup" value="backup">
<label for=act_backup>备份</label>
<input type="radio" name="act" id="act_restore" value="restore">
<label for=act_restore>恢复</label></td>
</tr>
<tr>
<td>帐号:</td>
<td><input name="adminName" type="text" ></td>
</tr>
<tr>
<td>密码:</td>
<td><input name="adminPassword" type="password" ></td>
</tr>
<tr>
<td>数据库名:</td>
<td><input name="databaseName" type="text" ></td>
</tr>
<tr>
<td>备份路径:</td>
<td>
<label><input type="radio" name="BackUpType" value="wdir" checked onClick="inputdir()">当前目录</label>
<label><input type="radio" name="BackUpType" value="cdir" onClick="inputdir()">自定义</label>
</td>
</tr>
<tr>
<td>文件路径:</td>
<td><input type="text" id="bakfileName" name="bakfileName" value="c:$N.bak" disabled>(备份或恢复的文件路径)</td>
</tr>
<tr>
<td colspan="2"><div align="center">
<input name="submit" type="submit" value="确定">
<input name="Reset" type="reset" value="重置">
</div></td>
</tr>
</table>
</form>
<% end sub %>

<%
sub backupDB()
dim sqlserver,adminName,adminPassword,sqlLoginTimeout,databasename,bakfileName,act
sqlserver = "localhost" 'sql服务器
adminName = Trim(Request.Form("adminName")) '用户名
adminPassword = Trim(Request.Form("adminPassword")) '密码
sqlLoginTimeout = 15 '登陆超时
databaseName = trim(request.Form("databaseName"))
BackUpType = trim(request.Form("BackUpType"))
if BackUpType = "wdir" then
bakfileName = request.ServerVariables("APPL_PHYSICAL_PATH") & "" & databaseName & ".bak"
elseif BackUpType = "cdir" then
bakfileName = trim(request.Form("bakfileName"))
bakfileName = replace(bakfileName,"$N",databaseName)
else

end if
act = lcase(request("act"))

if databasename = "" then
response.write "<center><font color=red>没有输入数据库名!</font></center>"
'response.End()
elseif bakfileName = "" then
response.Write "<center><font color=red>没有输入备份文件名!</font></center>"
else
if act = "backup" then
Set srv=Server.CreateObject("SQLDMO.SQLServer")
srv.LoginTimeout = sqlLoginTimeout
srv.Connect sqlserver,adminName,adminPassword
Set bak = Server.CreateObject("SQLDMO.Backup")
bak.Database=databasename
bak.Devices=Files
bak.Files=bakfileName
bak.SQLBackup srv
if err.number<>0 then
response.write err.number & "<font color=red><br>"
response.write err.description & "</font>"
else
response.Write "<center><font color=blue>备份成功!</font></center>"
'response.End()
end if
elseif act = "restore" then
'恢复时要在没有使用数据库时进行!
Set srv=Server.CreateObject("SQLDMO.SQLServer")
srv.LoginTimeout = sqlLoginTimeout
srv.Connect sqlserver,adminName,adminPassword
Set rest=Server.CreateObject("SQLDMO.Restore")
rest.Action=0 ' full db restore
rest.Database=databasename
rest.Devices=Files
rest.Files=bakfileName
rest.ReplaceDatabase=True 'Force restore over existing database
rest.SQLRestore srv
if err.number<>0 then
response.write err.number & "<font color=red><br>"
response.write err.description & "</font>"
else
Response.write "<center><font color=green>恢复成功!</font></center>"
'response.End()
end if
else
Response.write "<center><font color=red>没有选择操作!</font></center>"
'response.End()
end if
end if
end sub
%>
</BODY>
</HTML>

索引在数据库中的应用分析

     索引是提高数据查询最有效的方法,也是最难全面掌握的技术,因为正确的索引可能使效率提高10000倍,而无效的索引可能是浪费了数据库空间,甚至大大降低查询性能。

索引的管理成本
1、 存储索引的磁盘空间
2、 执行数据修改操作(Insert、Update、Delete)产生的索引维护
3、 在数据处理时回需额外的回退空间

实际数据修改测试:
一个表有字段A、B、C,同时进行插入10000行记录测试
在没有建索引时平均完成时间是2.9秒
在对A字段建索引后平均完成时间是6.7秒
在对A字段和B字段建索引后平均完成时间是10.3秒
在对A字段、B字段和C字段都建索引后平均完成时间是11.7秒
从以上测试结果可以明显看出索引对数据修改产生的影响

索引按存储方法分类

B*树索引
B*树索引是最常用的索引,其存储结构类似书的索引结构,有分支和叶两种类型的存储数据块,分支块相当于书的大目录,叶块相当于索引到的具体的书页。一般索引及唯一约束索引都使用B*树索引。

位图索引
位图索引储存主要用来节省空间,减少ORACLE对数据块的访问,它采用位图偏移方式来与表的行ID号对应,采用位图索引一般是重复值太多的表字段。位图索引在实际密集型OLTP(数据事务处理)中用得比较少,因为OLTP会对表进行大量的删除、修改、新建操作,ORACLE每次进行操作都会对要操作的数据块加锁,所以多人操作很容易产生数据块锁等待甚至死锁现象。在OLAP(数据分析处理)中应用位图有优势,因为OLAP中大部分是对数据库的查询操作,而且一般采用数据仓库技术,所以大量数据采用位图索引节省空间比较明显。

索引按功能分类

唯一索引:有两个作用,一个是数据约束,一个是数据索引,其中数据约束主要用来保证数据的完整性,唯一索引产生的索引记录中每一条记录都对应一个唯一的ROWID。
主关键字索引:产生的索引同唯一索引,只不过它是在数据库建立主关键字时系统自动建立的。
一般索引:不产生数据约束作用,其功能主要是对字段建立索引表,以提高数据查询速度。

索引按索引对象分类

单列索引(表单个字段的索引)
多列索引(表多个字段的索引)
函数索引(对字段进行函数运算的索引)

建立函数索引的方法:
create index 收费日期索引 on GC_DFSS(trunc(sk_rq))
create index 完全客户编号索引 on yhzl(qc_bh||kh_bh)

在对函数进行了索引后,如果当前会话要引用应设置当前会话的query_rewrite_enabled为TRUE。
alter session set query_rewrite_enabled=true

注:如果对用户函数进行索引的话,那用户函数应加上 deterministic参数,意思是函数在输入值固定的情况下返回值也固定。例:

create or replace function trunc_add(input_date date)return date deterministic
as
begin
return trunc(input_date+1);
end trunc_add;

应用索引的扫描分类

INDEX UNIQUE SCAN(按索引唯一值扫描)
select * from zl_yhjbqk where hbs_bh='5420016000'

INDEX RANGE SCAN(按索引值范围扫描)
select * from zl_yhjbqk where hbs_bh>'5420016000'
select * from zl_yhjbqk where qc_bh>'7001'

INDEX FAST FULL SCAN(按索引值快速全部扫描)
select hbs_bh from zl_yhjbqk order by hbs_bh
select count(*) from zl_yhjbqk
select qc_bh from zl_yhjbqk group by qc_bh

什么情况下应该建立索引

表的主关键字
自动建立唯一索引如zl_yhjbqk(用户基本情况)中的hbs_bh(户标识编号)

表的字段唯一约束
orACLE利用索引来保证数据的完整性,如lc_hj(流程环节)中的lc_bh+hj_sx(流程编号+环节顺序)

直接条件查询的字段
在SQL中用于条件约束的字段,如zl_yhjbqk(用户基本情况)中的qc_bh(区册编号)
select * from zl_yhjbqk where qc_bh=’7001’

查询中与其它表关联的字段
字段常常建立了外键关系,如zl_ydcf(用电成份)中的jldb_bh(计量点表编号)
select * from zl_ydcf a,zl_yhdb b where a.jldb_bh=b.jldb_bh and b.jldb_bh=’540100214511’

查询中排序的字段
排序的字段如果通过索引去访问那将大大提高排序速度
select * from zl_yhjbqk order by qc_bh(建立qc_bh索引)
select * from zl_yhjbqk where qc_bh='7001' order by cb_sx(建立qc_bh+cb_sx索引,注:只是一个索引,其中包括qc_bh和cb_sx字段)

查询中统计或分组统计的字段
select max(hbs_bh) from zl_yhjbqk
select qc_bh,count(*) from zl_yhjbqk group by qc_bh

什么情况下应不建或少建索引

表记录太少
如果一个表只有5条记录,采用索引去访问记录的话,那首先需访问索引表,再通过索引表访问数据表,一般索引表与数据表不在同一个数据块,这种情况下ORACLE至少要往返读取数据块两次。而不用索引的情况下ORACLE会将所有的数据一次读出,处理速度显然会比用索引快。
如表zl_sybm(使用部门)一般只有几条记录,除了主关键字外对任何一个字段建索引都不会产生性能优化,实际上如果对这个表进行了统计分析后ORACLE也不会用你建的索引,而是自动执行全表访问。如:
select * from zl_sybm where sydw_bh='5401'(对sydw_bh建立索引不会产生性能优化)

经常插入、删除、修改的表
对一些经常处理的业务表应在查询允许的情况下尽量减少索引,如zl_yhbm,gc_dfss,gc_dfys,gc_fpdy等业务表。

数据重复且分布平均的表字段
假如一个表有10万行记录,有一个字段A只有T和F两种值,且每个值的分布概率大约为50%,那么对这种表A字段建索引一般不会提高数据库的查询速度。

经常和主字段一块查询但主字段索引值比较多的表字段
如gc_dfss(电费实收)表经常按收费序号、户标识编号、抄表日期、电费发生年月、操作标志来具体查询某一笔收款的情况,如果将所有的字段都建在一个索引里那将会增加数据的修改、插入、删除时间,从实际上分析一笔收款如果按收费序号索引就已经将记录减少到只有几条,如果再按后面的几个字段索引查询将对性能不产生太大的影响。

如何只通过索引返回结果

一个索引一般包括单个或多个字段,如果能不访问表直接应用索引就返回结果那将大大提高数据库查询的性能。对比以下三个SQL,其中对表zl_yhjbqk的hbs_bh和qc_bh字段建立了索引:
1 select hbs_bh,qc_bh,xh_bz from zl_yhjbqk where qc_bh=’7001’

执行路径:
Select STATEMENT, GOAL = CHOOSE 11 265 5565
TABLE ACCESS BY INDEX ROWID DLYX ZL_YHJBQK 11 265 5565
INDEX RANGE SCAN DLYX 区册索引 1 265
平均执行时间(0.078秒)

2 select hbs_bh,qc_bh from zl_yhjbqk where qc_bh=’7001’

执行路径:
Select STATEMENT, GOAL = CHOOSE 11 265 371
0
TABLE ACCESS BY INDEX ROWID DLYX ZL_YHJBQK 11 265 3710
INDEX RANGE SCAN DLYX 区册索引 1 265
平均执行时间(0.078秒)

3 select qc_bh from zl_yhjbqk where qc_bh=’7001’
执行路径:
Select STATEMENT, GOAL = CHOOSE 1 265 1060
INDEX RANGE SCAN DLYX 区册索引 1 265 1060
平均执行时间(0.062秒)

从执行结果可以看出第三条SQL的效率最高。执行路径可以看出第1、2条SQL都多执行了TABLE ACCESS BY INDEX ROWID(通过ROWID访问表) 这个步骤,因为返回的结果列中包括当前使用索引(qc_bh)中未索引的列(hbs_bh,xh_bz),而第3条SQL直接通过QC_BH返回了结果,这就是通过索引直接返回结果的方法。

如何重建索引

alter index 表电量结果表主键 rebuild

如何快速新建大数据量表的索引

如果一个表的记录达到100万以上的话,要对其中一个字段建索引可能要花很长的时间,甚至导致服务器数据库死机,因为在建索引的时候ORACLE要将索引字段所有的内容取出并进行全面排序,数据量大的话可能导致服务器排序内存不足而引用磁盘交换空间进行,这将严重影响服务器数据库的工作。解决方法是增大数据库启动初始化中的排序内存参数,如果要进行大量的索引修改可以设置10M以上的排序内存(ORACLE缺省大小为64K),在索引建立完成后应将参数修改回来,因为在实际OLTP数据库应用中一般不会用到这么大的排序内存。

dvbbs 7.0的后台菜单

<SCRIPT language=javascript1.2 type="text/javascript">
function showsubmenu(sid)
{
whichEl = eval("submenu" + sid);
if (whichEl.style.display == "none")
{
eval("submenu" + sid + ".style.display="";");
}
else
{
eval("submenu" + sid + ".style.display="none";");
}
}
</SCRIPT>

<table id="1" cellspacing="0" cellpadding="0" align="center" width="200" border="1">
<tr>
<td height="8">动网论坛后台菜单</td>
</tr>
<tr style="CURSOR: hand" onclick="showsubmenu(1)">
<td><strong>聊 天</strong></td>
</tr>
<tr id="submenu1">
<td>碧聊<br>
新浪聊天<br>
网易聊天</td>
</tr>
<tr>
<td height="8"></td>
</tr>
<tr style="CURSOR: hand" onclick="showsubmenu(2)">
<td><strong>游 戏</strong></td>
</tr>
<tr id="submenu2" style="DISPLAY: none">
<td>17173<br>
新浪游戏<br>
太平洋游戏</td>
</tr>
<tr>
<td height="8"></td>
</tr>
<tr style="CURSOR: hand" onclick="showsubmenu(3)">
<td><strong>下 载</strong> </td>
</tr>
<tr id="submenu3" style="DISPLAY: none">
<td>华军软件<br>
天空软件<br>
霏凡软件站</td>
</tr>
<tr>
<td height="8"></td>
</tr>
</table>

三种菜单的显示/隐藏

<SCRIPT language="javascript" type="text/javascript">
<!--
//方式一:不用循环,类似动网后台菜单
function MM_ShowSublist(whichItem) {
var theSublist = document.getElementById ("MM_sublist" +whichItem)
if (theSublist.style.display == "none")
theSublist.style.display = "block";
else
theSublist.style.display = "none";
}

//方式二:使用循环,基于方式一的
function MM_ShowSublist2(f,val){
for(var i=1;i<=f;i++){
if(val == i){
document.getElementById("MM_sublist2" + i).style.display="";
}else{
document.getElementById("MM_sublist2" + i).style.display="none";
}
}
}



//方式三:点击一个菜单后,其他菜单会收缩,方便长的菜单
function MM_ShowSublist3(f,val){
for(i=1;i<=f;i++){
document.getElementById("MM_sublist3" + i).style.display="none";
document.getElementById("MM_sublist3" + val).style.display="block";
}
}
//-->
</SCRIPT>

<table id="1" cellspacing="0" cellpadding="0" align="center" width="200" border="1">
<tr>
<td height="8">第1个表格</td>
</tr>
<tr style="CURSOR: hand" onclick="MM_ShowSublist(1)">
<td><strong>聊 天</strong></td>
</tr>
<tr id="MM_sublist1">
<td>碧聊<br>
新浪聊天<br>
网易聊天</td>
</tr>
<tr>
<td height="8"></td>
</tr>
<tr style="CURSOR: hand" onclick="MM_ShowSublist(2)">
<td><strong>游 戏</strong></td>
</tr>
<tr id="MM_sublist2" style="DISPLAY: none">
<td>17173<br>
新浪游戏<br>
太平洋游戏</td>
</tr>
<tr>
<td height="8"></td>
</tr>
<tr style="CURSOR: hand" onclick="MM_ShowSublist(3)">
<td><strong>下 载</strong> </td>
</tr>
<tr id="MM_sublist3" style="DISPLAY: none">
<td>华军软件<br>
天空软件<br>
霏凡软件站</td>
</tr>
<tr>
<td height="8"></td>
</tr>
</table>

<hr>
<table id="2" cellspacing="0" cellpadding="0" align="center" width="200" border="1">
<tr>
<td height="8">第2个表格</td>
</tr>
<tr style="CURSOR: hand" onclick="MM_ShowSublist2(3,1)">
<td><strong>聊 天</strong></td>
</tr>
<tr id="MM_sublist21">
<td>碧聊<br>
新浪聊天<br>
网易聊天</td>
</tr>
<tr>
<td height="8"></td>
</tr>
<tr style="CURSOR: hand" onclick="MM_ShowSublist2(3,2)">
<td><strong>游 戏</strong></td>
</tr>
<tr id="MM_sublist22" style="DISPLAY: none">
<td>17173<br>
新浪游戏<br>
太平洋游戏</td>
</tr>
<tr>
<td height="8"></td>
</tr>
<tr style="CURSOR: hand" onclick="MM_ShowSublist2(3,3)">
<td><strong>下 载</strong> </td>
</tr>
<tr id="MM_sublist23" style="DISPLAY: none">
<td>华军软件<br>
天空软件<br>
霏凡软件站</td>
</tr>
<tr>
<td height="8"></td>
</tr>
</table>

<hr>
<table id="3" cellspacing="0" cellpadding="0" align="center" width="200" border="1">
<tr>
<td height="8">第3个表格</td>
</tr>
<tr style="CURSOR: hand" onclick="MM_ShowSublist3(5,1)">
<td><strong>聊 天</strong></td>
</tr>
<tr id="MM_sublist31">
<td>碧聊<br>
新浪聊天<br>
网易聊天</td>
</tr>
<tr>
<td height="8"></td>
</tr>
<tr style="CURSOR: hand" onclick="MM_ShowSublist3(5,2)">
<td><strong>游 戏</strong></td>
</tr>
<tr id="MM_sublist32" style="DISPLAY: none">
<td>17173<br>
新浪游戏<br>
太平洋游戏</td>
</tr>
<tr>
<td height="8"></td>
</tr>
<tr style="CURSOR: hand" onclick="MM_ShowSublist3(5,3)">
<td><strong>下 载</strong> </td>
</tr>
<tr id="MM_sublist33" style="DISPLAY: none">
<td>华军软件<br>
天空软件<br>
霏凡软件站</td>
</tr>
<tr>
<td height="8"></td>
</tr>
</table>

防止数据库下载代码

<!--#include file="Conn.asp" -->
<%
If DBType = 0 Then  'access=0,其他为sql server
    SqlCmd = "Create Table NotDownload(NotDown OLEObject)"
    Conn.Execute(SqlCmd)
    SqlCmd = "Insert into NotDownload(NotDown) values('" &chrB(Asc("<")) & chrB(Asc("%")) & "')"
    Conn.Execute(SqlCmd)
    Conn.Close
    Set Conn = Nothing
    Response.Write "数据库防下载处理完成,请确认您的Access数据库已经改为ASP后缀!"
Else
    SqlCmd = "Create Table NotDownLoad(NotDown image)"
    Conn.Execute(SqlCmd)
    SqlCmd = "Insert NotDownload(NotDown) values(0x3c25)"
    Conn.Execute(SqlCmd)
    Conn.Close
    Set Conn = Nothing
    Response.Write "数据库防下载处理完成,即使您的SQL Server数据库备份为ASP后缀也不会正常执行。"
End If

%>

3gcomet.com的价值

评估站点:http://www.leapfish.com/

Domain Name Appraised: 3gcomet.com

Combined Domain Name Appraisal Value Score: 60

Top Level Domain Name Score:  10
Unwanted Characters Score:  9
Length Score:  5
Archive.org Score:  0
Google Search Results:  0
Yahoo Search Results:  1
MSN Search Results:  2
Search Engine Score:  1
  

--------------------------------------------------------------------------------
Estimated Domain Name Value: $60.00

评估站点:http://web.anyp.cn/value/

www.3gcomet.com 评估价值:5,340 RMB

仅供参考,以后会更多的!
外国评估测试:http://www.business-opportunities.biz/projects/how-much-is-your-blog-worth/?url=www.3gcomet.com
http://www.dnscoop.com/

NTFS分区和FAT32分区的区别

      我们在新的硬盘上安装操作系统的时候,首先要进行分区、格式化,然后才能安装。在这个过程中,通常要面临采用哪种文件系统的问题,文件系统的选择在某种程度上决定了操作系统可以发挥的性能。
WIN 2000/XP可以同时支持FAT32和NTFS两种文件系统,FAT32长于与WIN 9X的兼容性,NTFS长于系统安全性。在满足应用的前提下,怎样设置文件系统才能充分发挥WIN 2000/XP的特性呢?在讨论这个问题之前,我们先来看一下FAT32和NTFS两种文件系统各有哪些特点。

一.关于FAT32文件系统

在推出FAT32文件系统之前,通常PC机使用的文件系统是FAT16。基于MS-DOS、WIN 95等的系统都采用了FAT16文件系统。在WIN 9X下,FAT16支持的最大分区为2GB。我们知道计算机将信息保存在硬盘上称为“簇”的区域内。使用的簇越小,保存信息的效率就越高。在FAT16下,分区越大簇就相应越大,存储效率就越低,势必造成存储空间的浪费。并且随着计算机硬件和应用的不断提高,FAT16文件系统已不能很好地适应系统的要求。在这种情况下,推出了增强的文件系统FAT32。同FAT16相比,FAT32主要具有以下特点:

1.FAT32可以支持最大为2TB的磁盘空间(2048GB)。但不支持小于512M的分区。基于FAT32的WIN 2000/XP可以支持分区最大为32GB,而基于FAT16的WIN 2000/XP支持的分区最大为4GB。

2.由于采用更小的簇,FAT32可以更有效率地保存信息。如两个分区大小都为2GB,一个为FAT16文件系统,一个为FAT32文件系统,则FAT16分区的簇大小为32KB,而FAT32分区的簇只有4KB大小。这样FAT32就比FAT16存储效率高很多,一般能提高15%。

3.FAT32文件系统可以重新定位根目录和使用FAT的备份副本。另外FAT32分区的启动记录被包含在一个含有关键数据的结构中,减少了计算机系统崩溃的可能性。

二.关于NTFS文件系统

NTFS文件系统是一个基于安全性的文件系统,是Windows NT所采用的独特的文件系统结构,它是建立在保护文件和目录数据上,同时照顾节省存储资源、减少磁盘占用量的一种先进的文件系统。使用非常广泛的Windows NT4.0采用的就是NTFS 4.0文件系统。WIN 2000/XP采用了更新的NTFS 5.0文件系统。
NTFS 5.0的特点主要有以下几个方面:

1.NTFS可以支持的分区大小可以达到2TB。而WIN 2000/XP中的FAT32支持的分区最大为32GB。

2.NTFS是一个可恢复的文件系统。在NTFS分区上用户很少需要运行磁盘修复程序。NTFS使用标准的事物处理日志和恢复技术来保证分区的一致性。发生系统失败事件时。NTFS使用日志文件和检查点信息自动恢复文件系统的一致性。

3.NTFS支持对分区、文件夹和文件的压缩。任何基于Windows的程序对NTFS分区上的压缩文件进行读写时不需要由其它程序先进行解压缩,当文件被读取时,文件会自动解压缩,而关闭和保存时会自动压缩。

4.NTFS采用更小的簇,WIN 2000/XP的NTFS文件系统中,当分区的大小在2GB以下时,簇的大小比相应的FAT32小;当分区在2GB以上时(2GB-2TB),簇的大小为4KB。而采用FAT32的簇大小为16KB(16GB-32GB),相比之下,NTFS能更有效地管理硬盘空间,最大限度的避免磁盘空间浪费。

5.在NTFS分区上,可以为共享资源、文件夹和文件设置访问许可权限。与FAT32文件系统下对文件夹或文件进行访问相比,安全性要高很多。

6.WIN 2000/XP下的NTFS文件系统还可以进行硬盘配额管理。配额管理就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额内的磁盘空间。可以合理的分配系统资源,避免由于磁盘空间失控造成系统崩溃,提高了系统的安全性。

7.NTFS使用一个“变更”日志来跟踪记录文件所发生的变更。

三.选FAT32还是NTFS

在系统的安全性方面,NTFS文件系统具有很多FAT32文件系统所不具备的特点,而且基于NTFS的WIN 2000/XP运行要快于基于FAT32的WIN 2000/XP;而在于WIN 9X的兼容性方面,FAT32优于NTFS。所以在选用哪种文件系统的时候,应该从以下几点考虑:

1.计算机是单一的系统,还是采用多启动的系统
2.本地安装的磁盘的个数和容量
3.是否有安全性方面的考虑

如果要在WIN 2000/XP中使用大于32GB的分区,或者单文件大于4G,就选NTFS。
如果作为单机使用,不考虑安全性问题,更多注重与WIN 9X兼容性,就选FAT32。
如果作为网络工作站或对系统有较高的安全性要求而且是单一的系统,建议每个分区都采用NTFS文件系统。
如果要兼容以前的应用,需要安装WIN 9X或其它操作系统,建议WIN 2000/XP采用NTFS文件系统。其它采用FAT32文件系统。

对NetBox脱壳

首先对netbox.exe进行查壳

PEID 0.93 -> UPX 0.89.6 - 1.02 / 1.05 - 1.24 (Delphi) stub -> Markus & Laszlo

使用Qunpack0.7 来自动脱掉壳,或者使用OD载入脚本进行OEP FIND。

脱壳之后会提示

Application was modified by a virus !!!

然后使用c32asm载入进行分析,点查找字符串,然后找上面的字符串。

::00430590:: 6A 00 PUSH 0 :BYJMP JmpBy:00430862,
::00430592:: 68 E8455600 PUSH 5645E8 ->: Virus Alert
::00430597:: 68 C0455600 PUSH 5645C0 ->: Application was modified by a virus !!!
::0043059C:: 6A 00 PUSH 0
::0043059E:: FF15 34565300 CALL [535634] >>>: USER32.DLL:MessageBoxA
::004305A4:: 6A 00 PUSH 0
::004305A6:: FF15 58535300 CALL [535358] >>>: KERNEL32.DLL:ExitProcess

可以看到是由00430862跳转过来的。然后到00430862看看。我多向上圈了几行。

::00430847:: 74 1E JE SHORT 00430867 :JMPDOWN
::00430849:: 64:8B0D 04000000 MOV ECX, FS:[4]
::00430850:: 83E9 04 SUB ECX, 4
::00430853:: 8BFC MOV EDI, ESP
::00430855:: 8BE1 MOV ESP, ECX
::00430857:: 2BCF SUB ECX, EDI
::00430859:: FC CLD
::0043085A:: F3 REP STOS DWORD PTR ES:[EDI]
::0043085B:: AA STOS BYTE PTR ES:[EDI]
::0043085C:: 33ED XOR EBP, EBP
::0043085E:: 8BF5 MOV ESI, EBP
::00430860:: 8BFD MOV EDI, EBP
::00430862:: E9 29FDFFFF JMP 00430590 :JMPUP

00430862是无条件跳转到00430590。也就是提示程序被病毒修改的对话框。向上看可以看到005430847那里je short 00430867 。条件跳转。跳转到00430867。直接就跳过去了。我们需要把这里改为直接跳转,不让他判断。

改00430847处的 74 1E 改为 EB 1E。然后保存。

运行修改后的文件,提示框也不见了,直接就打开了NB主界面,然后再使用图标修改精灵进行修改图标,最后加一下壳,免的编译后的体积较大。

本文纯属学习使用,如果侵犯了Netbox,请删除此文,谢谢!