Actually it is not unreasonable to grab the string tables for any particular program.
Unless its encrypted and it usualy isn't.. the information like the skill tree will be stored in a nice little structure, which is then stored in a nice little array. So somewhere in the code is this stream of interesting data.
Ok so how do you find it you ask, its just a big load o 1's and 0's right?
Luckily, a lot of data that humans are interested in is string related, like the skill name. So all you need to do is find a string you are interested in, and start looking for that patterns ending in a 0. (most languages, except pascal notably, end strings with a null (0) character). Then its just a matter of decoding the structure arrangement of data surrounding that string.
for example, the structure for a skill tree item might be something like this.
Code:
struct skillItemStruct {
char * skillName;
enum experienceEnumType expType;
unsigned long int experienceNeeded;
unsigned short int sklllPointsNeeded;
};
Which in the datastream would look like.
a null terminated string
followed by
a byte indicating which exp type (figure out the encoding mechanism by comparing known types)
followed by
a 32 bit number
followed by
a byte
So, pulling out the DATA from a program generally isn't that difficulut.. as long as you have some idea of what might exist in the data you are looking for.
So what do you look for if you want to find the skill trees? O.. thinks like
Slicinng I
Slicing II
Slicing III
Slicing IV
And once you find those strings, start trying to match up other known data that you know (like how many skill points and exp it takes to get each of those skills) to the numbers between the strings.
Easy? Maybe not. But certainly within the realm of possibility.