Skip to content
View in the app

A better way to browse. Learn more.

OSBot :: 2007 OSRS Botting

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Suggestion

Featured Replies

Just an idea i've had, you should have the bot record/store player clicks when a script is not running (When a player is just playing the game), with a mass amount of players using the bot it would be great to determine better human like api

wouldn't be to hard with some organization, and since this is what jagex uses to determine if a player is botting or not we could compare them to scripts and actually see what jagex looks for

i'd work on it personally if i could

 

Yea I like it...lol but the only time we gonna play legit is when its down =P (most of us)

I can tell you from a product point of view from people like jagex they do not focus on mouse movements as that would not be a good source of information for their bot detection systems and algorithms some people in the botting community take this a little too seriously. They focus on more obvious stuff that's easy to detect.

Like Mad Turnip said, they will probably focus on continuous hours of doing the same activity over and over again. Maybe we set a limit on how long the bot can run an account? :) I have bad ideas. 

Are you referring to an artificial AI, for things like chatting and responding, etc? Sorry, didn't read the whole thread, it's late here :p

A good antiban with random generated tasks will be enough, in my opinion.

  • Developer

@ Martin:

In fact, it would be very possible for them to sketch a user mouse input profile and check for certain parameters to match profiles. There has been enough research on how to accurately even identify specific users based on the certain characteristics of movements of the mouse. However this (still) is too computationally expensive for them to do on a large scale. But they might use a similar system for accounts that are flagged and checked out by one of their employees. Then, to make sure they are correct, they could use those identification algorithms to see if the profile matches with a profile from another 100% confirmed botting profile. As their system grows, they have more options in their data set. Therefore, an important feature should be that our bot doesn't have a lot of matching profiles. A few ones that are similar is little enough, but more would be disastrous.

 

Anyways, everything is important in my eyes. An AI to create behaviour that's similar to what a human person would do, but based on a set of parameters that can be changed by the users to create differences between bots, even if they run the same script. This lowers chances on being flagged and have your accounts checked out personally by one of their employees. And then once they get to the point of verification, they find no or only a couple of matching profiles which will not be enough proof for them. This will most probably be one of the greatest advantages of our system. But we will see how it turns out for real once we release and are up and running.

  • Author

@ Martin:

In fact, it would be very possible for them to sketch a user mouse input profile and check for certain parameters to match profiles. There has been enough research on how to accurately even identify specific users based on the certain characteristics of movements of the mouse. However this (still) is too computationally expensive for them to do on a large scale. But they might use a similar system for accounts that are flagged and checked out by one of their employees. Then, to make sure they are correct, they could use those identification algorithms to see if the profile matches with a profile from another 100% confirmed botting profile. As their system grows, they have more options in their data set. Therefore, an important feature should be that our bot doesn't have a lot of matching profiles. A few ones that are similar is little enough, but more would be disastrous.

 

Anyways, everything is important in my eyes. An AI to create behaviour that's similar to what a human person would do, but based on a set of parameters that can be changed by the users to create differences between bots, even if they run the same script. This lowers chances on being flagged and have your accounts checked out personally by one of their employees. And then once they get to the point of verification, they find no or only a couple of matching profiles which will not be enough proof for them. This will most probably be one of the greatest advantages of our system. But we will see how it turns out for real once we release and are up and running.

well shit we could use my suggestion to counter this, have people play legitly and have the bot record their clicks to personalize or mimic their style of playing

would be something no bot has done, and eventually would make jagex impossible to detect if its a bot or human playing

I personally would work on this if you let me, and all we would need to do is record movement clicks and interaction clicks and the time difference between

if i'm not mistaking the client only sends this information to the client with some packets (clickPosionX, clickPositionY, cameraPositionX, cameraPositinonY)

also i doubt jagex records movement of the mouse moving across the screen, that would be way to much data for their servers to handle/interperate

it'd be 2000+ bytes just moving the mouse up and down the client

 

EDIT: also it wouldn't be a bad idea to deob the client and see exactly what jagex sends to the server regarding bots

Edited by LifezHatred

  • Author

I can tell you from a product point of view from people like jagex they do not focus on mouse movements as that would not be a good source of information for their bot detection systems and algorithms some people in the botting community take this a little too seriously. They focus on more obvious stuff that's easy to detect.

everything is mouse movements and click, theres nothing else in the game besides moving the camera and chat that doesn't require the mouse

  • Developer

EDIT: also it wouldn't be a bad idea to deob the client and see exactly what jagex sends to the server regarding bots

 

 

