Register for your free account! | Forgot your password?

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

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

Advertisement



[Guide] Locating Silkroad’s Direct3D Objects

Discussion on [Guide] Locating Silkroad’s Direct3D Objects 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,753
[Guide] Locating Silkroad’s Direct3D Objects

As per my last thread, , I've started writing some developer resources for Silkroad since that seemed to be the option that generated the most feedback.

To kick things off, I am writing about some useful techniques that I used in the past but are still something that no one else has really dedicated resources to for Silkroad. This article is the first part in a series, so you might not find an immediate use for this information yet. A couple of other articles still need to be written to build the foundation to make use of this knowledge.

Here's an older screenshot from the past as to why this guide is relevant, as well as what I am making my first series of guides for:


With that said, here's the first article I have written for the year. It is being posted first exclusively here on epvp, so I hope you enjoy!

Locating Silkroad’s Direct3D Objects

I. Purpose

The purpose of this guide is to show a quick and easy way to obtain the Direct3D objects Silkroad uses. This guide shows how to accomplish the task with Silkroad, but the concepts are applicable to any Direct3D game. The primary reason such a task is needed is to be able to integrate in a secondary Direct3D GUI into the game through hooking the appropriate functions. Alternatives do exist, such as creating a Direct3D proxy DLL, but that method is much more complicated and requires a different strategy for implementing additional logic into the host.

II. Requirements

This guide is written as an intermediate to advanced guide. It is expected you have basic knowledge of C++/ASM and how to use OllyDbg.

In order to be able to follow along, you will need:
• OllyDbg 1.10 (or equivalent)
• Visual Studio 2008 (or equivalent)
• Microsoft’s DirectX March 2009 SDK (or equivalent)

You may use other disassembles, but it is up to you to figure out the appropriate equivalent commands shown. Any modern version of Visual Studio will work as well. Likewise with the DirectX SDK, you just need a modern version that supports DirectX 9. It is up to you to properly setup those tools. Once you have all of those requirements fulfilled, you may continue on to the next section.

III. Theory

The theory of what we are about to do is very creative and extremely useful in problem solving. I originally thought of using this method a few years back when trying to search the client for Direct3D calls to hook the drawing functions to implement my own GUI in the game. Basically, what we are going to do is create a small program that mimics what Silkroad does internally to locate calls to an external DLL.

The reason why we want to approach the problem this way is because the Silkroad client is huge, over 9 MB and actually trying to search through all that code is impossible. I had studied the client for a number of years and was still finding new things I did not know about on a weekly basis before I switched to packet based applications. By creating a smaller program that we can control the code of, we can easily write out specific function calls and then mark them in the code and look at what functions they call in an external DLL.

The reason why we can take this approach is because of how DLLs work on Windows. I won’t get too deep into the workings, but because the DLL is compiled with a fixed address, we can always obtain an offset to specific functions when the DLL is loaded into memory. On one computer, the function might be at address 0x12345678 in memory and on another computer the address might be at address 0x87654321. It wouldn’t matter because we can always calculate the address to the function based on the offset in the DLL.

Now in this specific example, we don’t have to worry about what address the functions are loaded at because we are only interested in finding the client related code that calls these functions. As a result, we have less work cut out for us compared to if we needed to patch the DLL itself!

IV. Implementation

Now we are ready to get started. The first thing we will be doing is creating our simple Direct3D program so we can get an idea of how the Direct3D code looks like for the Silkroad client. I just found the simplest tutorial code I could online to use. I will be modifying the code from this tutorial: . I would also strongly recommend you follow the tutorial to get an idea of some Direct3D basics before you continue as well if needed.

Create a new Win32 project in Visual Studio and add in a new CPP file with the code presented at the end of the tutorial (click on the link that says [Show Code]). You should be able to compile that code with no changes and be able to run it with no problems. If you do have any problems, make sure you setup Direct3D correctly and have the appropriate project settings in place.

Here is a cleaned up version of that code for reference:
Code:
#include <windows.h>
#include <windowsx.h>
#include <d3d9.h>

#pragma comment (lib, "d3d9.lib")

LPDIRECT3D9 d3d;
LPDIRECT3DDEVICE9 d3ddev;

void initD3D(HWND hWnd);
void render_frame(void);
void cleanD3D(void);

LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	HWND hWnd;
	WNDCLASSEX wc;
	ZeroMemory(&wc, sizeof(WNDCLASSEX));
	wc.cbSize = sizeof(WNDCLASSEX);
	wc.style = CS_HREDRAW | CS_VREDRAW;
	wc.lpfnWndProc = WindowProc;
	wc.hInstance = hInstance;
	wc.hCursor = LoadCursor(NULL, IDC_ARROW);
	wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
	wc.lpszClassName = L"WindowClass";
	RegisterClassEx(&wc);
	hWnd = CreateWindowEx(NULL, L"WindowClass", L"Our First Direct3D Program", WS_OVERLAPPEDWINDOW, 300, 300, 800, 600, NULL, NULL, hInstance, NULL);
	ShowWindow(hWnd, nCmdShow);
	initD3D(hWnd);
	MSG msg;
	while(TRUE)
	{
		while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
		if(msg.message == WM_QUIT)
			break;
		render_frame();
	}
	cleanD3D();
	return msg.wParam;
}

LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch(message)
	{
	case WM_DESTROY:
		{
			PostQuitMessage(0);
			return 0;
		} break;
	}
	return DefWindowProc (hWnd, message, wParam, lParam);
}

void initD3D(HWND hWnd)
{
	d3d = Direct3DCreate9(D3D_SDK_VERSION);
	D3DPRESENT_PARAMETERS d3dpp;
	ZeroMemory(&d3dpp, sizeof(d3dpp));
	d3dpp.Windowed = TRUE;
	d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
	d3dpp.hDeviceWindow = hWnd;
	d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &d3ddev);
}

void render_frame(void)
{
	d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 40, 100), 1.0f, 0);
	d3ddev->BeginScene();
	d3ddev->EndScene();
	d3ddev->Present(NULL, NULL, NULL, NULL);
}

void cleanD3D(void)
{
	d3ddev->Release();
	d3d->Release();
}
Now we will need to add in a few code markers so we know where our target code lies in Olly. We will want to wrap the function calls of interest with NOPs so we can easily search for them. Usually, you will want to use 5 or so NOPs to be able to quickly find them. Depending on how the code was compiled, sometimes the executable might contain a lot of NOP padding in which case you will need to come up with a different marker.

The functions we will want to be marking are the calls to Direct3DCreate9, CreateDevice, Clear, BeginScene, EndScene, Present, and Release. To mark these, we will just define a macro that emits our NOPs and place the macro around the code.

Here is what our macro looks like:
Code:
#define OLLYDBGMARKING \
__asm nop \
__asm nop \
__asm nop \
__asm nop \
__asm nop
Here are the functions with the macro being used for reference:
Code:
void initD3D(HWND hWnd)
{
	OLLYDBGMARKING

	d3d = Direct3DCreate9(D3D_SDK_VERSION);
	D3DPRESENT_PARAMETERS d3dpp;
	ZeroMemory(&d3dpp, sizeof(d3dpp));
	d3dpp.Windowed = TRUE;
	d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
	d3dpp.hDeviceWindow = hWnd;
	d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &d3ddev);

	OLLYDBGMARKING
}

void render_frame(void)
{
	OLLYDBGMARKING

	d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 40, 100), 1.0f, 0);
	d3ddev->BeginScene();
	d3ddev->EndScene();
	d3ddev->Present(NULL, NULL, NULL, NULL);

	OLLYDBGMARKING
}

void cleanD3D(void)
{
	OLLYDBGMARKING

	d3ddev->Release();
	d3d->Release();

	OLLYDBGMARKING
}
That is pretty simple right? Now let’s compile in Release mode and then open the file in OllyDbg. We want to compile in release mode since a lot of extra code is compiled into Debug builds that might interfere with analysis.

Once we get the file opened in OllyDbg we will want to find our marked areas. To do this, we will want to right click on the main assembly pane and choose Search For -> All Sequences. In the new dialog that pops up, we will want to simply type in our 5 NOPs. In case you need a reference image:


Click Find and you will get a list of all of the code blocks that contain the matching pattern. In this case we will get 6 since we marked the start and end of 3 code segments. Right click on the window and choose Set breakpoint on every command. Now all our regions are marked and we are ready to run.

Since we compiled this code ourselves, chances are we left in the code listing for the exe and we will be able to see the code in the OllyDbg preview pane right above the dump window. This will help us for this guide, but such information is rare to come by in the real world.

