分享一个把文件夹加密的方法(aardio)
先把文件的压缩包放在这里:
在介绍这个加密方法之前,我先要说一些关于它的事情:
很久以前,我发现了一个奇妙的事情:
我打开了aardio中的DLL查看工具,再把我桌面上的World拖了进去。
发现了一个神奇的目录:
正当我寻找它的时候,发现即使打开了“查看隐藏的文件和文件夹”却怎么也找不到它:
但我在上方的导航栏中接着输入\Installer时,神奇的一幕发生了:
系统竟然把Installer自动“隐藏”了,而且很难找到!我开始研究这种文件夹隐藏的方法。
直到昨天,我在网上偶然发现了一段加密文件夹的代码,隐藏后的文件夹与Installer的效果基本相同,而且还加上了加密的功能:
把这段代码写进一个.bat文件里并且把需要加密的文件夹与这个文件放进同一个目录里面在运行一下这个.bat文件,在控制台里输入Y就可以隐藏并加密。我们知道.bat文件里的代码是系统命令行,所以我们就可以把此代码中的核心部分代入进aardio中的execute函数里面来执行,再稍稍改造一下,就可以成为在aardio里实施文件夹隐藏并加密了!
但是不可以直接代入:
execute("ren mayu "Control Panel.{21EC2020-3AEA-1069-A2DD-08002B30309D}" attrib +h +s "Control Panel.{21EC2020-3AEA-1069-A2DD-08002B30309D}"")
因为这段代码中有双引号。怎么办呢?很简单,只需要:
execute('ren mayu "Control Panel.{21EC2020-3AEA-1069-A2DD-08002B30309D}" attrib +h +s "Control Panel.{21EC2020-3AEA-1069-A2DD-08002B30309D}"')
但是这样还不行,因为一个execute函数不能同时执行多个系统命令行。改一小下:
execute('ren mayu "Control Panel.{21EC2020-3AEA-1069-A2DD-08002B30309D}"') execute('attrib +h +s "Control Panel.{21EC2020-3AEA-1069-A2DD-08002B30309D}"')
这就可以了。另一个核心部分也是这样。
这个程序还需要实现隐藏任意文件夹的功能,所以在窗口设计器上加上两个文本框:
上面的文本框的名称是Dir,
--------------------------------------
下面的文本框的名称是Password。
当你要加密的时候,这个程序就会执行这两行系统命令行,然后把此文件夹所对应的密码存放在隐藏文件夹里。
execute('ren '+mainForm.Dir.text+' "'+mainForm.Dir.text+'.{21EC2020-3AEA-1069-A2DD-08002B30309D}"') execute('attrib +h +s "'+mainForm.Dir.text+'.{21EC2020-3AEA-1069-A2DD-08002B30309D}"') string.save("/"+mainForm.Dir.text+".{21EC2020-3AEA-1069-A2DD-08002B30309D}/此文件夹的加密密码.config",mainForm.Password.text ) win.msgboxTimeout("加密成功","提示",2000)
当你要解锁的时候,这个程序就会执行另外两行系统命令行,然后把此文件夹所对应的密码的文件删除。
execute('attrib -h -s "'+mainForm.Dir.text+'.{21EC2020-3AEA-1069-A2DD-08002B30309D}"') execute('ren "'+mainForm.Dir.text+'.{21EC2020-3AEA-1069-A2DD-08002B30309D}" '+mainForm.Dir.text+'') fsys.delete("/"+mainForm.Dir.text+".{21EC2020-3AEA-1069-A2DD-08002B30309D}/此文件夹的加密密码.config")
但是如果解锁代码写成这样的话,就会出现一个问题,就是解锁之后的文件夹依然保留着后缀:“.{21EC2020-3AEA-1069-A2DD-08002B30309D}”,就是上面的代码段中的第二行代码出现了问题。是因为窗口在显示的时候,这个文件夹是被占用的,所以这个文件夹它不能删除、移动或是重命名,所以需要把窗口关闭,才能让文件夹重命名。于是,解锁的代码就变成了这样:
execute('attrib -h -s "'+mainForm.Dir.text+'.{21EC2020-3AEA-1069-A2DD-08002B30309D}"') process("cmd") fsys.delete("/"+mainForm.Dir.text+".{21EC2020-3AEA-1069-A2DD-08002B30309D}/此文件夹的加密密码.config") a = mainForm.Dir.text mainForm.close() win.delay(100) key.sendString('ren "'+a+'.{21EC2020-3AEA-1069-A2DD-08002B30309D}" '+a+'') win.delay(100)//让电脑反应一下,做了一个延迟。 key.press(0xD/*_VK_ENTER*/)
可是这个mainForm的窗口要恢复,并且要让cmd的窗口关闭呀,但是process.kill("cmd")不会受到延时的影响,无论是延时多长时间,都会在key.press(0xD/*_VK_ENTER*/)的指令救赎的一瞬间执行。电脑反应不过来,会在mainFrom窗口未关闭前或在最后用虚拟键盘输入的系统命令行未执行的情况下关闭cmd的窗口,又导致解锁之后的文件夹依然保留着后缀:“.{21EC2020-3AEA-1069-A2DD-08002B30309D}”,所以我们又把代码稍微的“优化”了一下:
execute('attrib -h -s "'+mainForm.Dir.text+'.{21EC2020-3AEA-1069-A2DD-08002B30309D}"') process("cmd") fsys.delete("/"+mainForm.Dir.text+".{21EC2020-3AEA-1069-A2DD-08002B30309D}/此文件夹的加密密码.config") a = mainForm.Dir.text mainForm.close() for(i=1;75;1){ win.delay(100) key.sendString('ren "'+a+'.{21EC2020-3AEA-1069-A2DD-08002B30309D}" '+a+'') win.delay(100) key.press(0xD/*_VK_ENTER*/) } process.kill("cmd") process("/加密文件夹.exe") win.msgboxTimeout("解密成功","提示",2000)
使命令在文件夹从被占用的状态到可以编辑的情况下重复多次之后把cmd的窗口给关掉,使文件夹恢复原来的名字(循环75次刚刚好可以在文件夹可以在被编辑的情况下成功执行1次,并且也没有用到15秒,只是一瞬间的事),并且重新打开mainForm窗口。
最后再把代码“稍微”整改一下,“新鲜”的成品就“出炉”了!
import win.ui; /*DSG{{*/ mainForm = win.form(text="加密";right=244;bottom=169;border="thin";max=false) mainForm.add( BtnChange={cls="button";text="你想要解锁吗?";left=10;top=130;right=110;bottom=160;z=5}; BtnOK={cls="button";text="OK";left=145;top=130;right=235;bottom=160;z=6}; Dir={cls="edit";left=135;top=10;right=235;bottom=30;edge=1;z=2}; Password={cls="edit";left=135;top=40;right=235;bottom=60;edge=1;password=1;z=4}; static={cls="static";text="注意:要加密或者解锁的文件夹必须要与此文件放置于同一个目录中!要加密或者解锁的文件夹的名字里面不允许出现空格!";left=10;top=63;right=235;bottom=128;transparent=1;z=7}; staticDir={cls="static";text="你想要加密的文件夹:";left=-82;top=10;right=135;bottom=30;align="right";transparent=1;z=1}; staticPassword={cls="static";text="密码:";left=15;top=40;right=135;bottom=60;align="right";transparent=1;z=3} ) /*}}*/ mainForm.BtnChange.oncommand = function(id,event){ if(mainForm.BtnChange.text == "你想要加密吗?"){ mainForm.BtnChange.text = "你想要解锁吗?" mainForm.staticDir.text = "你想要加密的文件夹:" mainForm.text = "加密" } elseif(mainForm.BtnChange.text == "你想要解锁吗?"){ mainForm.BtnChange.text = "你想要加密吗?" mainForm.staticDir.text = "你想要解锁的文件夹:" mainForm.text = "解锁" } } import fsys.file; import fsys.dirWatcher; import fsys; import process; import key; mainForm.wndproc = function(hwnd,message,wParam,lParam){ if((mainForm.Dir.text=="")||(mainForm.Password.text=="")){ mainForm.BtnOK.disabled = true } else{ mainForm.BtnOK.disabled = false } } mainForm.BtnOK.oncommand = function(id,event){ if(mainForm.BtnChange.text == "你想要解锁吗?"){ try{ fsys.dirWatcher("/"+mainForm.Dir.text)//查看输入的目录是否存在 execute('ren '+mainForm.Dir.text+' "'+mainForm.Dir.text+'.{21EC2020-3AEA-1069-A2DD-08002B30309D}"') execute('attrib +h +s "'+mainForm.Dir.text+'.{21EC2020-3AEA-1069-A2DD-08002B30309D}"') string.save("/"+mainForm.Dir.text+".{21EC2020-3AEA-1069-A2DD-08002B30309D}/此文件夹的加密密码.config",mainForm.Password.text ) win.msgboxTimeout("加密成功","提示",2000) } catch(e){ win.msgboxErr("文件夹名称错误!请重新输入。") } } elseif(mainForm.BtnChange.text == "你想要加密吗?"){ try{ password = fsys.file("/"+mainForm.Dir.text+".{21EC2020-3AEA-1069-A2DD-08002B30309D}/此文件夹的加密密码.config").readAll()//查看输入的目录是否存在 if(mainForm.Password.text == password){ execute('attrib -h -s "'+mainForm.Dir.text+'.{21EC2020-3AEA-1069-A2DD-08002B30309D}"') process("cmd") fsys.delete("/"+mainForm.Dir.text+".{21EC2020-3AEA-1069-A2DD-08002B30309D}/此文件夹的加密密码.config") a = mainForm.Dir.text } else{ win.msgboxErr("密码错误!请重新输入。") } } catch(e){ win.msgboxErr("文件夹名称错误!请重新输入。") } mainForm.close() win.delay(100) key.sendString('ren "'+a+'.{21EC2020-3AEA-1069-A2DD-08002B30309D}" '+a+'') win.delay(100) key.press(0xD/*_VK_ENTER*/) for(i=1;75;1){ win.delay(100) key.sendString('ren "'+a+'.{21EC2020-3AEA-1069-A2DD-08002B30309D}" '+a+'') win.delay(100) key.press(0xD/*_VK_ENTER*/) } process.kill("cmd") process("/加密文件夹.exe") win.msgboxTimeout("解密成功","提示",2000) } } mainForm.show(); return win.loopMessage();
效果:
感谢Jacen大神的建议,我根据建议又把代码优化了一下,现在它可以加密任何的文件夹,并且不需要用try catch语句了。
代码:
import win.ui; /*DSG{{*/ mainForm = win.form(text="加密";right=244;bottom=139;border="thin";max=false) mainForm.add( BtnChange={cls="button";text="你想要解锁吗?";left=10;top=100;right=110;bottom=130;z=5}; BtnOK={cls="button";text="OK";left=145;top=100;right=235;bottom=130;z=6}; Dir={cls="edit";left=135;top=10;right=235;bottom=30;edge=1;z=2}; Password={cls="edit";left=135;top=40;right=235;bottom=60;edge=1;password=1;z=4}; static={cls="static";text="注意:要加密或者解锁的文件夹必须要与此文件放置于同一个目录中!";left=10;top=63;right=235;bottom=106;transparent=1;z=7}; staticDir={cls="static";text="你想要加密的文件夹:";left=-82;top=10;right=135;bottom=30;align="right";transparent=1;z=1}; staticPassword={cls="static";text="密码:";left=15;top=40;right=135;bottom=60;align="right";transparent=1;z=3} ) /*}}*/ mainForm.BtnChange.oncommand = function(id,event){ if(mainForm.BtnChange.text == "你想要加密吗?"){ mainForm.BtnChange.text = "你想要解锁吗?" mainForm.staticDir.text = "你想要加密的文件夹:" mainForm.text = "加密" } elseif(mainForm.BtnChange.text == "你想要解锁吗?"){ mainForm.BtnChange.text = "你想要加密吗?" mainForm.staticDir.text = "你想要解锁的文件夹:" mainForm.text = "解锁" } } import fsys; import process.popen; mainForm.wndproc = function(hwnd,message,wParam,lParam){ if((mainForm.Dir.text=="")||(mainForm.Password.text=="")){ mainForm.BtnOK.disabled = true } else{ mainForm.BtnOK.disabled = false } } mainForm.BtnOK.oncommand = function(id,event){ if(mainForm.BtnChange.text == "你想要解锁吗?"){ var isDir = io.exist("/"+ mainForm.Dir.text); if(isDir){ process.popen.cmd('ren "'+mainForm.Dir.text+'" "'+mainForm.Dir.text+'.{21EC2020-3AEA-1069-A2DD-08002B30309D}"').waitOne(); process.popen.cmd('attrib +h +s "'+mainForm.Dir.text+'.{21EC2020-3AEA-1069-A2DD-08002B30309D}"').waitOne(); string.save("/"+mainForm.Dir.text+".{21EC2020-3AEA-1069-A2DD-08002B30309D}/此文件夹的加密密码.config",mainForm.Password.text ); win.msgboxTimeout("加密成功","提示",2000) } else{ win.msgboxErr("文件夹名称错误!请重新输入。") } } elseif(mainForm.BtnChange.text == "你想要加密吗?"){ var isDir = io.exist("/"+ mainForm.Dir.text +".{21EC2020-3AEA-1069-A2DD-08002B30309D}"); if(!isDir){ win.msgboxErr("文件夹名称错误!请重新输入。") } else { var password = string.load("/"+ mainForm.Dir.text +".{21EC2020-3AEA-1069-A2DD-08002B30309D}/此文件夹的加密密码.config") if(mainForm.Password.text==password){ process.popen.cmd('attrib -h -s "'+mainForm.Dir.text+'.{21EC2020-3AEA-1069-A2DD-08002B30309D}"').waitOne(); fsys.delete("/"+mainForm.Dir.text+".{21EC2020-3AEA-1069-A2DD-08002B30309D}/此文件夹的加密密码.config"); process.popen.cmd('ren "'+mainForm.Dir.text+'.{21EC2020-3AEA-1069-A2DD-08002B30309D}" "'+mainForm.Dir.text+'"').waitOne(); win.msgboxTimeout("解密成功","提示",2000); } else { win.msgboxErr("密码错误!请重新输入。") } } } } mainForm.show(); return win.loopMessage();
登录后方可回帖
这是新人第一次发布帖子。我认为我自己做的这个成品还是不太满意,尤其是解锁,代码太长,效果不太好。各位大佬们可以对我提一提修改的意见。