• We see that you're not registered. Please read this thread and if you want, sign up on the forum.

Tutorial [Ultimate Guide] How to Write a Runescape Injection Bot

Shenandoah

Access Write Violation
Admin
Legend
Joined
Nov 1, 2019
Posts
93
Points
18
Reaction score
52
Quality Posts
1
Have a look at this gyazo -> https://gyazo.com/e6fd345c9ef9857c33cc5a90c8f5f6d0

If you pause the video, you can see the the image and text being loaded before the client does, so i'm assuming it loads the graphics first then runs the client which makes it disappear. Any idea?

Oh, I see what the problem is. Not sure why it worked on the Mac though, unless the client didn't fully load on the Mac.

I actually confused myself earlier. The thread is only created once, but it draws the string only once. This means that when the client starts redrawing what's on the screen, it resets the canvas and that makes the text and image disappear. A way to remedy this is to place the code in the run method inside the Thread instance inside an infinite while loop, so that it never exits the run method.


Java:
Thread thread = new Thread(new Runnable() {

                @Override
                public void run() {
                    while(true) {
                        g.setColor(Color.RED);
                           g.drawString("Some string here!", 100, 100);
                    }
                }
            });
 

abdul

New member
Joined
Apr 27, 2020
Posts
20
Points
3
Reaction score
6
Quality Posts
Oh, I see what the problem is. Not sure why it worked on the Mac though, unless the client didn't fully load on the Mac.

I actually confused myself earlier. The thread is only created once, but it draws the string only once. This means that when the client starts redrawing what's on the screen, it resets the canvas and that makes the text and image disappear. A way to remedy this is to place the code in the run method inside the Thread instance inside an infinite while loop, so that it never exits the run method.


Java:
Thread thread = new Thread(new Runnable() {

                @Override
                public void run() {
                    while(true) {
                        g.setColor(Color.RED);
                           g.drawString("Some string here!", 100, 100);
                    }
                }
            });

It worked! :love:

I just have a question, i'm not an expert here but isn't having a while loop that will forever draw the graphics a bad thing in terms of memory etc..
 

Shenandoah

Access Write Violation
Admin
Legend
Joined
Nov 1, 2019
Posts
93
Points
18
Reaction score
52
Quality Posts
1
It worked! :love:

I just have a question, i'm not an expert here but isn't having a while loop that will forever draw the graphics a bad thing in terms of memory etc..
I don't think it's necessarily bad for memory issues specifically, but the way it's done in the tutorial is definitely a bad way to do it. It's just an ad hoc solution to the problem of drawing on the canvas, but it's not necessarily a good solution. Maybe you can find a better way? ;)
 

Shenandoah

Access Write Violation
Admin
Legend
Joined
Nov 1, 2019
Posts
93
Points
18
Reaction score
52
Quality Posts
1
Have a look at this -> https://gyazo.com/cbfafc697fffb3cfd3f893b5afa642bc
How would you even start to deobfuscate a rsps like this 🤯🤯🤯 and that's only some of the files :cry:
Look in the MANIFEST file for the name of the Main class, and start looking into how that class works, and move on from there. I hope you understand that reverse engineering is a really complicated process, and it's not supposed to be easy. :p
 

abdul

New member
Joined
Apr 27, 2020
Posts
20
Points
3
Reaction score
6
Quality Posts
Look in the MANIFEST file for the name of the Main class, and start looking into how that class works, and move on from there. I hope you understand that reverse engineering is a really complicated process, and it's not supposed to be easy. :p

Found it, was able to see that they have a class called a with JFrame variable a
1588099147951.png


1588099206219.png


not much but its something at least :/ 🙏
 

aoredon

New member
Joined
Apr 30, 2020
Posts
4
Points
1
Reaction score
0
Quality Posts
Hi,

This tutorial is actually amazing. Thank you so much, it really helped me fill in the blank spaces in-between that I didn't know while I've been trying to figure this all out.

I've completed the tutorial basically, but the part that I can't get working is related to the interfaces.

I basically have identical to the tutorial, but I get errors when trying to add my custom interface to the ClassNode.

Java:
package com.alexander.runeo.transform.transformers;

import com.alexander.runeo.transform.ClassTransformer;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.tree.*;

