Smartzkid
2011-02-03 19:20:31
Right now, RSBot is down. Imagine how many people are out there looking for a bot. Now consider how convenient it would be to have the ability to click a button and have RSBot account details instantly saved for SRL scripts to use.
Discuss.
If anyone's interested, here's some hacked together java code that can read RSBot account files (and derivatives, likely). To use it, run it in the command line or pipe it to a text file.
[php]import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.UnsupportedEncodingException;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Map;
import java.util.TreeMap;
public class main {
private static final String[] VALID_KEYS = { "password", "pin", "reward", "member", "take_breaks" };
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String key;
try
{
InetAddress localInetAddress = InetAddress.getLocalHost();
NetworkInterface localNetworkInterface = NetworkInterface.getByInetAddress(localInetAddress);
key = new String(localNetworkInterface.getHardwareAddress());
} catch (Exception localException) {
key = System.getProperty("user.name") + System.getProperty("user.language");
}
Map<String, Map<String,String>> accounts = loadAccounts(key);
String output = accounts.toString();
output = output.replaceAll("}, ", "\n");
output = output.replace('{', ' ');
output = output.substring(1, output.length() - 2);
System.out.println(output);
}
public static String getAccountsFile()
{
String str;
String str1 = System.getProperty("os.name");
if (str1.contains("Windows"))
str = new StringBuilder().append(System.getenv("APPDATA")).append(File.separator).append("RSBot").append("_Accounts.ini").toString();
else
str = new StringBuilder().append(getUnixHome()).append(File.separator).append(".").append("RSBot".toLowerCase()).append("acct").toString();
return str;
}
public static String getUnixHome() {
String str = System.getProperty("user.home");
return str == null ? "~" : str;
}
private static Map<String, Map<String, String>> loadAccounts(String key)
{
TreeMap localTreeMap = new TreeMap();
Object localObject = null;
File localFile = new File(getAccountsFile());
if (localFile.exists()) {
try {
BufferedReader localBufferedReader = new BufferedReader(new FileReader(localFile));
String str2 = "";
String str1;
while ((str1 = localBufferedReader.readLine()) != null) {
if ((str1.startsWith("[")) && (str1.endsWith("]"))) {
if (!str2.isEmpty()) {
localTreeMap.put(fixName(str2), localObject);
}
str2 = str1.trim().substring(1).substring(0, str1.length() - 2);
localObject = new TreeMap();
continue;
}
if ((localObject == null) || (!str1.matches("^\\w+=.+$")) ||
(str2.isEmpty())) {
continue;
}
String[] arrayOfString = str1.trim().split("=");
if (isValidKey(arrayOfString[0])) {
String str3 = arrayOfString[1];
if ((arrayOfString[0].equals("pin")) &&
(!isValidPin(str3))) {
System.out.println("Invalid pin '" + str3 + "' on account: " + str2 + " (ignored)");
str3 = null;
}
if (arrayOfString[0].equals("password")) {
str3 = cipher(str3, false, key);
}
((TreeMap)localObject).put(arrayOfString[0], str3);
}
}
if (!str2.isEmpty()) {
localTreeMap.put(fixName(str2), localObject);
}
localBufferedReader.close();
} catch (Exception localException) {
localException.printStackTrace();
}
}
return (Map<String, Map<String, String>>)localTreeMap;
}
private static boolean isValidPin(String paramString)
{
if (paramString.length() == 4) {
for (int i = 0; i < paramString.length(); i++) {
int j = paramString.charAt(i);
if ((j < 48) || (j > 57)) {
return false;
}
}
return true;
}
return false;
}
private static String fixName(String paramString)
{
if (paramString.charAt(0) > '[') {
paramString = (char)(paramString.charAt(0) - ' ') + paramString.substring(1);
}
if (!paramString.contains("@")) {
paramString = paramString.replaceAll("\\s", "_");
}
return paramString;
}
private static boolean isValidKey(String paramString)
{
for (String str : VALID_KEYS)
if (paramString.equalsIgnoreCase(str))
return true;
return false;
}
private static byte[] SHA1(String paramString) throws NoSuchAlgorithmException, UnsupportedEncodingException {
MessageDigest localMessageDigest = MessageDigest.getInstance("SHA-1");
localMessageDigest.update(paramString.getBytes("iso-8859-1"), 0, paramString.length());
return localMessageDigest.digest();
}
private static String cipher(String paramString, boolean paramBoolean, String key)
{
if (paramString == null)
return null;
byte[] arrayOfByte1;
try
{
arrayOfByte1 = SHA1(key);
} catch (NoSuchAlgorithmException localNoSuchAlgorithmException) {
localNoSuchAlgorithmException.printStackTrace();
return paramString;
} catch (UnsupportedEncodingException localUnsupportedEncodingException) {
localUnsupportedEncodingException.printStackTrace();
return paramString;
}
if (paramBoolean) {
Object localObject = "";
byte[] arrayOfByte2 = paramString.getBytes();
for (int i = 0; i < arrayOfByte1.length; i++) {
if (i < paramString.length())
localObject = (String)localObject + (arrayOfByte1 + arrayOfByte2) + "a";
else {
localObject = (String)localObject + arrayOfByte1 + "a";
}
}
return ((String)localObject).substring(0, ((String)localObject).length() - "a".length());
}
String[] localObject = paramString.split("a");
byte[] arrayOfByte2 = new byte[localObject.length];
int i;
for (i = 0; i < arrayOfByte1.length; i++) {
int j = Integer.parseInt(localObject);
if (arrayOfByte1 == j) {
break;
}
arrayOfByte2 = (byte)(j - arrayOfByte1);
}
return (String)new String(arrayOfByte2, 0, i);
}
}
[/php]
Discuss.
If anyone's interested, here's some hacked together java code that can read RSBot account files (and derivatives, likely). To use it, run it in the command line or pipe it to a text file.
[php]import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.UnsupportedEncodingException;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Map;
import java.util.TreeMap;
public class main {
private static final String[] VALID_KEYS = { "password", "pin", "reward", "member", "take_breaks" };
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String key;
try
{
InetAddress localInetAddress = InetAddress.getLocalHost();
NetworkInterface localNetworkInterface = NetworkInterface.getByInetAddress(localInetAddress);
key = new String(localNetworkInterface.getHardwareAddress());
} catch (Exception localException) {
key = System.getProperty("user.name") + System.getProperty("user.language");
}
Map<String, Map<String,String>> accounts = loadAccounts(key);
String output = accounts.toString();
output = output.replaceAll("}, ", "\n");
output = output.replace('{', ' ');
output = output.substring(1, output.length() - 2);
System.out.println(output);
}
public static String getAccountsFile()
{
String str;
String str1 = System.getProperty("os.name");
if (str1.contains("Windows"))
str = new StringBuilder().append(System.getenv("APPDATA")).append(File.separator).append("RSBot").append("_Accounts.ini").toString();
else
str = new StringBuilder().append(getUnixHome()).append(File.separator).append(".").append("RSBot".toLowerCase()).append("acct").toString();
return str;
}
public static String getUnixHome() {
String str = System.getProperty("user.home");
return str == null ? "~" : str;
}
private static Map<String, Map<String, String>> loadAccounts(String key)
{
TreeMap localTreeMap = new TreeMap();
Object localObject = null;
File localFile = new File(getAccountsFile());
if (localFile.exists()) {
try {
BufferedReader localBufferedReader = new BufferedReader(new FileReader(localFile));
String str2 = "";
String str1;
while ((str1 = localBufferedReader.readLine()) != null) {
if ((str1.startsWith("[")) && (str1.endsWith("]"))) {
if (!str2.isEmpty()) {
localTreeMap.put(fixName(str2), localObject);
}
str2 = str1.trim().substring(1).substring(0, str1.length() - 2);
localObject = new TreeMap();
continue;
}
if ((localObject == null) || (!str1.matches("^\\w+=.+$")) ||
(str2.isEmpty())) {
continue;
}
String[] arrayOfString = str1.trim().split("=");
if (isValidKey(arrayOfString[0])) {
String str3 = arrayOfString[1];
if ((arrayOfString[0].equals("pin")) &&
(!isValidPin(str3))) {
System.out.println("Invalid pin '" + str3 + "' on account: " + str2 + " (ignored)");
str3 = null;
}
if (arrayOfString[0].equals("password")) {
str3 = cipher(str3, false, key);
}
((TreeMap)localObject).put(arrayOfString[0], str3);
}
}
if (!str2.isEmpty()) {
localTreeMap.put(fixName(str2), localObject);
}
localBufferedReader.close();
} catch (Exception localException) {
localException.printStackTrace();
}
}
return (Map<String, Map<String, String>>)localTreeMap;
}
private static boolean isValidPin(String paramString)
{
if (paramString.length() == 4) {
for (int i = 0; i < paramString.length(); i++) {
int j = paramString.charAt(i);
if ((j < 48) || (j > 57)) {
return false;
}
}
return true;
}
return false;
}
private static String fixName(String paramString)
{
if (paramString.charAt(0) > '[') {
paramString = (char)(paramString.charAt(0) - ' ') + paramString.substring(1);
}
if (!paramString.contains("@")) {
paramString = paramString.replaceAll("\\s", "_");
}
return paramString;
}
private static boolean isValidKey(String paramString)
{
for (String str : VALID_KEYS)
if (paramString.equalsIgnoreCase(str))
return true;
return false;
}
private static byte[] SHA1(String paramString) throws NoSuchAlgorithmException, UnsupportedEncodingException {
MessageDigest localMessageDigest = MessageDigest.getInstance("SHA-1");
localMessageDigest.update(paramString.getBytes("iso-8859-1"), 0, paramString.length());
return localMessageDigest.digest();
}
private static String cipher(String paramString, boolean paramBoolean, String key)
{
if (paramString == null)
return null;
byte[] arrayOfByte1;
try
{
arrayOfByte1 = SHA1(key);
} catch (NoSuchAlgorithmException localNoSuchAlgorithmException) {
localNoSuchAlgorithmException.printStackTrace();
return paramString;
} catch (UnsupportedEncodingException localUnsupportedEncodingException) {
localUnsupportedEncodingException.printStackTrace();
return paramString;
}
if (paramBoolean) {
Object localObject = "";
byte[] arrayOfByte2 = paramString.getBytes();
for (int i = 0; i < arrayOfByte1.length; i++) {
if (i < paramString.length())
localObject = (String)localObject + (arrayOfByte1 + arrayOfByte2) + "a";
else {
localObject = (String)localObject + arrayOfByte1 + "a";
}
}
return ((String)localObject).substring(0, ((String)localObject).length() - "a".length());
}
String[] localObject = paramString.split("a");
byte[] arrayOfByte2 = new byte[localObject.length];
int i;
for (i = 0; i < arrayOfByte1.length; i++) {
int j = Integer.parseInt(localObject);
if (arrayOfByte1 == j) {
break;
}
arrayOfByte2 = (byte)(j - arrayOfByte1);
}
return (String)new String(arrayOfByte2, 0, i);
}
}
[/php]