We have done this and will check every once in a while. And as for the recording, if everyone has their own 'signature' to movement, recording data and using it in some way would be bad as the profiles would probably match. However, it would be useful to analyze movements, errors etc. We can look into this later. Right now I think we have a pretty good solution ready to implement to make each account have a different input 'signature', which is what I think together with our mouse path algorithms will be enough to fool them to a certain extend, and don't have the bots relate to each other.

EDIT: also it wouldn't be a bad idea to deob the client and see exactly what jagex sends to the server regarding bots

 

If the 498 client is anything like the current one then we can assume the client does this: (ignore my bad naming)

 

1. Sends a packet to the client with a request to analyze all methods/fields/classes within the client

 

	static final void connectToClientObjects(int i, ByteBuffer bb, Signlink signlink) {		ClassObject co = new ClassObject();		co.classCount = bb.getUnsignedByte();		co.anInt2478 = bb.getInt();		co.aClass60Array2477 = new Connection[co.classCount];		co.aByteArrayArrayArray2476 = new byte[co.classCount][][];		co.anIntArray2474 = new int[co.classCount];		co.classConnections = new Connection[co.classCount];		co.accessTypes = new int[co.classCount];		co.anIntArray2480 = new int[co.classCount];		for (int classIndex = 0; (co.classCount ^ 0xffffffff) < (classIndex ^ 0xffffffff); classIndex++) {			try {				int accessType = bb.getUnsignedByte();				if ((accessType ^ 0xffffffff) != -1 && accessType != 1 && accessType != 2) {					/**					 * Connect to methods?					 */					if (accessType == 3 || accessType == 4) {						String methodType = new String(bb.readString().getBytes());						String methodName = new String(bb.readString().getBytes());						int methodCount = bb.getUnsignedByte();						String[] methodReturnTypes = new String[methodCount];						for (int methodPtr = 0; methodCount > methodPtr; methodPtr++)							methodReturnTypes[methodPtr] = new String(bb.readString().getBytes());						byte[][] bs = new byte[methodCount][];						if (accessType == 3) {							for (int i_37_ = 0; methodCount > i_37_; i_37_++) {								int i_38_ = bb.getInt();								bs[i_37_] = new byte[i_38_];								bb.readBytes(i_38_, bs[i_37_], 96, 0);							}						}						co.accessTypes[classIndex] = accessType;						Class[] dataTypes = new Class[methodCount];						for (int i_39_ = 0; (i_39_ ^ 0xffffffff) > (methodCount ^ 0xffffffff); i_39_++)							dataTypes[i_39_] = Class23_Sub4_Sub37.getDataType(methodReturnTypes[i_39_]);						co.aClass60Array2477[classIndex] = signlink.fetchDeclaredMethod(methodName, dataTypes, Class23_Sub4_Sub37.getDataType(methodType));						co.aByteArrayArrayArray2476[classIndex] = bs;					}				} else {					/**					 * Connect to fields					 */					String fieldType = new String(bb.readString().getBytes());					int multipler = 0;					String fieldName = new String(bb.readString().getBytes());					if (accessType == 1) {						multipler = bb.getInt();					}					co.accessTypes[classIndex] = accessType;					co.anIntArray2474[classIndex] = multipler;					co.classConnections[classIndex] = signlink.fetchDeclaredField(Class23_Sub4_Sub37.getDataType(fieldType), fieldName);				}			} catch (ClassNotFoundException classnotfoundexception) {				co.anIntArray2480[classIndex] = -1;			} catch (SecurityException securityexception) {				co.anIntArray2480[classIndex] = -2;			} catch (NullPointerException nullpointerexception) {				co.anIntArray2480[classIndex] = -3;			} catch (Exception exception) {				co.anIntArray2480[classIndex] = -4;			} catch (Throwable throwable) {				co.anIntArray2480[classIndex] = -5;			}		}		StaticMembers.clientClasses.setReverseNext(co);	}

