Register for your free account! | Forgot your password?

Go Back   elitepvpers > Popular Games > Silkroad Online > SRO Coding Corner
You last visited: Today at 03:56

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



[Guide] A Simple Silkroad Proxy Reference

Discussion on [Guide] A Simple Silkroad Proxy Reference within the SRO Coding Corner forum part of the Silkroad Online category.

Reply
 
Old   #1

 
elite*gold: 260
Join Date: Aug 2008
Posts: 560
Received Thanks: 3,779
[Guide] A Simple Silkroad Proxy Reference

This guide is similar to to my Loader/Injected DLL guide. It's a complete project, but by itself, it is not enough to fully utilize at this stage. However, there is so much to this topic that I have to break down everything into different parts first.

This guide will be the first in a small part series that shows how a Silkroad proxy is made. Future guides will complete the project by showing how to do the hook for a client, as well as a simple clientless that uses the proxy. Right now, the proxy is in a state of being able to be used if you already know how to make the client connect to it, but if not, you can wait around for the future guides. You can use the edx33 hook to make it work if you wanted to play with it.

I've been releasing proxies for Silkroad for quite some time now, but I never really wrote about the theory of how it was done or explained what is going on. That is the real purpose of this guide, to put some thought and knowledge behind the programs. There's still a bit of more work to do, but for now enjoy!

If you read this and think I left out anything important, just leave a comment! Remember I've been doing this for a while now, so I know it all and as a result, I can't see or interpret this stuff how someone else would. Of course, if you ask for an explanation of something that is out of the scope of this guide, I'll tell you, but try my best to answer it or at least point you in the right direction.

A Simple Silkroad Proxy Reference

I. Purpose

The purpose of this guide is to give a simple but complete explanation of how proxies work with Silkroad. The reason this guide is being written is because a lot of people use Silkroad proxies without really understanding what they do or how they are made. Proxies are an important aspect to any packet based development because you have access to all of the data that goes on between the client and server.

Once you understand how to create a proxy, you can then develop new tools and programs on an entire new level that are otherwise not possible simply by using client patches. If you want to take development even further, you can run a proxy inside the client for a real unique setup that would allow for even more flexibility and power coupled with an injected DLL. However, that is outside the scope of this guide.

Rather than trying to go through this guide using edx33 or SR33, I have written a new simple proxy to be used. This proxy will be a final replacement for edx33 just as edx33 replaced SR33. However, the version of the proxy being shown in this guide is a “lite” version and not in a final form. It should be “good enough” to use and learn from though.

Last but not least, this guide contains a lot of text, so it’s not a practically fun read or exciting read. Rather, this guide is more like a crash course of how things work without getting into the “how to code it from scratch” aspect. The reason we don’t go step by step through programming the proxy is because it’s a programming task that will just vary based on what language you use. If you were to use C#, you’d be able to write a simple proxy using the built in networking commands rather quickly. However, you would then have to convert the Silkroad security class into C# or a compatible DLL which is not that fun.

The reason there is a lot of code is because of how C++ works. Usually, C++ projects are a lot more code than any counterparts in higher level languages. It’s one of the tradeoffs you get with the language for having a lot of power at your finger tips. Don’t be discouraged by this as much as just as how things are in the development world. Good things don’t always come in small and easy to work with packages!

II. Requirements

If you have an interest in this topic, you will need to understand the basics of TCP. TCP is not something you just learn in a day, a month, but something you really get to understand over time or heavy study. You don’t have to know much about it for this guide, but at least know what it is!

In addition, you will need to understand how Silkroad’s security is setup. You can refer to my previous article “” if you do not know the basics of that concept either. Knowing how the security is setup will help in understanding how the TCP stream is processed in the proxy, but there will be more on that later.

Finally, a good working set of C++ and Visual Studio knowledge is required for this guide. Once you understand the concepts of making a proxy, you can use any language you want. However, unless you implement the Silkroad security API in another language or make a DLL out of it to use in other languages, it will not work out so nicely!

This guide is not really meant to be read from start to finish once. It’s more of something you read some, look at the code, let your brain fry, take a break, and do over and over for a while. I’ve been working with writing proxies for almost two years now and I’m still learning new and alternative designs of how to implement them efficiently. It just takes a lot of practice and struggling, so it’s not something you just do in a matter of days, weeks, or even months. As many times as I thought my code was “right”, after I learned more, I soon realized I did a lot of things wrong. Just keep that in mind as you learn more, you will go back and realize flaws in previous code.