public class ClientClassTransformer extends ClassTransformer {
    @Override
    public void transform(ClassNode node) {
        try {
            System.out.println(Class.forName("com.alexander.runeo.transform.api.APIClientInterface").getSimpleName());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        for (String internal : node.interfaces) {
            System.out.println(internal);
        }

        node.interfaces.add("com/alexander/runeo/transform/api/APIClientInterface");

        MethodNode methodNode = new MethodNode(Opcodes.ACC_PUBLIC, "helloWorld", "(Ljava/lang/String;)V", null, null);
        methodNode.instructions.add(new FieldInsnNode(Opcodes.GETSTATIC,
                "java/lang/System",
                "out",
                "Ljava/io/PrintStream;"));
        methodNode.instructions.add(new VarInsnNode(Opcodes.ALOAD, 1));
        methodNode.instructions.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL,
                "java/io/PrintStream",
                "println", "(Ljava/lang/String;)V"));
        methodNode.instructions.add(new InsnNode(Opcodes.RETURN));

        int size = methodNode.instructions.size();
        methodNode.visitMaxs(size, size);
        methodNode.visitEnd();

        node.methods.add(methodNode);
    }
}
I just wanted to make a method which is called "helloWorld", takes in a string as the first argument and then outputs that string. I managed to do that and then I could invoke that method through reflection really easily, but for some reason I get this error when adding the interface:

Code:
Exception in thread "main" java.lang.NoClassDefFoundError: com/alexander/runeo/transform/api/APIClientInterface
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at com.alexander.runeo.loader.ClientLoader.loadClass(ClientLoader.java:53)
    at com.alexander.runeo.loader.ClientLoader.loadClassFromFile(ClientLoader.java:37)
    at com.alexander.runeo.loader.ClientLoader.<init>(ClientLoader.java:22)
    at com.alexander.runeo.Runeo.start(Runeo.java:39)
    at com.alexander.runeo.Main.main(Main.java:6)
Caused by: java.lang.ClassNotFoundException: com.alexander.runeo.transform.api.APIClientInterface
    at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 16 more
As you can see, I specified the correct package path to the class itself, but I still get this error. It works when I use the built-in List interface, and it even works when I use an obfuscated interface from the Runescape package, but when I use it for my own class, it's like it can't see it.

I've tried with and without the package, and from my try/catch statement above you can see I try get the class and print its name out. This executes perfectly and prints "APIClientInterface".

Is there something I might've misconfigured in project?
 

Shenandoah

Access Write Violation
Admin
Legend
Joined
Nov 1, 2019
Posts
93
Points
18
Reaction score
52
Quality Posts
1
Hi,

This tutorial is actually amazing. Thank you so much, it really helped me fill in the blank spaces in-between that I didn't know while I've been trying to figure this all out.

I've completed the tutorial basically, but the part that I can't get working is related to the interfaces.

I basically have identical to the tutorial, but I get errors when trying to add my custom interface to the ClassNode.

Java:
package com.alexander.runeo.transform.transformers;

import com.alexander.runeo.transform.ClassTransformer;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.tree.*;

public class ClientClassTransformer extends ClassTransformer {
    @Override
    public void transform(ClassNode node) {
        try {
            System.out.println(Class.forName("com.alexander.runeo.transform.api.APIClientInterface").getSimpleName());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        for (String internal : node.interfaces) {
            System.out.println(internal);
        }

        node.interfaces.add("com/alexander/runeo/transform/api/APIClientInterface");

        MethodNode methodNode = new MethodNode(Opcodes.ACC_PUBLIC, "helloWorld", "(Ljava/lang/String;)V", null, null);
        methodNode.instructions.add(new FieldInsnNode(Opcodes.GETSTATIC,
                "java/lang/System",
                "out",
                "Ljava/io/PrintStream;"));
        methodNode.instructions.add(new VarInsnNode(Opcodes.ALOAD, 1));
        methodNode.instructions.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL,
                "java/io/PrintStream",
                "println", "(Ljava/lang/String;)V"));
        methodNode.instructions.add(new InsnNode(Opcodes.RETURN));

        int size = methodNode.instructions.size();
        methodNode.visitMaxs(size, size);
        methodNode.visitEnd();

        node.methods.add(methodNode);
    }
}
I just wanted to make a method which is called "helloWorld", takes in a string as the first argument and then outputs that string. I managed to do that and then I could invoke that method through reflection really easily, but for some reason I get this error when adding the interface:

Code:
Exception in thread "main" java.lang.NoClassDefFoundError: com/alexander/runeo/transform/api/APIClientInterface
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at com.alexander.runeo.loader.ClientLoader.loadClass(ClientLoader.java:53)
    at com.alexander.runeo.loader.ClientLoader.loadClassFromFile(ClientLoader.java:37)
    at com.alexander.runeo.loader.ClientLoader.<init>(ClientLoader.java:22)
    at com.alexander.runeo.Runeo.start(Runeo.java:39)
    at com.alexander.runeo.Main.main(Main.java:6)