2. The client (if you're logged in) will then proceed to analyze all of the fields/methods/classes and send a packet to the server with the information. 

 

 

static final void checkForInjection(EncryptedBuffer buffer, int opcode) {		for (;;) {			ClassObject classObj = (ClassObject) StaticMembers.clientClasses.reverseGetFirst();			if (classObj == null) {				break;			}			boolean unmodified = false;			for (int i_18_ = 0; (classObj.classCount ^ 0xffffffff) < (i_18_ ^ 0xffffffff); i_18_++) {				if (classObj.classConnections[i_18_] != null) {					if (classObj.classConnections[i_18_].status == 2) {						classObj.anIntArray2480[i_18_] = -5;					}					if (classObj.classConnections[i_18_].status == 0) {						unmodified = true;					}				}				if (classObj.aClass60Array2477[i_18_] != null) {					if (classObj.aClass60Array2477[i_18_].status == 2) {						classObj.anIntArray2480[i_18_] = -6;					}					if (classObj.aClass60Array2477[i_18_].status == 0) {						unmodified = true;					}				}			}			if (unmodified) {				break;			}			buffer.putOpCode(opcode);			buffer.putByte(0);			int headerSize = buffer.position;			buffer.putInt(classObj.anInt2478);			for (int i_20_ = 0; (classObj.classCount ^ 0xffffffff) < (i_20_ ^ 0xffffffff); i_20_++) {				if ((classObj.anIntArray2480[i_20_] ^ 0xffffffff) != -1) {					buffer.putByte(classObj.anIntArray2480[i_20_]);				} else {					try {						int i_21_ = classObj.accessTypes[i_20_];						if (i_21_ != 0) {							if (i_21_ != 1) {								if (i_21_ == 2) {									Field field = (Field) classObj.classConnections[i_20_].nodeObject;									int mod = field.getModifiers();									buffer.putByte(0);									buffer.putInt(mod);								}							} else {								Field field = (Field) classObj.classConnections[i_20_].nodeObject;								field.setInt(null, classObj.anIntArray2474[i_20_]);								buffer.putByte(0);							}						} else {							Field field = (Field) classObj.classConnections[i_20_].nodeObject;							int i_23_ = field.getInt(null);							buffer.putByte(0);							buffer.putInt(i_23_);						}						if (i_21_ != 3) {							if (i_21_ == 4) {								Method method = (Method) classObj.aClass60Array2477[i_20_].nodeObject;								int mod = method.getModifiers();								buffer.putByte(0);								buffer.putInt(mod);							}						} else {							Method method = (Method) classObj.aClass60Array2477[i_20_].nodeObject;							byte[][] bs = classObj.aByteArrayArrayArray2476[i_20_];							Object[] objects = new Object[bs.length];							for (int i_25_ = 0; (bs.length ^ 0xffffffff) < (i_25_ ^ 0xffffffff); i_25_++) {								ObjectInputStream objectinputstream = new ObjectInputStream(new ByteArrayInputStream(bs[i_25_]));								objects[i_25_] = objectinputstream.readObject();							}							Object object = method.invoke(null, objects);							if (object == null) {								buffer.putByte(0);							} else if (!(object instanceof Number)) {								if (object instanceof JagexString) {									buffer.putByte(2);									buffer.putJagexString((JagexString) object);								} else {									buffer.putByte(4);								}							} else {								buffer.putByte(1);								buffer.putLong(((Number) object).longValue());							}						}					} catch (ClassNotFoundException classnotfoundexception) {						buffer.putByte(-10);					} catch (java.io.InvalidClassException invalidclassexception) {						buffer.putByte(-11);					} catch (java.io.StreamCorruptedException streamcorruptedexception) {						buffer.putByte(-12);					} catch (java.io.OptionalDataException optionaldataexception) {						buffer.putByte(-13);					} catch (IllegalAccessException illegalaccessexception) {						buffer.putByte(-14);					} catch (IllegalArgumentException illegalargumentexception) {						buffer.putByte(-15);					} catch (java.lang.reflect.InvocationTargetException invocationtargetexception) {						buffer.putByte(-16);					} catch (SecurityException securityexception) {						buffer.putByte(-17);					} catch (java.io.IOException ioexception) {						buffer.putByte(-18);					} catch (NullPointerException nullpointerexception) {						buffer.putByte(-19);					} catch (Exception exception) {						buffer.putByte(-20);					} catch (Throwable throwable) {						buffer.putByte(-21);					}				}			}			buffer.method431(headerSize);			buffer.putSizeByte(-headerSize + buffer.position);			classObj.unlink();		}

I presume they only target users who are flagged, as this would be very costly to run for every user.

 

Posted for those interested. 

Edited by harlan

Want a refactored 464? Probably a lot closer and more relevant to the 468 which is 07's revision.

Edited by Sensational

Guest
This topic is now closed to further replies.

Recently Browsing 0

  • No registered users viewing this page.

Account

Navigation

Search

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.