III. Theory

First and foremost, proxies are not complex programs. They are really simple and usually dumb programs relatively speaking. All they do is accept connections and pass data back and forth between remote connections. For Silkroad, if not for the security bytes, you could write a really simple proxy in no time at all with very little code in a higher level language. Just keep this in mind as you are reading the guide. No matter how complex it might seem to be, in the end it is a really simple program that just requires networking domain knowledge to implement successfully.

Starting from the beginning, we need to establish how Silkroad works. First, sro_client is launched by a loader. “sro_client” will now be referred to as the “client”. The client will then connect to one of the Silkroad login servers. The Silkroad login server the client connected to will now be referred to as the “server”. Once this connection is made, the server sends data to the client and the client responds back and the communication process continues until either side terminates the communication. Easy enough, right?

At this point, we will introduce a proxy into the picture. The proxy is run from some computer the client can connect to. When the client starts, rather than connecting to the server, it simply connects to the proxy. To the client, the proxy is the server since it connected to it. It can’t tell the difference! (It could, but it would need additional programming for that.)

When the client connects to the proxy, the proxy then creates its own client to connect to the server. The reason for this is because the proxy must establish a connection to the server to be able to pass the data from the server back to the client and from the client to the server. The setup looks like this in ASCII art: Client <-> Proxy <-> Server.

Now, for simple games and programs that do not implement any security into their packets, at this point you would have complete access to the communication stream and could do whatever you wanted. You could easily inject packets in either direction, drop packets from either side, or modify packets as you wished. The power of the proxy is that since all traffic flows through it, you are in control.

For a game like Silkroad though, things are not that easy. You could still utilize this method if you wanted to log packets, but you would not be able to modify anything or drop and inject packets. For any packets that are encrypted, you would also be unable to read them yourself. This is pretty useless I think, so that is why all of my Silkroad proxies make use of the security process to give full control.

Once we add the Silkroad security processing into the proxy, we gain full control over the data stream. We are then free to do whatever we wish. For this guide, the proxy I have designed goes ahead and adds some “smart” features. If you have done any Silkroad development, you will know how the client has to send a ping packet ever 5 seconds there is no other data sent. Even though the client takes care of this for us, it is something we have to implement if we were to make a clientless.

Rather than leaving it up to the clientless programmers, we can implement the ping logic directly into our proxy so the proxy correctly pings the server so the client(less) does not have to. Pretty neat, huh? In addition, we can also add other packet processing such as the handshake, identify, version, and login packets to the proxy so all the clientless programmer has to do is send the login packet once (for ISRO) and everything else is taken care of.

What we end up with is a small but powerful program that we can use for all sorts of cool projects. Writing a clientless becomes 10x easier since all you have to do is send regular packets to the proxy and the proxy will fix them up to send to the server. Likewise the clientless will only process unencrypted packets since the proxy will decrypt them first. Of course, if anti-clientless protection is put into place like how CSRO has, then this solution is not enough unless you crack it first.

So, just to recap, the client connects to the proxy. The proxy connects to the server. The proxy sends client data to the server and server data to the client. It also decrypts and handles all of the security bytes as needed. That’s all a simple proxy does. Our proxy adds a few extra features, but that’s all there is to it!

The next bit of theory we need to cover deals with TCP, the networking protocol Silkroad and a lot of MMOs use. TCP is a protocol that is stream based, not packet based. That means when you receive data, you must know the size of the packet that it contains beforehand. This is why the size is in all packets, so the client knows how many bytes to process in the stream. Once you understand this little peculiar with TCP, then writing any proxy is not that hard. However, some games incorrectly use TCP and that is a problem you have to account for at times with your code. Silkroad uses it correctly though, so no worries here.

In order do code the TCP stream processing correctly in Silkroad, we have to first have 2 bytes available in the stream. From there we can tell if the packet is encrypted (which more packet data is required than is mentioned in the header) or if the packet is unencrypted and we have the real size. If we have an encrypted packet, we have to calculate the expected size based on the Blowfish algorithm. This topic is covered in the Silkroad Security guide. Once we decrypt our packet if it’s encrypted, we must then fix the packet size in the header so our programs have the correct size.