Caused by: java.lang.ClassNotFoundException: com.alexander.runeo.transform.api.APIClientInterface
    at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 16 more
As you can see, I specified the correct package path to the class itself, but I still get this error. It works when I use the built-in List interface, and it even works when I use an obfuscated interface from the Runescape package, but when I use it for my own class, it's like it can't see it.

I've tried with and without the package, and from my try/catch statement above you can see I try get the class and print its name out. This executes perfectly and prints "APIClientInterface".

Is there something I might've misconfigured in project?
Okay, so we definitely know that the error is caused by some sort of issue with finding the class, most likely due to the path. Here's what I recommend you to try:

Remove one part of the entire path and see if it starts working eventually. So, since you've already tried the entire path, try removing "com/" from it and see if that works. If it doesn't, remove the next part which is "alexander/". Still doesn't work? Remove "runeo/". And so on.

Also, one thing you could try as well is to simply restart the IDE. Sometimes, especially if you're using Eclipse, it can act up and be a little buggy.

By the way, totally unrelated question but, how did you find this tutorial? I see this sudden influx of new members, but I have no idea where they're coming from. :p
 

aoredon

New member
Joined
Apr 30, 2020
Posts
4
Points
1
Reaction score
0
Quality Posts
Okay, so we definitely know that the error is caused by some sort of issue with finding the class, most likely due to the path. Here's what I recommend you to try:

Remove one part of the entire path and see if it starts working eventually. So, since you've already tried the entire path, try removing "com/" from it and see if that works. If it doesn't, remove the next part which is "alexander/". Still doesn't work? Remove "runeo/". And so on.

Also, one thing you could try as well is to simply restart the IDE. Sometimes, especially if you're using Eclipse, it can act up and be a little buggy.

By the way, totally unrelated question but, how did you find this tutorial? I see this sudden influx of new members, but I have no idea where they're coming from. :p
Figured you might ask haha, I found you on a Google search. I was trying for ages searching different things to find what I was looking for, eventually I searched "inject runescape gamepack java" and on page 2 this website came up with the forum thread title.

https://www.google.com/search?q=inject+runescape+gamepack+java&rlz=1C1CHBD_en-GBGB751GB751&sxsrf=ALeKk01YuG9ZhM8I6LdEaARSc1HcBSAhoA:1588270145143&ei=QRSrXrqxCOKChbIPhrK50Ak&start=10&sa=N&ved=2ahUKEwj61buu35DpAhViQUEAHQZZDpoQ8NMDegQICxA5&biw=1920&bih=969

I didn't think to try what you said, but I did and sadly it didn't work :(

I tried moving it to different package levels and even not putting it in a package and I changed the path as well, but nothing seems to work, I'm not sure what I should do to debug it further
 

Shenandoah

Access Write Violation
Admin
Legend
Joined
Nov 1, 2019
Posts
93
Points
18
Reaction score
52
Quality Posts
1
Figured you might ask haha, I found you on a Google search. I was trying for ages searching different things to find what I was looking for, eventually I searched "inject runescape gamepack java" and on page 2 this website came up with the forum thread title.

https://www.google.com/search?q=inject+runescape+gamepack+java&rlz=1C1CHBD_en-GBGB751GB751&sxsrf=ALeKk01YuG9ZhM8I6LdEaARSc1HcBSAhoA:1588270145143&ei=QRSrXrqxCOKChbIPhrK50Ak&start=10&sa=N&ved=2ahUKEwj61buu35DpAhViQUEAHQZZDpoQ8NMDegQICxA5&biw=1920&bih=969

I didn't think to try what you said, but I did and sadly it didn't work :(

I tried moving it to different package levels and even not putting it in a package and I changed the path as well, but nothing seems to work, I'm not sure what I should do to debug it further
Oh, okay. Interesting. Thanks a lot for reading my tutorial!

Man, that is so strange. Have you tried creating a new interface class altogether, and referencing that class instead? Create it in the same package as the class transformer that's using it. See if that works.
 

aoredon

New member
Joined
Apr 30, 2020
Posts
4
Points
1
Reaction score
0
Quality Posts
Oh, okay. Interesting. Thanks a lot for reading my tutorial!

Man, that is so strange. Have you tried creating a new interface class altogether, and referencing that class instead? Create it in the same package as the class transformer that's using it. See if that works.
I tried it

Java:
ackage com.alexander.runeo.transform;
package com.alexander.runeo.transform.transformers;

public interface MyClientInterface {
    public void helloWorld(String var1);
}
Java:
package com.alexander.runeo.transform.transformers;

import com.alexander.runeo.transform.ClassTransformer;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.tree.*;

public class ClientClassTransformer extends ClassTransformer {
    @Override
    public void transform(ClassNode node) {
        node.interfaces.add("MyClientInterface");

        MethodNode methodNode = new MethodNode(Opcodes.ACC_PUBLIC, "helloWorld", "(Ljava/lang/String;)V", null, null);
        methodNode.instructions.add(new FieldInsnNode(Opcodes.GETSTATIC,
                "java/lang/System",
                "out",
                "Ljava/io/PrintStream;"));
        methodNode.instructions.add(new VarInsnNode(Opcodes.ALOAD, 1));
        methodNode.instructions.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL,
                "java/io/PrintStream",
                "println", "(Ljava/lang/String;)V"));
        methodNode.instructions.add(new InsnNode(Opcodes.RETURN));

        int size = methodNode.instructions.size();
        methodNode.visitMaxs(size, size);
        methodNode.visitEnd();

        node.methods.add(methodNode);
    }
}
It didn't work still D:

