|
作者: luhaiyang [luhaiyang] 论坛用户 | 登录 |
一、情况:用软件把一个文件夹隐藏了,然后忘记恢复就重装系统了,之后在软件里面没有恢复的目录,无法恢复原有文件夹。 二、我的尝试:首先在选项里面显示系统文件夹,发现F盘下面有个RECYCLER文件夹,下面有个图标是回收站的文件夹,文件名是:S-1-5-21-602162358-343818398-1801674531-500。但是打开就进回收站了。 我用WINRAR,发现可以打开该文件夹,里面有个Recycl0的文件夹,Recycl0文件夹里面就是我隐藏了的文件夹里面的文件。 我把里面文件压缩了放在别的地方,然后再解压,成功取得了原来的文件。但是这种办法太慢了,没法大量使用。 我尝试给软件编写者发了个邮件,但是没有回复。 请教各位,该怎么恢复。 二、软件 软件叫文件(夹)隐藏、伪装大师,是网上下的共享软件。 下面是从软件的帮助里面找到的 用到的WindowsAPI函数: RegOpenKeyEx 解释:打开注册表里的一个键 RegCreateKey 解释:新建或打开注册表里的一个键 RegQueryValueEx 解释:获得注册表里的一个键的值 RegSetValueEx 解释:设置注册表里的一个键的值 RegDeleteValue 解释:删除注册表里的一个键的值 RegCloseKey 解释:关闭注册表里的一个键 GetDriveType 解释:获得一个盘符的类型 GetVersion 解释:获得系统类型及版本 SHFileOperation 解释:文件操作(包括移动,复制,删除) GetTempPath 解释:获得程序临时文件可写入的路径 CreateFile 解释:打开或建立文件 ReadFile 解释:读文件 WriteFile 解释:写文件 CloseHandle 解释:关闭文件 用到的VB6OCX控件及ActiveX控件: CheckBox 解释:可钩中的标签 CommandButton 解释:按钮 ComboBox 解释:可下拉的TextBox Frame 解释:选项中有标题的框 Label 解释:标签 Line 解释:斜线 OptionButton 多选一的标签 PictureBox 解释:图片框 ProgressBar 解释:进程条 TextBox 解释:文本框 Timer 解释:时钟触发器 ExplorerTree 解释:路径树(ActiveX OCX) ExplorerList 解释:某路径下文件列表(ActiveX OCX) ListView 解释:有多列(SubItem)和标题(HeadLine)的列表ActiveX OCX) 编程心得: 1.我对VB的评价。 我认为VB是一种功能非常强大的编程工具。如果你也是VB爱好者,但觉得VB好像好多事都不能做,那说明你有好多VB的函数及API函数不太了解。正是API函数给了VB强大的功能。VB与VC相比的最大优点就是资源使用灵活,API引用简单,现成函数及ActiveX OCX很多且调用简单,稳定性好。 那是不是尽量用API就是最好的呢?我认为不是的,由于API的相对不稳定性,VB调用机理,我建议能用VB内部函数实现的就不要用API,这样能大幅提高运行速度及降低不可预见错误的出现概率。 2.几点注意。 1.将程序写的比较结构化对于程序修改,写较大程序很重要,还要注意封装,变量的域要尽量小。 2.变量名要具有可读性,这样才不容易乱。 3.将常用函数单独定义,可减小每个Sub或Function的长度,使读与修改都比较容易。 4.经常考虑到程序可能会遇到的错误,保证程序的稳定性,要有出错处理。 5.Len函数返回的不是真实长度,它把一个中文字算成了一个字符。 6.Form_Load执行Print语句没有任何效果. 7.对于多窗体程序,在程序结束前应Unload所有窗体。 3.如何掌握从来没用过的控件及API函数? 我在这次就是第一次用ListView和ProgressBar控件。其实控件的属性和方法(事件)是大同小异的,那么如何掌握呢?我认为最好的方法就是自己尝试。慢慢试试,就会无师自通,我从一开始就是这样学过来的,学会一个控件或API后,就会很高兴自己又琢磨明白了一个,今后可用的就有多了一个。 API函数也是一样,Windows的API函数的函数名和参数名的可读性很强,可以先使用Visual Studio 自带的API View工具,查要用API的声明格式、常数值、TYPE类型成员,再根据参数的意思试试,很快就能学会的。GetDriveType和GetVersion我就是第一次用。 3.关于不同窗体间参数的调用。 一般来说,可以获得另一个尚未Unload的窗体某控件的Caption、Text等实现参数传递,但传递数量、类型都有很大限制,所以一般人们都是通过Public某变量,来实现参数传递的。Public有两种方法,一是在某窗体的通用(General)里,二是在模块(Module)中。其中第一种方法是不好的,它要求此窗体必须在运行或已初始化,所以一般采用第二种方法。 4.如何让一个Function返回多个值? 有时候希望一个Function能返回多个变量,但它只能返回一个变量,那怎么办呢?我认为应该用Type自定义一个结构体,其中定义多个变量,然后让Function的返回值类型为此结构体,这样可以实现返回多值。 5.学会使用Timer控件。 Timer控件可以控制触发时间,非常有用。比如你想实时监控一些值或属性,可以用它实现;由于只有当Form_Load执行完后,Form才会出现,那么如果你初始化所需时间很长,又不想让别人看出来,怎么办呢?可以在Form_Load中将Timer.Enabled=True(假设Timer控件的名称为Timer),然后将你初始化的程序写在Timer_Timer中,并写上Timer.Enabled=False,这样它只在窗体Load时,才被执行一次。但要注意,虽然Timer.Interval可以精确到微秒,但其误差约在0.01秒数量级,这一点在计时中要注意其准确性,一般可以用获得系统时间(Timer函数)控制延时。 6.如何调用某窗体并使当前窗体暂停(指下一语句不执行)? 将被调用的窗体设为非模式窗体,方法是Form2.Show 1,Me(假设被调用的窗体名为Form2)。要注意非模式窗体不能再调用模式窗体。 7.Form_Load何时执行? 假设Form_Load是在Form2中,当前Form是Form1。Form2的Form_Load并不一定是在Form2.Show后执行的,当Form1执行到某Sub或Function时,其中若有关于Form2的语句时(不管是否可能执行到),就会触发Form2的Form_Load(就算Form2已Load)。这一点是初学者应该注意的,不要把什么初始化都放在Form_Load里,应该充分利用Form_Activate。 8.Form_KeyDown的特点和局限性。 Form_KeyDown是当前窗体有键按下时触发的事件。他有两个局限性:1.窗体内某些控件(如Text)处于焦点状态时,控件会提前截获KeyDown事件,Form_KeyDown便不被触发,这是VB的一个特点,一个动作只能触发一个事件,那比如当Form_Click与Form_DblClick同时存在时,Form_DblClick永远不可能被触发。2.Form_KeyDown只能响应一个按键(除Shift等),如果想实现相应同时按左上就不行了。要解决这个问题应使用API函数GetAsyncKeyState,它可以检测某键是否被按下及曾经被按下,用查询方式检测是否有按键。 9.On Error Resume Next的重要性。 一旦出现错误,程序就会中止,有时候明明知道有可能会出现错误,但治病不会影响程序的运行,那怎么办呢?可以在这个Sub(或Function)里的第一句写上On Error Resume Next,则遇错不会终止,再加上适当的出错判断即可。 10.关于BMP文件的格式。 一个24bit的位图是由54字节字头信息和每个字节的颜色信息组成。颜色信息使用的是RGB格式,BGR顺序由高位到低位。那是不是一个像素占3字节呢?不一定的,可以在之后增加一位扩展位,比如用FF表示模糊化,0表示什么都不做等。程序中,伪装成位图所用之闪电图案,就是我直接按字节写出来的一个位图。 11.临时文件何处去? 临时文件放在什么地方是有讲究的,放程序所在目录下,很容易被发现,我认为不安全,不好。如果放C:\Windows目录下也不好,如果没有C:\Windows目录而是C:\WinNT或C盘不可写呢?所以都不好。一般应用程序是放在系统指定的临时目录下,在Win2000及WinXP是如下这样的:(假设系统在C盘,登陆的用户名是USERNAME) C:\Documents and Settings\USERNAME\Local Settings\Temp,就算C盘不可写,这个目录也是可写的。 12.关于用Binary方式打开文件。 VB提供用Binary方式打开文件可以实现简单的文件操作(读写二进制文件)。因此可以不调用API函数就实现读写Ini文件(本程序就是这样做的)。像7.中所说,也须Binary方式。 读写的函数是Get和Put,读写的缓冲区变量支持三种格式1.字符串(String),2.整型(Integer),3.字节型(Byte),各有特点。分析如下: 1.String:可一次读写多个字节(1至65526),这里不是65536,因为String也要有头和尾的开销。需要提前定义好变量字符串长度,但对VB不可显示字符不保存,这会导致文件信息丢失(变为0)。 2.Integer:一次读一个字节,写两个字节,值为正,写一个ASCII字符加一个空格;值为负,写一个中文字符,中文字符码值=(第一个字符ASCII码 - 256) * 256 + 第二个字符ASCII码),所以为负。 3.Byte:它与Integer很像,只不过值的范围是0-255,所以一次读写一个字节。不能写中文字符,但不会像2.在字符后加空格,其格式最标准,应用最多。 这三种方式各有特点,在本程序中都有应用。 13.调用API函数读写文件。 CreateFile、OpenFile、ReadFile、WriteFile、CloseHandle是一组强大的读写文件(还可进行串口通信等)的API函数。用Byte类型定义一个数组作为缓冲区可以一次读写任意多个二进制值,比之前说的Put、Get快几个数量级,读100M要4-5秒左右(对CPU主频1.6GHz),所以是用于文件加密、压缩的重要函数。 14.关于系统如何确定文件夹的类型及图标等属性。 Windows系统是通过文件夹下一个叫DeskTop.ini的系统、隐藏文件标示一个文件夹的属性。比如看下面三行: [.ShellClassInfo] IconFile=%SystemRoot%\system32\SHELL32.dll IconIndex=28 这就是表示文件夹是普通文件夹,但图标为SHELL32.dll文件的第28个图标。 15.重要字符串信息不能以用作常量. 比如把密码放在注册表的什么位置了,像这样的信息是不能告诉别人的,如果在程序中它被表现为常量,用记事本打开编译后的.exe文件,会找到这个字符串,这样别人就很容易发现你的密码在哪。 |
地主 发表时间: 09-06-22 19:26 |
回复: radom [f_h] 论坛用户 | 登录 |
14.关于系统如何确定文件夹的类型及图标等属性。 Windows系统是通过文件夹下一个叫DeskTop.ini的系统、隐藏文件标示一个文件夹的属性。比如看下面三行: [.ShellClassInfo] IconFile=%SystemRoot%\system32\SHELL32.dll IconIndex=28 这就是表示文件夹是普通文件夹,但图标为SHELL32.dll文件的第28个图标 delete ... |
B1层 发表时间: 10-08-20 17:54 |
|
20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon
粤ICP备05087286号