[Guide] How to patch any client into an English client

09/01/2009 20:37 TheWhiteRabbit#31
Thanks, I don't saw it.
If someone has problems and wants to compare the things, download the client in the attachment, its for TSRO.
09/02/2009 10:46 pushedx#32
Ok, now that I finally got swsro downloaded.

Quote:
Originally Posted by ovidiu View Post
I did exactly like it says ( i think):
Your crash is because of what I mentioned in my second post:
Quote:
I just wanted to add that I've tested this and it works fine in sunsro private server. However, their client is really old, so things are not as straight forward. For example, you have to find the GetGlobalData function by looking at other clients to identify a location where it is used. Once you do that though and follow the rest of the guide, you can have an English version. You do need to patch the CRC check on the client though, but that's pretty simple.
So, the call you are referencing in your code is not the right one. Instead, you have to find the GetGlobalSettings function call another way.

Here's the method I used originally to determine the patch:

1. Search for all referenced text strings and find the language name of the client version you are using. In this case Chinese.

2. On the original language flag code, you will want to set a breakpoint on the language flag code. For this client:
Code:
00643039   .  C783 60070000>MOV DWORD PTR DS:[EBX+760],1
[Only registered and activated users can see links. Click Here To Register...]

3. Now, when you run the client in Olly (bypass the launcher msg) and you hit the BP, you will want to set a Hardware Breakpoint on the memory address that is getting the language flag. This is a pointer to the structure that the GetGlobalSettings function returns. To set the HWBP:

First, click on the address in the preview pane and choose Follow Address in Dump.
[Only registered and activated users can see links. Click Here To Register...]

Second, select the first byte in the dump, right click and choose: Breakpoint->Hardware, on access->Byte.
[Only registered and activated users can see links. Click Here To Register...]

4. Now press F9. You should hit the HWBP. If you look at the call, you will notice it's NOT what you want. However, you can see how the language flag is being used to load data from specific pk2 files.

Press F9 again 4 more times until that loading code is complete and the client starts.

5. You end up hitting another PK2 loading code, so hit F9. You can check the call to make sure it's not the right one.

6. Now, you hit another access on the byte, but this time, if you check the call, it looks like the right one. Here is where you should be now:
[Only registered and activated users can see links. Click Here To Register...]

If you look at the call above and follow it, you will see:
Code:
004968DF      CC            INT3
004968E0  /$  B8 90C6A900   MOV EAX,SRO_Clie.00A9C690
004968E5  \.  C3            RETN
004968E6      CC            INT3
That is how we know that is our GetGlobalData function. if we go back to the current code, we can see how the language flag is used:
Code:
0065B411   .  E8 CAB4E3FF   CALL SRO_Clie.004968E0
0065B416   .  83B8 38010000>CMP DWORD PTR DS:[EAX+138],1
This is just like the guide shows, except it's in a different spot.

Now you know the correct call address is: 0x4968E0 and you need to modify the flag by using:
Code:
MOV DWORD PTR DS:[EAX+0x138],1
instead!

Go to Debug->Hardware Breakpoints in the OllyDbg menu and Delete the hardware breakpoint now.

Now, you can patch the two English/Chinese flags as needed, then add in the new code for the language flag:
[Only registered and activated users can see links. Click Here To Register...]

Don't forget to add in the CRC patch (I see you did, but to anyone else reading this post) and then save all the patches to the exe.

Now, you should have a correctly patched client :)

[Only registered and activated users can see links. Click Here To Register...]

Attached is mine if anyone needs to compare.
09/02/2009 12:53 ovidiu#33
Yes , thanks a lot i finaly made it.
[Only registered and activated users can see links. Click Here To Register...]
09/12/2009 13:10 nemek#34
Thanks pushedx.

[Only registered and activated users can see links. Click Here To Register...]

Skils, and names of the monsters are not English subtitles.
11/22/2009 09:01 Yo123#35
is there any way to make this work on R-Sro?
the changes do not have any effect on the ingame language.
nor does it allow to create english named chars
12/01/2009 16:55 noname456#36
The video toturial will be great.. Couse i am not good at english and fail at this toturial..
12/31/2009 16:19 blagblog#37
How to get the language ID's?

//Edit
NVM I found it looking at the images... I did it with the Russian Silkroad version and it doesn't did nothing (still in russian).
01/01/2010 21:21 wizardLT#38
Yes, not working for Rsro, maby someone how to do it right?
01/07/2010 09:27 PhreaK™#39
If someone could put up the rsro client i could see if it is possible
01/07/2010 10:47 Kazuya¹#40
Quote:
Originally Posted by PhreaK™ View Post
If someone could put up the rsro client i could see if it is possible
[Only registered and activated users can see links. Click Here To Register...]
01/07/2010 19:28 PhreaK™#41
Yea rsro is coded waay differently then the other ones....drew is going to have to mess with it a bit...im not that good with coding yet
01/09/2010 23:00 Yo123#42
i guess you'll have to change the font and swearfilter as well ^-^
03/14/2010 16:36 MagiCircle#43
so...any1 know how this works in rsro now?^^
03/14/2010 16:41 Murgen#44
Quote:
Originally Posted by MagiCircle View Post
so...any1 know how this works in rsro now?^^
Use pk2 editor [Only registered and activated users can see links. Click Here To Register...]
Media/type.txt

It should be
Code:
Language = "Russia"
Country = "Russia"
LanguageTabIndex = "11"
GameType = "Silkroad"
GameGuard = ""
MarkFTPAddr = "files.silkroad.ru/SRO_CREST"
MarkFTPPath = ""
Change this to
Code:
Language = "English"
Country = "Russia"
LanguageTabIndex = "7"
GameType = "Silkroad"
GameGuard = ""
MarkFTPAddr = "files.silkroad.ru/SRO_CREST"
MarkFTPPath = ""
And boom! full English. takes 5 seconds.
03/14/2010 16:45 MagiCircle#45
Thats to easy...i want the hard way with ollydbg^^