You said:

Code:
There are always at least three class loaders present, even in a super simple Java program. At the top of the hierarchy, you've got the Bootstrap Classloader. This classloader looks for platform classes, and classes in a jar file called rt.jar. A cool trick you can do with the Bootstrap loader is supplying the JVM with a -Xbootclasspath VM argument, which gives the Bootstrap classloader additional directories to search for classes in. This can actually be used to your advantage when writing a Runescape bot, or any bot for that matter. I'll leave it to you to figure out how to abuse this VM argument to your advantage. ;)
How do I use that in IntelliJ? Do you think it could help?
 

Shenandoah

Access Write Violation
Admin
Legend
Joined
Nov 1, 2019
Posts
93
Points
18
Reaction score
52
Quality Posts
1
I tried it

Java:
ackage com.alexander.runeo.transform;
package com.alexander.runeo.transform.transformers;

public interface MyClientInterface {
    public void helloWorld(String var1);
}
Java:
package com.alexander.runeo.transform.transformers;

import com.alexander.runeo.transform.ClassTransformer;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.tree.*;

public class ClientClassTransformer extends ClassTransformer {
    @Override
    public void transform(ClassNode node) {
        node.interfaces.add("MyClientInterface");

        MethodNode methodNode = new MethodNode(Opcodes.ACC_PUBLIC, "helloWorld", "(Ljava/lang/String;)V", null, null);
        methodNode.instructions.add(new FieldInsnNode(Opcodes.GETSTATIC,
                "java/lang/System",
                "out",
                "Ljava/io/PrintStream;"));
        methodNode.instructions.add(new VarInsnNode(Opcodes.ALOAD, 1));
        methodNode.instructions.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL,
                "java/io/PrintStream",
                "println", "(Ljava/lang/String;)V"));
        methodNode.instructions.add(new InsnNode(Opcodes.RETURN));

        int size = methodNode.instructions.size();
        methodNode.visitMaxs(size, size);
        methodNode.visitEnd();

        node.methods.add(methodNode);
    }
}
It didn't work still D:

You said:

Code:
There are always at least three class loaders present, even in a super simple Java program. At the top of the hierarchy, you've got the Bootstrap Classloader. This classloader looks for platform classes, and classes in a jar file called rt.jar. A cool trick you can do with the Bootstrap loader is supplying the JVM with a -Xbootclasspath VM argument, which gives the Bootstrap classloader additional directories to search for classes in. This can actually be used to your advantage when writing a Runescape bot, or any bot for that matter. I'll leave it to you to figure out how to abuse this VM argument to your advantage. ;)
How do I use that in IntelliJ? Do you think it could help?
Did you try the full path as well?

This is really really strange, I honestly have no idea why it's not finding the class. It definitely won't help to Xboot, I can guarantee you that. This might be a bit drastic, but maybe try a different IDE? This is so weird.
 

aoredon

New member
Joined
Apr 30, 2020
Posts
4
Points
1
Reaction score
0
Quality Posts
Did you try the full path as well?

This is really really strange, I honestly have no idea why it's not finding the class. It definitely won't help to Xboot, I can guarantee you that. This might be a bit drastic, but maybe try a different IDE? This is so weird.
Yeah I did sadly, I set everything up, but in Eclipse and sadly that didn't work. It's a massive shame, but I'm not sure what else to try.
 

Shenandoah