Go ahead and hit F9 to run the application. The first breakpoint we will hit will be at the entry of the initD3D function. Once again, since we compiled this program ourselves, we can see a lot more information available. Usually tracking down the Direct3DCreate9 API function is pretty easy, so for now we will not worry about this section. Hit F9 again to hit the end marker and then F9 once more so we land inside the render_frame function.

Here is a reference screenshot of what we should be looking at:


You might notice some interesting things about this code. First, we have only function pointer calls. This is because of how Direct3D uses a COM interface. As a result, any Direct3D calls will pull a function pointer from the base object and setup the function call. By studying this pattern, you can easily identify the D3D device object in another executable if you were to find some point of reference.

For now, place a breakpoint on the line: 01061121 FFD2 CALL NEAR EDX and press F9 to run to it. Hit Enter once on the line to follow the call. Press Shift + ; to be able to set a label for the function. If we reference our original code, we will know our first function call was: d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 40, 100), 1.0f, 0); , so we can label this function Clear. Press the number pad * key to go back to the current line of code. We should now see our label in the comment section of the listing. We have found the address of the first function!

Go ahead and set a breakpoint on the next function: 01061131 FFD2 CALL NEAR EDX and press F9 to run to it. If we reference our program again, we know this call is the BeginState function, so we can once again hit Enter to follow the call and Shift + ; to set the function label. We can repeat this process two more times to obtain the address of the EndScene function and then finally the Present function.

Once we have all four of these functions addresses and understand the process, we can just do the same thing for the Release functions as well as the previous CreateDevice and Direct3DCreate9 functions we skipped over. I will just continue on from here though.

For now, clear out the breakpoints in this section (the 4 function calls and two NOP markers) so we can let the program run normally. Once you do that, go ahead and close the program so we can hit the release functions. When you hit the last NOP marker breakpoint set the final two breakpoints on the remaining two functions.

The first function is our DeviceRelease specific function. Label it and continue to the next function, which is the SDKRelease function. Label that one as well but do not leave the module yet. If you do leave the module just hit Enter again to go back into the d3d9 module. Right click on the main assembly pane and choose Search for -> User-defined labels. In the new window that opens, we will see out 6 functions we marked (since we skipped the first two initially). Here is what my table looks like:

Code:
User-defined labels
Label    Address                   Disassembly                 
<DeviceRelease> 503F6BB1           MOV EDI,EDI
<SDKRelease> 503FA1E0              MOV EDI,EDI
<Clear>  5040F206                  MOV EDI,EDI
<EndScene> 50410F67                MOV EDI,EDI
<BeginScene> 50411E31              MOV EDI,EDI
<Present> 5042DBA5                 MOV EDI,EDI
With these values and names, we now have the address of important Direct3D functions. Go ahead and F9 the program until it exists as we are done now.

Now we can apply our new findings to the Silkroad client to see if it did us any good. Load up sro_client.exe in Olly. Click on Debug -> Arguments and enter “0 /18 0 0” for the command line. Hit Ok and the press Ctrl + F2 to reload the executable so it will use our command line. We don’t need this for this guide, but we will for later guides.

Now, we need to set a breakpoint on the loader check. To find the check, right click on the main assembly pane and choose Search for -> All referenced text strings. It will take a moment to search so when it is done, hit Ctrl + Home to go to the top of the search results. Right click on the window area and choose Search for text. Type in “Please execute” and make sure case sensitive is not checked and hit Ok.

The first result we will see is related to our Loader check: 00733B55 |. 68 9CF6C400 PUSH sro_clie.00C4F69C ; |Text = "Please Execute the "Silkroad.exe."". We will want to set a breakpoint a few lines above on the JNZ. Here is a screenshot for reference:


Now we are ready to apply our knowledge. What we will want to do is just hit F9 once so we hit the breakpoint we just set. When the breakpoint has been set, we can go ahead and identify our Direct3D calls.

For now, we will just mark the rendering related functions. Start out with the Clear function. Hit Ctrl + g to go to the address of where your Clear function is located. Set the function label so we know what function it is and set a breakpoint on the address. Repeat this process for the three other functions.

When you are done hit the numpad * key to return to our current line of code, which is the launcher check. Hit enter to follow the jump and set the new line of code as the current EIP. To do this you can press Ctrl + * (on the numpad) or right click on the line and choose New origin here. Hit F9 again to resume running of the client.