The proxy in itself is just another client/server program, so we can now look at what type of data the proxy needs to track for the clients that connect to it as well as the connections it creates to the remote hosts. Previously in SR33/edx33 and a previous unreleased Silkroad proxy of mine, I wrote a proxy class that was setup as a proxy object. The server would implement the remote connecting client design internally so you were only working with a single object.

That design was a bit complicated so I went to a simpler design that is shown in this proxy, which is to simply use composition to create a proxy from a server and client class. Rather than the remote client code being embedded directly into the server, I created interface functions so the client simply calls the server’s functions. This simplifies the code greatly compared to a proxy and as a result leads to a more organized design.

The proxy itself will maintain a few state variables for the local clients that connect to it such as the ping logic, the login logic, the handshake logic, and a unique ID to associate a remote client with. With a login server client is transitioning to a world server client, certain data must be passed such as the login id, name, pass, and client locale, so a wrapper structure was created to handle that.

Looking at the big picture, the proxy is its own server that will accept connections on a custom port for the login and world server emulation. It will store client data in memory for the current connection as well as copy data over to a new connection when an account goes from a login server to the world server. Finally, it will implement the basic logic for the login and world servers to handle repetitive tasks and as a result, make clientless programs easier to develop.

Phew, that’s a lot of text, but as you look through the code and read this guide, you should start being able to get a better idea of how everything is interconnected. The code should be pretty clean, but the design is not yet perfected. Even though it works great, I still want to do some more rewriting eventually to make things simpler. Proxy development is a really an incremental development process. I’ve written dozens of proxies and still working on a good design that is not only simple, but easy to maintain and use for other projects.

IV. Implementation

Attached is the complete project. This is just a “lite” version of the proxy program. It does not support plugins like my previous edx33/ SR33 projects did. However, once you understand this code, you can then look back at that code and see how the plugin logic was added. Due to limitations in the network code, only 64 connections are supported per server. While this is more than enough for Silkroad, it is something to be aware of if you plan on using the network code for other projects.

The code should not have any serious flaws in it. It does have some design issues that need to be reworked, but in terms of it working, it should just fine. I’ve tested the maximal amount of connections at once using it and never had a problem with it. Memory and CPU usage is pretty efficient too for the task. The design of the code is for a single threaded program to keep things simple. One of the things I’ve learned from edx33/SR33 is that threading over-complicates tasks like these.

In addition, the default Silkroad setup is used, so the proxy will work as-is for any Silkroad version that has not made changes to the security system or the login server packets. All you have to do is detour the client to connect to the proxy and you are set! A guide about that process will come later.

For a brief code overview:

main.cpp – The main proxy driver code that sets up the GUI for the program. Through this GUI, users will be able to set the ports for the login and world server as well as the remote login server.
SimpleNetwork.h/cpp – The new generic reusable network code. This is a select() based client and server implementation, so it is very simple. Only the important logic parts are commented, so expect to spend some time revering other networking information online.
SilkroadClient.h/cpp – The Silkroad specific client class. All this does is call the appropriate server functions with its own this pointer for processing.
SilkroadServer.h /cpp – The Silkroad specific server class. This is a base class that will handle the incoming connections as well as outgoing remote connection. The SilkroadClient objects call member functions of this class for a centralized design.
WorldServer.h/cpp – The WorldServer implementation of the SilkroadServer. Ping, Autologin, and the handshake are handled here.
LoginServer.h/cpp - The LoginServer implementation of the SilkroadServer. Ping, login, and the handshake are handled here.
WorldServerObject.h/Packet.h – Helper structures.
HandshakeApi.h/cpp – Silkroad security class.

If you read through the theory section, you should be able to account for all things mentioned in the various code files. While the code is much simpler than edx33/SR33 was, there is still a bit of it. Understand that you will not be able to just look at it and know what is going on. Sometimes it’s good to trace through to understand the flow of things, but unless you already know how to write your own proxy, understanding all of the code there might take some time. Just work through it slowly and try making your own versions when you feel you understand the concepts!

Included in the project is a compiled version for testing. Run the debug version (marked with a _d) to see the console output. The simplest testing you can do is to run the proxy and then telnet into it. The command for that would be (from a console window):

telnet localhost 16000

From there, you should see some packets being displayed, but you won't get too far since you would need to send some more packets first. However, it should be "good enough" in showing that it works! If you are on Vista or Win7, you might need to enable telnet manually. Do a good search for how this is done.

V. Conclusion

