java 如何防止恶意注册表,java操作注册表实现禁用指定程序

首先,介绍一下 用注册表编辑器实现禁用指定软件的操作:

禁止用户运行记事本(notepad.exe)和计算器(cal.Exe):

首先在注册表项HKEY_CURRENT_USER\Software\Microsoft \Windows\CurrentVersion\Policies\Explorer中,新建一个双字节值项DisallowRun,修改其值为1,以允许我们定义禁止允许的程序,然后新建一个注册表项HKEY_CURRENT_USER\Software\Microsoft\ Windows\Current Version\Policies\Explorer\DisallowRun,在其下新建两个字符串值项。第一个值项的名称为1,值为notepad.exe,第二个值项为2,值为calc.exe。如果想禁止更多的程序,可以依次建立名称为3、4等顺序往下排列的值项。修改注册表后立即生效。这时想通过"开始"菜单运行记事本和计算器程序,系统会提示不能进行此操作。

注意:用户在Windows NT/2000/XP的命令解释器(CMD.exe)窗口中,仍然可以通过输入"notepad.exe"运行记事本。这是因为DisallowRun禁止的只是通过资源管理器Explorer运行的程序,记事本不是通过Explorer启动的,所以就无法禁止了。如果不希望用户可以通过命令解释器运行程序,应该在DisallowRun中将命令解释器(CMD.exe)禁止。另外,此方式还有一个不安全之处,就是如果用户将记事本程序"notepad.exe"更改名称,如改成"note.exe",用户就可以运行它了。

二.用jRegistry 来操作注册表

jRegistry它是用JNI来封装WINDOWS注册表API,方便了java开发者访问windows注册表。首先介绍一下jRegistryKey.jar和jRegistryKey.dll,这两个文件是使用jRegistry来操作注册表所必需的文件:一个是jar包,是一个包括了java类的文件;一个是动态链接库文件jRegistryKey.dll,提供了访问注册表所需的本地代码(即C/C++)。

1.将jRegistryKey.jar导入eclipse工程中。(这个就不详细介绍了,不会的google去)

2.将jRegistryKey.dll文件copy到D:\WINDOWS\system32下(我的操作系统装在D盘)

代码分析:

1.在RootKey.HKEY_CURRENT_USER\Software下创建cto子项

RegistryKeycto=newRegistryKey(RootKey.HKEY_CURRENT_USER,  "Software\\cto");

cto.create();

RegistryKeycto=newRegistryKey(RootKey.HKEY_CURRENT_USER, "Software\\cto");

cto.createSubkey("51cto");

2.删除cto子项

try {

RegistryKey cto=newRegistryKey(RootKey.HKEY_CURRENT_USER,  "Software\\cto");

cto.delete();

}

catch(RegistryException re) {

re.printStackTrace();

}

3.查看RootKey.HKEY_CURRENT_USER/Software/Adobe下的子项

RegistryKeyadobe=newRegistryKey(RootKey.HKEY_CURRENT_USER, "Software\\Adobe");

if(adobe .hasSubkeys()) {

Iterator i=adobe.subkeys();

while(i.hasNext()) {

RegistryKey x= (RegistryKey)i.next();

System.out.println(x.toString());

} // while

}

77516c68f163d2facbe12af5d8bcbba4.png

运行结果:

71d99445de5d5a8fc46fe58d625db49b.png

4.枚举某子项的所有值(v.toString是获得子项的值,值包括名称,类型,数据。若获得子项对应的值数据用v.getData().toString())

RegistryKeyr=newRegistryKey(RootKey.HKEY_CURRENT_USER, "Software\\360desktop");

if(r.hasValues()) {

Iterator i=r.values();

while(i.hasNext()) {

RegistryValue v= (RegistryValue)i.next();

System.out.println(v.toString());

} // while

}

a553c0f31d0bceb60ba5fef0b2de618b.png

运行结果:

5c697926c222c28c7998da8a0681c35f.png

5.读指定子项的值

RegistryKeyr=newRegistryKey(RootKey.HKEY_CURRENT_USER,  "Software\\360desktop");

if(r.hasValue("appinstall1")) {

RegistryValue v=r.getValue("appinstall1");

System.out.println(v.toString());//

}

运行结果:

b89c2b12d52c3388a7b29c791c325d4c.png

6.设置注册表中项的值

RegistryKeyr=newRegistryKey(RootKey.HKEY_CURRENT_USER,

"Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer");

RegistryValue v=newRegistryValue("DisallowRun", ValueType.REG_DWORD, 1);

r.setValue(v);

52f63ba78cfd2538ea5721118a6618e3.png

下面实现文章上文提到的修改注册表禁用记事本的操作:

package test;

import ca.beq.util.win32.registry.RegistryKey;

import ca.beq.util.win32.registry.RegistryValue;

import ca.beq.util.win32.registry.RootKey;

import ca.beq.util.win32.registry.ValueType;

public class JregistryTest {

public static void main(String[] args) {

RegistryKey r=newRegistryKey(RootKey.HKEY_CURRENT_USER,

"Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer");

//创建一个DWORD类型的值,值数据为1

RegistryValue v=newRegistryValue("DisallowRun", ValueType.REG_DWORD, 1);

//Explorer项中添加值v

r.setValue(v);

//在Explorer下创建子项disallowRun

RegistryKey disallowRun=r.createSubkey("DisallowRun");

disallowRun.setValue(new RegistryValue("1",ValueType.REG_SZ, "notepad.exe"));

}

}

参照了很多贴子,代码都是自己编的,不够整洁,但功能实现了。

如果想进一步了解的同学,建议下载相应的javadoc看看,api里的类不多,很容易掌握

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值