After the client loads, we should first hit the Clear function, just as we had seen in our own program. So far so good, remove the breakpoint and hit F9 to continue. Now we hit the BeginScene, so remove the breakpoint and hit F9 to continue. Repeat this for the EndScene and Present functions.

At this point, we have found the main D3D functions we will need to hook. We removed our breakpoints so we could let the client load. If by chance the client disconnected, simply restart it and don’t set breakpoints there yet.

After you get to the login screen, you will want to apply a breakpoint to the EndScene function address. We do it here at the login screen since the smaller window for the startup logo also makes use of these functions and we do not care about that code. To go to the address of the EndScene function you can type in the address via the go to dialog (Ctrl + g) or you can type in the label name EndScene!

When you are at the function address, place a breakpoint. Immediately the client breaks. Click on the top line in the Call Stack and hit Enter to follow the call back. Here is a reference screenshot of what you should be seeing now. I added a comment to the function call:


Does anything look familiar? It certainly should! Based on what we saw in our previous program’s assembly output, we can see the game’s device object at address 0xA5F050. The line after next loads the EndScene function pointer from the object. Set a breakpoint on the function call line. Hit the numpad * key to return to the current breakpoint inside the EndScene function and remove it. Press Ctrl+ F2 to restart the application and run it again.

We will notice the breakpoint is triggered when the logo starts up, so remove the breakpoint and run normally until you are at the login screen again. We have finally found where the client’s function for invoking the D3D function is. We can repeat this process as needed for the other functions as well.

Congratulations! We are done now! Go ahead and close Olly.

V. Conclusion

By now, you should understand the basics of locating the Direct3D objects Silkroad uses. In doing so, you will now be able to hook those objects and implement additional rendering logic on top of the game screen. Making use of this specific knowledge will come in a later guide, so this guide is just a beginning stepping stone to bigger things.

Furthermore, you can now apply this knowledge to other programs and APIs if you are able to create a simple demo of the functionality you wish to find! This makes often perceived hard tasks relatively simply using this approach.

That wraps up this guide. As mentioned before, this is just preliminary information to understand for larger purposes. I hope you found this guide informational and beneficial. Stay tuned for future guides.

Drew “pushedx” Benton
edxLabs
pushedx is offline  
Thanks
50 Users
Old 06/22/2009, 21:46   #2
 
Eckoro's Avatar
 
elite*gold: 20
Join Date: Apr 2008
Posts: 2,643
Received Thanks: 2,326
nice guide. Will come in use to some people, one I know who :P

+1
Eckoro is offline  
Thanks
1 User
Old 06/22/2009, 22:51   #3

 
John Dread's Avatar
 
elite*gold: 28719
The Black Market: 138/0/0
Join Date: Nov 2007
Posts: 11,011
Received Thanks: 21,381
Awesome thing that you contribute your huge knowledge about silkroad and it's structure here on elitepvpers. Glad to have you here
John Dread is offline  
Thanks
4 Users
Old 06/23/2009, 16:56   #4
 
KeiAiAm's Avatar
 
elite*gold: 0
Join Date: Feb 2008
Posts: 175
Received Thanks: 30
Quote:
Originally Posted by Eckoro View Post
nice guide. Will come in use to some people, one I know who :P

+1
Quote:
Originally Posted by John Dread View Post
Awesome thing that you contribute your huge knowledge about silkroad and it's structure here on elitepvpers. Glad to have you here
Amazing. You just got active a few days ago and wrote two really good guides, which are offering a huge knowledge, and which are awesome for beginners/intermediates to learn. I'm reallly happy that you want to share all of your experiences and your knowledge (2nd time I know ) with us "noobs".

Regards
Break486
KeiAiAm is offline  
Old 06/23/2009, 17:49   #5
 
elite*gold: 0
Join Date: Apr 2008
Posts: 165
Received Thanks: 4
wut? XD i didn't understand anything lol... better i'll keep out from this thread !
LuisDaniel is offline  
Old 06/23/2009, 18:17   #6
 
KeiAiAm's Avatar
 
elite*gold: 0
Join Date: Feb 2008
Posts: 175
Received Thanks: 30
Quote:
Originally Posted by LuisDaniel View Post
wut? XD i didn't understand anything lol... better i'll keep out from this thread !
Well 's guide is here to help you
KeiAiAm is offline  
Old 06/23/2009, 21:08   #7
 