Access Write Violation
Admin
Legend
Joined
Nov 1, 2019
Posts
93
Points
18
Reaction score
52
Quality Posts
1
Yeah I did sadly, I set everything up, but in Eclipse and sadly that didn't work. It's a massive shame, but I'm not sure what else to try.
If you want, I can try and debug the problem myself over Teamviewer. My discord handle is Shenandoah#2403 if you're interested, we can talk more on there if you want.
 

Maje

New member
Joined
Jun 11, 2020
Posts
5
Points
3
Reaction score
1
Quality Posts
Hi!

I have been able to follow every step up until the class transforming step of "Client.class" - It does not change the class at all, it is still in it's original state despite me being able to output "The client class is here! Client". However, after not being able to fix or find the error for some hours I just continued on with the steps.

Now I am having new errors (see screenshot), it cannot find the functions "add", "visitMaxs" and "visitEnd", which makes me think something is wrong with the ASM jar files I downloaded and added to the intellij project in the beginning of this adventure.

Not_working_yet.png

Any ideas as to what is wrong?
 

Shenandoah

Access Write Violation
Admin
Legend
Joined
Nov 1, 2019
Posts
93
Points
18
Reaction score
52
Quality Posts
1
Hi!

I have been able to follow every step up until the class transforming step of "Client.class" - It does not change the class at all, it is still in it's original state despite me being able to output "The client class is here! Client". However, after not being able to fix or find the error for some hours I just continued on with the steps.

Now I am having new errors (see screenshot), it cannot find the functions "add", "visitMaxs" and "visitEnd", which makes me think something is wrong with the ASM jar files I downloaded and added to the intellij project in the beginning of this adventure.

View attachment 69
Any ideas as to what is wrong?
That's weird, everything looks correct. Are the other transformer classes in your project experiencing the same errors? Try restarting your IDE and/or your computer. If the problem still persists, try removing and then re-adding the asm jar back again.
 

Maje

New member
Joined
Jun 11, 2020
Posts
5
Points
3
Reaction score
1
Quality Posts
I made some progress by updating my JDK to 11.0.7 (it is LTS) and my JRE to 1.8.0_251. Now I can actually see, "Client.class implements List" after changing the reflection. :)

However, the same methods are still not found by my system. When I google the function "MethodNode.visitMaxs" it says that this function does exist in the package org.objectWeb.asm.tree.MethodNode...

Did I import the modules wrongly?
JarModules.PNG
 

Shenandoah

Access Write Violation
Admin
Legend
Joined
Nov 1, 2019
Posts
93
Points
18
Reaction score
52
Quality Posts
1
I made some progress by updating my JDK to 11.0.7 (it is LTS) and my JRE to 1.8.0_251. Now I can actually see, "Client.class implements List" after changing the reflection. :)

However, the same methods are still not found by my system. When I google the function "MethodNode.visitMaxs" it says that this function does exist in the package org.objectWeb.asm.tree.MethodNode...

Did I import the modules wrongly?
View attachment 74
It definitely should work, yes. Try clicking File -> Invalidate caches, and then restart the IDE. Also, do you use the visitMaxs and visitEnd methods anywhere else in the program?
 

Maje

New member
Joined
Jun 11, 2020
Posts
5
Points
3
Reaction score
1
Quality Posts
Yeah I tried invalidating caches and restarting etc., and no, this is the first time I am using visitMaxs in the program. But maybe I am doing something very basic wrong, do I need to do .setAccessible(true) for all the things I am trying to change?

Here is the source code of my GameClassTransformer:

Code:
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.tree.InsnList;
import org.objectweb.asm.tree.MethodNode;

public class GameClassTransformer {
    MethodNode methodNode = new MethodNode(
        Opcodes.ACC_PUBLIC,
        "simpleMethod",
        "(Ljava/lang/String;)V",
        null,
        null
    );
    methodNode.instructions.add(new InsnNode(Opcodes.RETURN));
    int size = methodNode.instructions.size();
    methodNode.visitMaxs(size, size);
    methodNode.visitEnd();
}
 

Maje

New member
Joined
Jun 11, 2020
Posts
5
Points
3
Reaction score
1
Quality Posts
Consider this, i have "import asm.tree.InsnList" and I try to call the function ".add()" on an InsnList. This is a legitimate function, that actually exists on objects of type "InsnList". HOWEVER, IntelliJ produces an error here, saying " Cannot resolve symbol 'add' "...
method_not_found.png


But when I check the module library, I can clearly see the method being in there... So I think IntelliJ is screwing with me, and that there's actually nothing wrong with the code.
method_is_found.png

I am using a bit newer versions of the ASM jar files (8.0.1) but it didn't work before when I had 7.2 either, that's why I upgraded them to the newest version.
 
Top