Hopefully by now, the concept of Silkroad proxies makes more sense. A Silkroad proxy acts just like a HTTP proxy except it has to do slightly more work since we are working with a complex game rather than a web server. By studying this guide and looking at the associated code, you should be able to have a more solid how a Silkroad proxy is created. This included implementation is only one possible way of accomplishing the task, there are many other approaches you could take.

That wraps up this guide. As I mentioned before, it is a lot of text and concentrated knowledge that you won’t simply read and absorb in a short period of time. From here, we have another tool at our disposal that is useful in creating more advanced development tools. This proxy will be slightly improved in the mean time and additional guides will be made to serve as companions to it. This guide is just a brief overview of the whole thing as it's an important stepping stone.

Drew “pushedx” Benton
edxLabs
Attached Files
File Type: zip edxSilkroadProxy_Lite.zip (962.8 KB, 3267 views)
pushedx is offline  
Thanks
31 Users
Old 08/20/2009, 01:36   #2
 
InvincibleNoOB's Avatar
 
elite*gold: 20
Join Date: Mar 2007
Posts: 4,277
Received Thanks: 2,990
Approved,sorry for delay.
InvincibleNoOB is offline  
Old 08/20/2009, 08:55   #3
 
elite*gold: 0
Join Date: Jun 2008
Posts: 188
Received Thanks: 106
Very nice code. However, I seriously don't know why is it this complicated. Mine proxy requires about 1,5k less lines, uses about 1,5mb memory for about 10 clients (couldn't run more) and works pretty nicely. I guess that it's the word about 'concept'. My proxy *needs* to have a window to whom network events will be sent to, so the proxy can 'grab' them and do what it's supposed to do on that event. And it's generic, where you specify your own code for a specific game easily.

Oh and by the way, I see you are still using the 256kb table. You can generate that table using a less 4kb table and one function. Incase you're interested, let me know. Oh and, I didn't figure it out, I suck at reversing - I think it's RlyDontKnow or Klevre (or both?).
maxbot is offline  
Old 08/20/2009, 13:30   #4

 
elite*gold: 260
Join Date: Aug 2008
Posts: 560
Received Thanks: 3,779
Quote:
Originally Posted by maxbot View Post
However, I seriously don't know why is it this complicated.
What do you find complicated about it? Are you talking about the code or the guide?

For the code, the networking system (SimpleNetwork.cpp/.h) includes a standalone client, server, and packet utility class. The code is setup so you derive your own new classes from them and simply override and implement the public API functions. It's a pretty simple and clean setup, highly reusable.

There is no 'proxy" class because I am going the route of composing client and server objects together to form the proxy. That approach was done to allow for more complicated designs on other projects I am working on. In this case, you end up having slightly more code to deal with for two classes and typing them together than an integrated proxy like sr33/edx33 did, but as previously stated, that's more limiting.

As for the logic of the proxy, only a couple of packets are handled as well as some additional logic is added to make writing clientless programs easier. If I took out the logic, the code would be less complicated, but it would also be less interesting. This proxy is more like nuConnector in a sense rather than just a proxy like sr33/edx33 was (even though both could do all this already).