elite*gold: 0
Join Date: Jun 2008
Posts: 188
Received Thanks: 104
Oh my ***...

As I already said in your "Silkroad developer tools demand", I will show off my next project. The thing is - it's the same thing as this ! I also made a Direct3D hook, however it's a lot more complicated (with a lot more hooked functions), like DrawIndexPrimitive, EndScene, BeginScene (those are the ones I use the most).

I have actually started this project long time ago (in those days I used Azorbix's D3D starterkit), however as the project progressed I needed to make something of my own and to make a class that will handle everything on a simple way, so I ended up with something like wxWidgets, only for Silkroad. Also Klevre joined me on the project, but left quickly because it didn't work on his machine.

It started as a simple ingame IRC with the following interface (can't find newer ones) :


(maxUI in 02-12-2009)

It is fully movable around and newer version is a lot better, with Silkroad-like interface (you actually think it's all JM) and input controls. Also it features "tabbing" (top-left corner) and a clock (top-right), but it ain't Silkroad standard time.

I can't take screenshots of the newest version (I'm not on mine PC atm), but when I come home, if I find some time, I will.

I have put this project in Stealthex private area, and I'll quote myself:

Quote:
maxUI is going to be open-source and I will be releasing it soon. Maybe this or the next weekend. I'm completely out of ideas and the community probably will do much more than I can do alone.
However, I'm just unbeliavebly busy and working on another project, which requires me to be ingame, so this won't be available soon.

Oh and, btw, I'm unbeliavebly happy because I done something what Drew has done - all without his help
maxbot is offline  
Old 06/23/2009, 23:50   #8

 
elite*gold: 260
Join Date: Aug 2008
Posts: 560
Received Thanks: 3,753
Well it's certainly glad to hear other people doing these things maxbot.

Congrats on getting it done and having your own version of it! The screens look pretty nice if I might say. I'm not a big DirectX person, so I'm not familiar enough with the API to make my own GUI yet, but hopefully that will come eventually since as my next guide will show, AntTweakBar is a bit limited.

The days of using a messy Win32 GUI outside the client should be numbered. A lot of other game tools have GUIs integrated into the game, so Silkroad should be no different. Hopefully tools can start moving that way in the future as it's certainly a nice polish to have on the product.

I'll be looking forward to seeing the approach you take, so good luck on the release!
pushedx is offline  
Thanks
2 Users
Old 06/24/2009, 11:00   #9
 
elite*gold: 0
Join Date: Jun 2008
Posts: 188
Received Thanks: 104
Thanks on the comments

And yeah, the second project I was talking about, the one that requires me to be ingame - is a bot. I planned to build the whole GUI into Silkroad using this technique (I called my project Nitroglycerine), and when you go clientless it will show a nice GUI done in Qt.

However, because Silkroad servers are crowded 24/7, the bot is progressing very slowly (I don't even have picking-up done yet lol), so I am even thinking about giving up and just finishing Nitroglycerine.

Did I also say that Nitroglycerine is completely movable, resizable (only widgets that I want to be resizable are resizable) and generic ?



Looking forward to see your next guides.
maxbot is offline  
Old 06/24/2009, 15:24   #10
 
MoSHiRiKaTo's Avatar
 
elite*gold: 0
Join Date: Apr 2007
Posts: 23
Received Thanks: 22
DREW IS BACK! Yay I missed you man <3 This is Korhan btw Awesome guide!
MoSHiRiKaTo is offline  
Old 06/24/2009, 18:01   #11
 
strukel's Avatar
 
elite*gold: 20
Join Date: Jul 2007
Posts: 2,215
Received Thanks: 1,360
Its hard for me but im trying to get trough it

In 2 weeks school is over so I can fully concentrate on stuff like this, atm I only got like 1h time each day.
strukel is offline  
Old 06/27/2009, 12:32   #12
 
strukel's Avatar
 
elite*gold: 20
Join Date: Jul 2007
Posts: 2,215
Received Thanks: 1,360
#stick
strukel is offline  
Old 06/28/2009, 02:33   #13
 
elite*gold: 0
Join Date: May 2008
Posts: 489
Received Thanks: 210
Hm, this seems a little overcomplicated.

Look for the call to Direct3DCreate9, the IDirect3D9 pointer will be returned (stored in the EAX register). This pointer points to the vtable the compiler built for you, it contains all the addresses of the functions the IDirect3D9 interface defines. One of them is CreateDevice (count the functions and multiply the index by 4 (every address takes 4 bytes of course)). So CreateDevice will be the vtable pointer + the function offset. Once you've located CreateDevice you can check the parameters that are pushed onto the stack before the call and find out the address of the pointer to an IDirect3DDevice9 pointer (it's the last param I recall), the pointer pointed to will be a vtable pointer as well again. Now that you know where to obtain the device you can calculate every address in IDirect3DDevice9 or even obtain it dynamically in your hook and calculate the function addresses, so you don't have to worry about d3d updates anymore.
schlurmann is offline  
Old 06/28/2009, 04:47   #14

 
elite*gold: 260
Join Date: Aug 2008
Posts: 560
Received Thanks: 3,753
Quote:
Originally Posted by schlurmann View Post
Hm, this seems a little overcomplicated.
If you have the experience and knowledge to do what you just posted, then it should definitely appear that way as it's a lot faster and makes more sense for the long run. And that's one thing I don't emphasis in my articles is that there are probably better ways of doing everything, but the real purpose is to show one way in as much detail as I can so they can get an idea of how it works.

The methods presented in this article are more general and are geared for more than just D3D though, so with this approach, people can understand creative ways to get an idea of larger complex programs by reconstructing them as smaller, user created programs if possible. The COM interface provided by D3D does allow this task to be implemented much simpler as you have shown though and my methods won't necessarily work for all DLLs due to different address loading spaces (which wasn't the goal of the article anyways, just finding D3D calls in the client)

So it's really a matter of a method for a target audience that might not have an idea of how to begin going about these things and generally speaking not too experienced using vtables or understanding how a COM interface library works, etc... If you were interested in serious development of messing with all the D3D functions, then trying to go one by one using this method might be a little excruciating! But, when you are getting started, it's good to have at least one way you can grasp how it works before you move on to try to find a better solution.

Thanks for sharing another method though, as anyone interested in it can certainly pursue the approach when they are ready to find the most optimized methods for a task like this at hand. Of course, I'll always extend an open invitation for anyone who does have this kind of knowledge and has better ways of doing anything I show to write their own guides and share them so everyone can benefit by being exposed to a wide variety of ideas and approaches!
pushedx is offline  
Old 06/29/2009, 21:36   #15
 
elite*gold: 0
Join Date: Aug 2007
Posts: 120
Received Thanks: 14
rofl, i made a wallhack for silkroad XD
b00n0 is offline  
Reply


Similar Threads Similar Threads
Need help locating dmg modifiers?
05/13/2010 - Mabinogi - 13 Replies
So, last night, around this time, I had the brilliant idea to wase my free time by modding mabinogi so I could smash for, not 500%, but 500000% damage ("Desert dragon slayer with a single blow", anyone?) As well as mod the critical and maybe the lucky finish rates. However, that was almost 24 hours ago. I havn't slept in that time, barely eaten, my eyes are dry, I have a throbbing, pounding head... ect, and all I have to show for it is.... I have nothing to show for it. I cannot, for the life...
Locating item names
09/28/2009 - Diablo 2 - 3 Replies
Hey guys i'm just wondering where to find the item names. I mean where are they stored etc etc. Any help will be useful :)
Locating for edits
01/09/2008 - CO2 Weapon, Armor, Effects & Interface edits - 4 Replies
I want to start editing I am pretty good at photoshop but been browsing for a while and I cant seem to locate some of the edits u guys made. Like sword, blade, etc.. c3/texture don't have the sword or some that I am looking for. Can someone be nice and point out the folders. thanks!!
(Request)Locating Pker's
05/12/2006 - Conquer Online 2 - 8 Replies
Hello I am here to see if you have a program that can locate pker that will so in the map.. For example You know in team when u put the mouse over the players face it will show u where they r in the team. Yea something like that.... I remeber that there was something like that In CO 1 but i was wounderin if it is possible to make one for CO2 if there is let me know where to find it. Thank You



All times are GMT +2. The time now is 16:54.


Powered by vBulletin®
Copyright ©2000 - 2024, 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 ©2024 elitepvpers All Rights Reserved.