这段代码我想很多人都看过了
不过有很多地方不是很明白
麻烦各位看下
import java.lang.reflect.Method;
import java.util.prefs.Preferences;public class RegHack {
/*这下面的0x800000001是什么呢?源代码里面说的Native_Handl?*/
private static final int HKEY_CURRENT_USER = 0x80000001; private static final int KEY_QUERY_VALUE = 1; private static final int KEY_SET_VALUE = 2;
private static final int KEY_READ = 0x20019; public static void main(String args[]) {
final Preferences userRoot = Preferences.userRoot();
final Class clz = userRoot.getClass();
try {
/*访问注册表做查询之类的 是不是就要先打开*/
final Method mOpenKey = clz.getDeclaredMethod("openKey",
byte[].class, int.class, int.class);
mOpenKey.setAccessible(true); final Method mCloseKey = clz.getDeclaredMethod("closeKey",
int.class);
mCloseKey.setAccessible(true); final Method mWinRegQueryValue = clz.getDeclaredMethod(
"WindowsRegQueryValueEx", int.class, byte[].class);
mWinRegQueryValue.setAccessible(true);
final Method mWinRegEnumValue = clz.getDeclaredMethod(
"WindowsRegEnumValue1", int.class, int.class, int.class);
mWinRegEnumValue.setAccessible(true);
final Method mWinRegQueryInfo = clz.getDeclaredMethod(
"WindowsRegQueryInfoKey1", int.class);
mWinRegQueryInfo.setAccessible(true); final String subKey = "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings";
/*这个hSettings.intValue()的值是什么呢?为什么即使上面路径不存在也是大于 -1*/
Integer hSettings = (Integer) mOpenKey.invoke(userRoot,
toByteArray(subKey), KEY_READ, KEY_READ);
byte[] b = (byte[]) mWinRegQueryValue.invoke(userRoot, hSettings
.intValue(), toByteArray("ProxyServer"));
String s = b != null ? new String(b).trim() : null;
System.out.println(s);
mCloseKey.invoke(Preferences.userRoot(), hSettings); } catch (Exception e) {
e.printStackTrace();
}
} private static byte[] toByteArray(String str) {
byte[] result = new byte[str.length() + 1];
for (int i = 0; i < str.length(); i++) {
result[i] = (byte) str.charAt(i);
}
result[str.length()] = 0;
return result;
}
}
不过有很多地方不是很明白
麻烦各位看下
import java.lang.reflect.Method;
import java.util.prefs.Preferences;public class RegHack {
/*这下面的0x800000001是什么呢?源代码里面说的Native_Handl?*/
private static final int HKEY_CURRENT_USER = 0x80000001; private static final int KEY_QUERY_VALUE = 1; private static final int KEY_SET_VALUE = 2;
private static final int KEY_READ = 0x20019; public static void main(String args[]) {
final Preferences userRoot = Preferences.userRoot();
final Class clz = userRoot.getClass();
try {
/*访问注册表做查询之类的 是不是就要先打开*/
final Method mOpenKey = clz.getDeclaredMethod("openKey",
byte[].class, int.class, int.class);
mOpenKey.setAccessible(true); final Method mCloseKey = clz.getDeclaredMethod("closeKey",
int.class);
mCloseKey.setAccessible(true); final Method mWinRegQueryValue = clz.getDeclaredMethod(
"WindowsRegQueryValueEx", int.class, byte[].class);
mWinRegQueryValue.setAccessible(true);
final Method mWinRegEnumValue = clz.getDeclaredMethod(
"WindowsRegEnumValue1", int.class, int.class, int.class);
mWinRegEnumValue.setAccessible(true);
final Method mWinRegQueryInfo = clz.getDeclaredMethod(
"WindowsRegQueryInfoKey1", int.class);
mWinRegQueryInfo.setAccessible(true); final String subKey = "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings";
/*这个hSettings.intValue()的值是什么呢?为什么即使上面路径不存在也是大于 -1*/
Integer hSettings = (Integer) mOpenKey.invoke(userRoot,
toByteArray(subKey), KEY_READ, KEY_READ);
byte[] b = (byte[]) mWinRegQueryValue.invoke(userRoot, hSettings
.intValue(), toByteArray("ProxyServer"));
String s = b != null ? new String(b).trim() : null;
System.out.println(s);
mCloseKey.invoke(Preferences.userRoot(), hSettings); } catch (Exception e) {
e.printStackTrace();
}
} private static byte[] toByteArray(String str) {
byte[] result = new byte[str.length() + 1];
for (int i = 0; i < str.length(); i++) {
result[i] = (byte) str.charAt(i);
}
result[str.length()] = 0;
return result;
}
}
可是要怎么做呢?它又没有NodeExists方法
/*这个hSettings.intValue()的值是什么呢?为什么即使上面路径不存在也是大于 -1*/ Integer hSettings = (Integer) mOpenKey.invoke(userRoot,
toByteArray(subKey), KEY_READ, KEY_READ); 本来想用这个判断 可是该怎么做呢?或者是用这个查询?
byte[] b = (byte[]) mWinRegQueryValue.invoke(userRoot, hSettings
.intValue(), toByteArray("ProxyServer")); 如果用这个查询 这个是查Value的 怎么查键呢?
网络上也已经有人提供了访问注册表的包, 可以使用.
想自由操作的话,估计得要JNI了
现在算是可以自由访问注册表了
注册表的键值可以类似这样定义
final String subKey = "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings"; 接着这样做
public static int[] openKey1(int hkey, byte[] windowsAbsolutePath,
int securityMask) throws Exception {
Class theClass = Class.forName("java.util.prefs.WindowsPreferences");
Method m = theClass.getDeclaredMethod("WindowsRegOpenKey", new Class[] {
int.class, byte[].class, int.class });
m.setAccessible(true);
Object ret = m.invoke(null, new Object[] { new Integer(hkey),
windowsAbsolutePath, new Integer(securityMask) });
return (int[]) ret;
}
int[] result = openKey1(hkey, Path, KEY_QUERY_VALUE);
/*判断*/
if (result[0] != 0) {../*说明不存在*/.........}大致就是这样
要用到的主要有这连个
import java.lang.reflect.*;
import java.util.prefs.*;谢谢各位回复 结贴 散分