Quote:
Mine proxy requires about 1,5k less lines, uses about 1,5mb memory for about 10 clients (couldn't run more) and works pretty nicely.
Nice to hear about lines of code, but its really a meaningless number (unless you are getting paid by the lines of code count, in that case it does!) What matters for us though is the quality of the code, the ability for the code to be maintained, and whether or not the code works. If you can get the job done in less lines, great! However, less lines of code does not mean better code or more efficient code, so you should never worry about how many lines something takes as opposed to the underlying algorithms and techniques used.

If you used a higher level language like C# for example, you could implement this project in probably 10x less code. That's exactly what I mentioned in the guide. Likewise with different C++ networking models, you can either have more or less code. It just depends on which networking model and the design approach you take.

As for memory usage, my design allocates the memory for the maximal amount of connections that can be serviced per server (64). You can easily change that down to a reasonable level for Silkroad, such as a number <= 30. It was only left at 64 because it is server code after all. So, between two servers that have extra memory being allocated, that's where the extra (wasted) memory comes from. Not a big deal though since this is a learning project for people after all.

When you deal with server programming, you want to reduce the number of allocations and deallocations you make over the long term. It is more efficient allocating resources upfront and reusing them than creating and destroying them through the lifetime of the server. Rather than adding boost::singleton_pool to the design and making things more complicated, I went with using preallocated memory.

Quote:
I guess that it's the word about 'concept'. My proxy *needs* to have a window to whom network events will be sent to, so the proxy can 'grab' them and do what it's supposed to do on that event. And it's generic, where you specify your own code for a specific game easily.
Yes, I am familiar with that networking model, sr33 and edx33 both used it. Part of getting good at network programming is learning all of the networking models and seeing for yourself the goods and bads in practical application. I've never tried the select() model before, so I went with it. This pretty much puts me as having tried all of the Windows networking models (blocking, non-blocking select, asynchronous, and IOCP)

In addition, my edxMiddleManFramework, which was never released publicly, made use of it and was a generic 'edx33' for any game that did not have any serious 3rd party protection. I am currently rewriting that project using the SimpleNetwork code I've included in this project. I like the select model overall and with a few changes, I can get it running easily on Linux, which will be especially helpful for some future projects of mine.

I might revisit the Async model in the future and redo the code used in sr33/edx33, but I don't have any plans to right now. I'm happy with this stuff for now and will continue to use it because it's small, predictable, and I can easily run it all in one thread, which is really, really important to me right now. That's one thing that my old Async code was not good at and that's knowing exactly what's going on when due to the multithreaded aspect of it and windows messages.

Quote:
Oh and by the way, I see you are still using the 256kb table. You can generate that table using a less 4kb table and one function. Incase you're interested, let me know.
Thanks for the offer, but I already did that a while ago. If you are going to have a file included, having it smaller and then rebuilding it each run time so it turns out to be the same size in memory is not really any better than just using the final results and loading it. edx33 just embedded the final file into the EXE for this, but any solution is fine. The only solution I'd not recommend is the old approach of using a .cpp file for the security table, which is what the old SR33 did because jMerlin used that approach. That file was like 800kb and a big waste of space!

So, long reply, but thanks for the comments.

The thing you have to keep in mind though is that this is not a production project for some closed source release, it's a open source community one. Obviously I'm not going to be giving out my best code and best frameworks of which people have no idea of. However, what I do release is of good quality that I will use for public projects and stuff I think is worth the release as well as my time in writing the guides (I spend on average close to 10 hours per guide writing stuff, testing, editing, etc..)

The only project I can say I've ever released that was of really poor quality code wise was that edxClientlessPrototype. That's the only project that's really sucked hardcore, but one project out of as many as I have had is forgivable I guess.
pushedx is offline  
Old 08/20/2009, 14:57   #5
 
elite*gold: 0
Join Date: Jun 2008
Posts: 188
Received Thanks: 106
Thanks for the quick answer and elaboration on my statements / questions.

I pretty much read all of your articles, including those on GameDev (I was especially interested in your high performance IOCP classes) and I must say that it is you who got me into programming waters anyway.

Quote:
The only project I can say I've ever released that was of really poor quality code wise was that edxClientlessPrototype. That's the only project that's really sucked hardcore, but one project out of as many as I have had is forgivable I guess.
It was not bad for starters like I was back then (although I still consider myself a starter compared to other devs). I heard it has a memory leak , but I never really took a look into the network code back then.

I really have to say thanks again for everything you've done. And I hope you'll continue sharing stuff with the community
maxbot is offline  
Old 08/20/2009, 17:21   #6
 
elite*gold: 0
Join Date: Sep 2006
Posts: 248
Received Thanks: 110
Well done, sir.
backo is offline  
Old 08/20/2009, 17:23   #7
 
zilvinaslt52's Avatar
 
elite*gold: 0
Join Date: Mar 2008
Posts: 386
Received Thanks: 64
sry for my lazyass, what this is for? :|
zilvinaslt52 is offline  
Old 08/20/2009, 18:13   #8
 
elite*gold: 0
Join Date: Jun 2007
Posts: 100
Received Thanks: 36
Quote:
Originally Posted by zilvinaslt52 View Post
sry for my lazyass, what this is for? :|
Use for making packet base tools (like bots)
mandark15 is offline  
Old 08/20/2009, 19:07   #9

 
elite*gold: 260
Join Date: Aug 2008
Posts: 560
Received Thanks: 3,779
Quote:
Originally Posted by zilvinaslt52 View Post
sry for my lazyass, what this is for? :|
It's for creating your own Silkroad proxy like nuConnector, edx33, sr33, srProxy, etc... It has lots of applications and is as mandark15 mentioned, for packet based tools.
pushedx is offline  
Old 08/20/2009, 21:11   #10
 
elite*gold: 20
Join Date: Oct 2007
Posts: 3,085
Received Thanks: 1,109
wow nice guide , too lazy to read all :P
how do you have alot of power to write it all?
_FoulSoul_ is offline  
Thanks
1 User
Old 08/21/2009, 04:53   #11
 
MoSHiRiKaTo's Avatar
 
elite*gold: 0
Join Date: Apr 2007
Posts: 23
Received Thanks: 22
Quote:
Originally Posted by darkside050 View Post
wow nice guide , too lazy to read all :P
how do you have alot of power to write it all?
Drew doesn't have power, he IS the power :O
MoSHiRiKaTo is offline  
Old 08/23/2009, 11:53   #12

 
elite*gold: 260
Join Date: Aug 2008
Posts: 560
Received Thanks: 3,779
I just noticed a small bug in the GUI. You cannot change the IP correctly because the field is set to allow numbers only. Here's a screenshot of the fix:



Just click on the edit box, go to the control properties, and make Number say False instead of True.

Also attached is a recompiled binary package for those that can't compile and want to play with it. I will be using this project in another upcoming release so I noticed the bug when preparing that project.

VirusTotal seems to be down so here's a
Attached Files
File Type: zip edxSilkroadProxy_Lite_update1.zip (278.5 KB, 331 views)
pushedx is offline  
Thanks
2 Users
Old 08/23/2009, 21:30   #13
 
zitodef's Avatar
 
elite*gold: 0
Join Date: Dec 2008
Posts: 921
Received Thanks: 39
wath this thing do? i dont understand. can sombody explain me?
zitodef is offline  
Old 08/23/2009, 21:48   #14

 
elite*gold: 260
Join Date: Aug 2008
Posts: 560
Received Thanks: 3,779
Quote:
Originally Posted by zitodef View Post
wath this thing do? i dont understand. can sombody explain me?
It doesn't "do" anything in that sense.

It's an explanation and source code for one way of creating a simple Silkroad Proxy. It is a developer tool and is not something in a state of making the game more easy or anything.

You could write a simple clientless using this, as I show in this guide: , but that's about it. It's just a framework for more powerful things!
pushedx is offline  
Thanks
1 User
Old 08/29/2009, 05:39   #15

 
elite*gold: 260
Join Date: Aug 2008
Posts: 560
Received Thanks: 3,779
Just for reference, KSRO is incompatible with this proxy due to how their login packet is setup slightly different. You would have to modify the login and world server login packets to their format for it to work right.

This is only because of the extra features the proxy has to make writing a CL easier. The base proxy itself is compatible with all Silkroad versions currently since they all use the same security table.

Just something to keep in mind if you were going to try and use this on KSRO.
pushedx is offline  
Reply


Similar Threads Similar Threads
[Guide] Creating a Simple Loader with Injected DLL for Silkroad
02/02/2016 - SRO Coding Corner - 37 Replies
This next article in my series is a very important one for anyone wanting to get started with client modifications or understanding the client itself. This is the base article that will be used for all my future articles that explain various Silkroad development concepts. Like my previous article, there is nothing terribly exciting with this one as we have to get through the necessary boring stuff first before we can have any real fun. Unfortunately, this article is very heavy text wise and...
[Guide] Using Windows Detours to Redirect Silkroad to a Proxy
11/25/2010 - SRO Coding Corner - 28 Replies
This is the second guide in a three part series. The first part is the "A Simple Silkroad Proxy Reference" guide, which sets up a simple proxy. This guide shows how to create your own hook and detour to use that proxy (or any other for that matter) with the client. The third and final guide will show how to use a clientless with the proxy and illustrate the power of the design. There is not that much code across the three projects in this guide, but some of the concepts are advanced. It took...
Silkroad Online - Simple
12/01/2009 - Silkroad Online - 5 Replies
serious vid coming soon, but for now, this: YouTube - Silkroad Online - Simple watch in HD prolly when available
QO Proxy Simple Help.
03/28/2007 - CO2 Guides & Templates - 1 Replies
Hello, This is a simple guide for help with QOProxy, when I first started using it, I did have some problems understanding it, so I hope this one helps... All the best of luck, any questions or problems, please post reply. +k is appreciated ;D Thanks, BobbyTom



All times are GMT +1. The time now is 03:57.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.