Dragon Age: ORIGINS

Hacking Any Other Offline Single-Player Game

Moderators: g3nuin3, SpeedWing, WhiteHat, mezzo

Dragon Age: ORIGINS

Postby WhiteHat » Mon Dec 07, 2009 8:20 pm

It’s a bit odd that no discussion about this excellent game yet...

Haven’t work for complex addresses yet but here are few clues:

STAT HACKS
Most of them (Strength, Dexterity, Cunning, Willpower, etc) are stored in float data-type. When you obtain their address, my suggestion is to study the values around them via MHS Hex Editor. You’ll find some clues regard the current stat values such as the stats name (in Unicode string) and their max values. It turned out that max values for Main Stats are 1000.

EXP value also stored in float data-type...
And for max level, you should change it to 186000. Any values above that, then your hero won’t level up and so with his/her companions, and this is bad for your journey...
Also note that you have to search for whatever your EXP value on-screen added by 1. If it says 56 EXP, you should search for 57 in MHS.

Companion Approval value is stored in Signed Long...
Please keep in mind that if you want to modify this value to boost their intimacy, then do it gradually (around 25, 50, 75, and 99). Otherwise, they won’t get bonus skills...


MONEY HACK
Money in Dragon Age showed in x GOLD, y SILVER, and z BRONZE.

Now note that:
1 GOLD = 100 SILVER
1 SILVER = 100 BRONZE
that makes 1 GOLD = 10000 BRONZE

so if, for example, your money is 14 GOLD, 1 SILVER, and 76 BRONZE, then you have to search for: 140000 + 100 + 76 = 140176. The data type is Unsigned Long.



Edit: Addition (Tue Dec 08, 2009 12:17 pm)

INVENTORY LIMIT
The max amount for inventory stored in Unsigned Long. Use backpack item for sub-searching.
Note that its original max value is 125. But we can boost it into something like 5000 or more, giving us much much freedom to store more items.

Something still related to inventory, the number of each item also stored in Unsigned Long, and though it seems their limits are 99, we can actually modify it to any value higher. But please keep in mind that there are some specific items that don’t work this way such as gifts. I believe that though each of gifts shows their item numbers, they actually stored in separated addresses. For example if you have 3 wines, then there are 3 different address that hold the structures of each wine. Thus modify this on-screen value to something else won’t work...





Feel free to add something..

:)
.. to boldly go where no eagle has gone before...
User avatar
WhiteHat
Elang Djawa
 
Posts: 1059
Joined: Fri Jul 21, 2006 12:49 pm
Location: Away for a while...

Re: Dragon Age: ORIGINS

Postby CoMPMStR » Mon Dec 14, 2009 3:16 am

I wouldn't try for complex addresses on this game, well actually I did and it's not worth it. It was better for me to learn some semi-complex asm than search for pointers. ;)
With that being said, and rather than posting lots of code with explanations and such, here are my lssave files for this game. :D
I also created a +8 trainer based off of these lssave files, and there's also some explanations of each option in the Auto Assembler section for each option (also available in the trainer's Readme.txt). Sorry, no comments for the asm code.

There are 2 lssave files inside the archive, one for the initial release (v1.0) and the other for the first patch update (v1.01). I didn't install any further updates therefore I haven't had a chance to find the correct addys for those versions, but it isn't hard to refind them.

What's available:
- Increased Max HP/MP/Stamina
- Infinite MP/Stamina (Current)
- Instant Usage Refill
- Quick EXP Gain
- Max Points
- Max Money
- Max Capacity
- Item Dupe (Stackable)
Image

______________________________________________________
My Utilities:
CT <-> LSSAVE Converter
LSS Visual Dialog Designer
.NET Trainer Helper Library

~Whether you think you can or you think you can't, you're right.

L. Spiro wrote:In my left hand is a red pill. If you take it I will show you the truth. I lost my right hand in the war, so I’m afraid you’re stuck with the red pill.
User avatar
CoMPMStR
(P)ot (I)n (M)y (P)ipe
 
Posts: 451
Joined: Thu Mar 06, 2008 7:50 am
Location: Best Place

Re: Dragon Age: ORIGINS

Postby toffey » Wed Dec 16, 2009 4:37 pm

Yeah I had looked into the complex addys for this game as well, but pretty much hit a brick wall. Most of the addys were fairly easy to find through basic searches, but your trainer worked wonders for me when I tried it out a while ago.

I did run into a problem where my gold went into the negatives (after editing it to an insanely high value with MHS) and I was completely unable to figure out how to get it back out from negatives. Although I didn't know this at the time:
MONEY HACK
Money in Dragon Age showed in x GOLD, y SILVER, and z BRONZE.

Now note that:
1 GOLD = 100 SILVER
1 SILVER = 100 BRONZE
that makes 1 GOLD = 10000 BRONZE

so if, for example, your money is 14 GOLD, 1 SILVER, and 76 BRONZE, then you have to search for: 140000 + 100 + 76 = 140176. The data type is Unsigned Long.

Hopefully now I'll be able to get my gold working again because playing an RPG with hacks and being unable to buy anything is a bit lame.
Angels on the sideline,
Puzzled and amused.
Why did Father give these humans free will?
Now they're all confused.

Don't these talking monkeys know that Eden has enough to go around?
Plenty in this holy garden, silly monkeys.
Where there's one you're bound to divide it right in two.
Tool
Right in Two
User avatar
toffey
Hack-Master Hex
 
Posts: 689
Joined: Fri Sep 05, 2008 5:39 pm
Location: California, USA

Re: Dragon Age: ORIGINS

Postby WhiteHat » Thu Dec 17, 2009 10:25 am

@CoMPMStR
Thanks for the addition and LSSAVEs...

@toffey
I was wrong to say that the data-type for money is Unsigned Long...
It should be Signed LONG, so you may want to set the value to
something around 2 billion (2,000,000,000 -> nine zeros).

Haven’t done pretty much things to this game since my latest post...
.. to boldly go where no eagle has gone before...
User avatar
WhiteHat
Elang Djawa
 
Posts: 1059
Joined: Fri Jul 21, 2006 12:49 pm
Location: Away for a while...

Re: Dragon Age: ORIGINS

Postby Aspras » Sat Dec 19, 2009 6:20 am

Does anyone still have the first version of the game ? Theres an injection id like to have tested on other machines too.
User avatar
Aspras
NULL
 
Posts: 100
Joined: Mon Jan 05, 2009 12:42 am

Re: Dragon Age: ORIGINS

Postby Aspras » Wed Dec 23, 2009 7:53 am

Most of you probably have the patched version of the game so this might not be too useful but I will post it anyway. I did a lot of testing and I hope I have found code caves that will work for everyone, with this injection you will be able to make pointers for petty much everything you need. I use Cheat Engine's auto assembler to inject it since MHS's does not accept this syntax, anyone who can rewrite it so that MHS accepts it is welcome to. You need to inject this while on the main menu or just make sure its injected before loading a savegame or before starting a new campaign.

Code: Select all
DAOrigins.exe+91F59B:
mov [DAOrigins.exe+91F5C1],edi
lea esi,[edi+00000190]
jmp DAOrigins.exe+21477e

DAOrigins.exe+214778:
jmp DAOrigins.exe+91F59B
nop

DAOrigins.exe+7C7865:
mov [DAOrigins.exe+91F58C],eax
mov ecx,[eax]
call gmatrix2d::gety+232410
jmp DAOrigins.exe+2CB809

DAOrigins.exe+2CB802:
jmp DAOrigins.exe+7C7865
nop
nop


Pointers for anything specific to your character look like this.

Code: Select all
HP
[[["DAOrigins.exe"+0x91F5C1]+0x194]+0x1C]+0x5C


Code: Select all
XP
[[["DAOrigins.exe"+0x91F5C1]+0x194]+0x4C]+0x4C


Code: Select all
ATTRIBUTE PTS
[[["DAOrigins.exe"+0x91F5C1]+0x194]+0x88]+0x4C



So you just use [["DAOrigins.exe"+0x91F5C1]+0x194] and make pointers for any other stuff.
Unfortunately gold is different probably because the whole party shares it and the pointer I came up with is this one.

Code: Select all
[[[[[["DAOrigins.exe"+0x91F58C]]+0x28+0x14]+0x4]]+0xC]+0xC


You will need to sell something to a merchant npc before you can use it. All data types are unsigned long or long.




EDIT:
Here is the new injection and pointers for v1.02 of the game. Patched using the official patch and used the executable provided by SKIDROW.
Once again inject this while on the main menu.

Code: Select all
DAOrigins.exe+3C05F1:
jmp DAOrigins.exe+7BC699
nop
nop

DAOrigins.exe+7BC699:
cmp [DAOrigins.exe+7BC391],0   
je DAOrigins.exe+7BC417
push eax
mov eax,DAOrigins.exe
cmp eax,[DAOrigins.exe+7BC315]
jne DAOrigins.exe+7BC495
mov [DAOrigins.exe+7BC599],esi
pop eax
mov ecx,edi                                     
call gsysfile::getfilestat+208bb0               
jmp DAOrigins.exe+3c05f8                       
                                               
DAOrigins.exe+7BC417:
push eax                           
mov [DAOrigins.exe+7BC315],DAOrigins.exe       
mov [DAOrigins.exe+7BC391],1                   
jmp DAOrigins.exe+7BC6B8                             

DAOrigins.exe+7BC495:
mov [DAOrigins.exe+7BC391],0
pop eax
jmp DAOrigins.exe+7BC699

DAOrigins.exe+7dfb8b:
mov [DAOrigins.exe+7be3e4],ebx
test ecx,ecx
lea esi,[ebx+00000190]
jmp DAOrigins.exe+315e07

DAOrigins.exe+315dff:
jmp DAOrigins.exe+7dfb8b
nop
nop
nop



Now for all stats and attributes that are character related you use [["DAOrigins.exe"+0x7be3e4]+0x194] the same way it is used in v1.00. So for example XP would be.

Code: Select all
XP
[[["DAOrigins.exe"+0x7be3e4]+0x194]+0x4C]+0X4C


Data types are the ones WhiteHat already mentioned in his first post, although I noticed spell points are unsigned long so I guess attribute points as well as talent ones should be similar.
Gold can now be accessed through a fairly shorter path. Note that you dont need to sell anything anymore , you just inject on the main menu , load a savegame and all pointers will be active.

Code: Select all
GOLD
["DAOrigins.exe"+0x7BC599]+0x9C
User avatar
Aspras
NULL
 
Posts: 100
Joined: Mon Jan 05, 2009 12:42 am

Re: Dragon Age: ORIGINS

Postby WhiteHat » Sun Dec 27, 2009 10:22 pm

Funny... I have been using the very similar method as Aspras did. Only my pointers goes 1 layer deeper, and contain some indexed list. I remember them like something as follow (unpatched version aka v1.00):
Code: Select all
[[[["DAOrigins.exe"+0x400]+0x8]+0x194]+0xN*0x4]+0x4C


Where N is the index for certain values like:
- If N = 0x1, leads to the address for STRENGTH
- If N = 0x14, leads to the address for MAX HP
- etc

They are not the exact Complex Address and list, since i post this from internet cafe. But tomorrow i will post the real one with the injection code. Anyway, the reason i went little deeper with the pointer trail was because it made easier for me to browse every squad members’ stats (and even equipments, though i have no time to dig them up yet) include hero’s. So, if for example, i browse my squad members by hitting F1, F2, F3 or F4, then ["DAOrigins.exe"+0x400] will be the pointer for the corresponding squad member, from which i built the complex address...

Oh, and i am 100% positive about spell/attribute/talent points being float since they are...

It is nice to see someone has similar method, by the way. I was about to keep it for myself since it is a bit ‘weird’ and somehow feels noobish...
.. to boldly go where no eagle has gone before...
User avatar
WhiteHat
Elang Djawa
 
Posts: 1059
Joined: Fri Jul 21, 2006 12:49 pm
Location: Away for a while...

Re: Dragon Age: ORIGINS

Postby Aspras » Sun Dec 27, 2009 11:03 pm

I dont think this is a noobish method since I remember using many cheathappens trainers that worked like this, you had to use a hotkey on the main menu (which obviously injected code) before using the trainer's features. What you did with the complex address for different party members sounds cool, definitely worth the additional pointer level :) Also, regarding attribute and spell points. Im not sure whether we are talking about the same variables, when i say attribute points i mean the points available to you to add to strength , dexterity and not the attributes themselves. Either way I found the address of spell points and attribute points by searching for unsigned long and not float :?
User avatar
Aspras
NULL
 
Posts: 100
Joined: Mon Jan 05, 2009 12:42 am

Re: Dragon Age: ORIGINS

Postby WhiteHat » Mon Dec 28, 2009 9:00 am

Here’s the code snippet (which i believe to be a function) to which my code injection goes to:
Code: Select all
0070C730 | 83EC 08     | sub     esp, 8                  |
0070C733 | 56          | push    esi                     |
0070C734 | 8BF1        | mov     esi, ecx                |
0070C736 | 8B56 04     | mov     edx, dword ptr [esi+4]  |
0070C739 | 85D2        | test    edx, edx                |
0070C73B | 75 04       | jnz     0070C741                |
0070C73D | 33C9        | xor     ecx, ecx                |
0070C73F | EB 08       | jmp     0070C749                |
0070C741 | 8B4E 08     | mov     ecx, dword ptr [esi+8]  |
0070C744 | 2BCA        | sub     ecx, edx                |
0070C746 | C1F9 02     | sar     ecx, 2                  |
0070C749 | 85D2        | test    edx, edx                |
0070C74B | 74 24       | je      0070C771                |
0070C74D | 8B46 0C     | mov     eax, dword ptr [esi+C]  |
0070C750 | 2BC2        | sub     eax, edx                |
0070C752 | C1F8 02     | sar     eax, 2                  |
0070C755 | 3BC8        | cmp     ecx, eax                |
0070C757 | 73 18       | jnb     0070C771                |
0070C759 | 8B46 08     | mov     eax, dword ptr [esi+8]  |
0070C75C | 8B4C24 10   | mov     ecx, dword ptr [esp+10] |
0070C760 | 8B11        | mov     edx, dword ptr [ecx]    |
0070C762 | 8910        | mov     dword ptr [eax], edx    | <--- The injection goes here...
0070C764 | 83C0 04     | add     eax, 4                  |
0070C767 | 8946 08     | mov     dword ptr [esi+8], eax  |
0070C76A | 5E          | pop     esi                     |
0070C76B | 83C4 08     | add     esp, 8                  |
0070C76E | C2 0400     | retn    4                       |
0070C771 | 57          | push    edi                     |
0070C772 | 8B7E 08     | mov     edi, dword ptr [esi+8]  |
0070C775 | 3BD7        | cmp     edx, edi                |
0070C777 | 76 05       | jbe     0070C77E                |
0070C779 | E8 D2261A00 | call    008AEE50                |
0070C77E | 8B4424 14   | mov     eax, dword ptr [esp+14] |
0070C782 | 50          | push    eax                     |
0070C783 | 57          | push    edi                     |
0070C784 | 56          | push    esi                     |
0070C785 | 8D4C24 14   | lea     ecx, dword ptr [esp+14] |
0070C789 | 51          | push    ecx                     |
0070C78A | 8BCE        | mov     ecx, esi                |
0070C78C | E8 8F270000 | call    0070EF20                |
0070C791 | 5F          | pop     edi                     |
0070C792 | 5E          | pop     esi                     |
0070C793 | 83C4 08     | add     esp, 8                  |
0070C796 | C2 0400     | retn    4                       |


Now, the code is heavily shared which means many values other than the ‘Player Pointers’ are written to. So, i made some conditional comparisons (this is what i feel so noobish about in my previous post) in my code-injection:
Code: Select all
FullAccess( DAOrigins.exe+0x0030C762, 5 )
FullAccess( DAOrigins.exe+0x00000400, 4 )


[ENABLE]

Alloc   ( MyCode, 2048 )
Label   ( OverwrittenCode )
Label   ( Exit )
Label   ( Return )

DAOrigins.exe+0x0030C762 :
jmp     MyCode
Return :

MyCode :
cmp     byte ptr [eax+10], 0x30
jne     OverwrittenCode
cmp     byte ptr [eax+14], 0x18
jne     OverwrittenCode
cmp     byte ptr [eax+18], 0xC0
jne     OverwrittenCode
cmp     dword ptr [edx], 0xAC70A8
jne     OverwrittenCode
mov     dword ptr [DAOrigins.exe+0x00000400], edx

OverwrittenCode :
mov     dword ptr [eax], edx
add     eax, 4

Exit :
jmp     Return


[DISABLE]

Dealloc ( MyCode )

DAOrigins.exe+0x0030C762 :
mov     dword ptr [eax], edx
add     eax, 4


The idea of those comparison is to make sure if 0x400400 will only be changed if it is really a ‘Player Pointer’ instead other value types. I did study the surrounding value via MHS Hex Editor (Did similar method for Mass Effect)... Please, feel free to post better methods than this one.. Thank you very much in advance..

Next step, I made an entry for MHS Main List (table) that is address 0x400400 (="DAOrigins.exe+0x400) and modify its Auto-Assemble part. Now by locking (enabling the code-injection) this address, the pointer in 0x400400 will be changed according to whom party member we selected as the active one. Even better, we can browse to every part members available while in Camp mode...

And from this address, i built this complex addresses (there are still many more to build using different offset indexes):
EXPERIENCE
[[[["DAOrigins.exe"+0x400]+0x8]+0x194]+0x13*0x4]+0x4C

ATTRIBUTE POINTS
[[[["DAOrigins.exe"+0x400]+0x8]+0x194]+0x22*0x4]+0x4C

SPECIALIZATION POINTS
[[[["DAOrigins.exe"+0x400]+0x8]+0x194]+0x26*0x4]+0x4C

SKILL POINTS
[[[["DAOrigins.exe"+0x400]+0x8]+0x194]+0x23*0x4]+0x4C

TALENT/SPELL POINTS
[[[["DAOrigins.exe"+0x400]+0x8]+0x194]+0x24*0x4]+0x4C

HP CURRENT
[[[["DAOrigins.exe"+0x400]+0x8]+0x194]+0x7*0x4]+0x5C

HP MAX
[[[["DAOrigins.exe"+0x400]+0x8]+0x194]+0x7*0x4]+0x4C

STAMINA/MANA CURRENT
[[[["DAOrigins.exe"+0x400]+0x8]+0x194]+0x8*0x4]+0x5C

STAMINA/MANA MAX
[[[["DAOrigins.exe"+0x400]+0x8]+0x194]+0x8*0x4]+0x4C

ATT. STRENGTH
[[[["DAOrigins.exe"+0x400]+0x8]+0x194]+0x1*0x4]+0x4C

ATT. DEXTERITY
[[[["DAOrigins.exe"+0x400]+0x8]+0x194]+0x2*0x4]+0x4C

ATT. WILLPOWER
[[[["DAOrigins.exe"+0x400]+0x8]+0x194]+0x3*0x4]+0x4C

ATT. MAGIC
[[[["DAOrigins.exe"+0x400]+0x8]+0x194]+0x4*0x4]+0x4C

ATT. CUNNING
[[[["DAOrigins.exe"+0x400]+0x8]+0x194]+0x5*0x4]+0x4C

ATT. CONSTITUTION
[[[["DAOrigins.exe"+0x400]+0x8]+0x194]+0x6*0x4]+0x4C

Notice that there are indexed offsets contained. Each one leads to different address...

And for the equipments part, i have these complex addresses. They leads to the currently equipped equipments pointers which we can dig deeper. I’ve done some kind of item duplication but the result have not been perfect...

POINTER for MAIN HAND EQUIPMENT
[["DAOrigins.exe"+0x400]+0x424]+(0x1*0x30)+0x80

POINTER for MINOR HAND EQUIPMENT
[["DAOrigins.exe"+0x400]+0x424]+(0x2*0x30)+0x80

POINTER for BODY ARMOR
[["DAOrigins.exe"+0x400]+0x424]+(0x5*0x30)+0x80


For other equipment such as gloves, boots, etc, you can change the offset index into something else. If i remember it correctly, 0x6 will be the index for boots...


And here are the screen shots, each party member with their MHS Main List (table). Like i said, when i browse each of them, the addresses (built by Complex Address) in MHS Main List will be changed accordingly:

Screen shot for The Hero:
Image
Image

Screen shot for Morrigan:
Image
Image

Screen shot for Leliana:
Image
Image

Screen shot for Alistair:
Image
Image

...i just love to play in boosted stats...

Hope this is useful... Any help in reversing equipments will be great...
.. to boldly go where no eagle has gone before...
User avatar
WhiteHat
Elang Djawa
 
Posts: 1059
Joined: Fri Jul 21, 2006 12:49 pm
Location: Away for a while...

Re: Dragon Age: ORIGINS

Postby WhiteHat » Mon Dec 28, 2009 9:25 am

Aspras wrote:...regarding attribute and spell points. Im not sure whether we are talking about the same variables, when i say attribute points i mean the points available to you to add to strength , dexterity and not the attributes themselves. Either way I found the address of spell points and attribute points by searching for unsigned long and not float :?

Maybe it is due the patched version ? I am playing the unpatched version, fresh from the DVD (crcked by the way ^_^;)..
But if you see my screen shots above, you can see that Attribute Points (the one which is available for us to distribute to our attributes) is surely Float value...
.. to boldly go where no eagle has gone before...
User avatar
WhiteHat
Elang Djawa
 
Posts: 1059
Joined: Fri Jul 21, 2006 12:49 pm
Location: Away for a while...

Re: Dragon Age: ORIGINS

Postby Aspras » Tue Dec 29, 2009 9:08 pm

Its definitely because we have different versions of the game. The first version of my game I got by downloading a RELOADED release and thats probably why everything was unsigned long (even hp). Then I used the official v1.02 patch and then a crack by another group so I guess m game is all messed up haha.
I didnt know you could have several specializations at once :shock: Maybe we could find a way to make a specialization unlocker hack.
User avatar
Aspras
NULL
 
Posts: 100
Joined: Mon Jan 05, 2009 12:42 am

Re: Dragon Age: ORIGINS

Postby WhiteHat » Wed Dec 30, 2009 10:29 pm

Aspras wrote:Its definitely because we have different versions of the game. The first version of my game I got by downloading a RELOADED release and thats probably why everything was unsigned long (even hp). Then I used the official v1.02 patch and then a crack by another group so I guess m game is all messed up haha.

Even so, i can say that such difference in data-type usage should not be happen through few patches. Take WC3 for example, its data types for common things have not been changed until the most recent patch. Or so i believe...

Aspras wrote:I didnt know you could have several specializations at once :shock: Maybe we could find a way to make a specialization unlocker hack.

Normally we are allowed to choose 2 specialization out of 4 available ones. With this kind of hack, we can pick all 4 of them with, of course, more Spell/Talents points needed. And this is not that hard at all since if we do study the values around them via Hex Editor, we'll surely find many many intersting values...

Unlocking specialization is kind of tedious task. Once they are available, the game will allow any characters we play in the same PC to pick them. It’s one time modification, and how would we search and sub-search that ?.. Maybe scanning value via Hex Editor will able us to do so...
.. to boldly go where no eagle has gone before...
User avatar
WhiteHat
Elang Djawa
 
Posts: 1059
Joined: Fri Jul 21, 2006 12:49 pm
Location: Away for a while...

Re: Dragon Age: ORIGINS

Postby Aspras » Fri Jan 01, 2010 10:36 pm

Imo the best way to do this would be by using auto-hack to find what accesses the address of specialization points and then studying the area around the addresses that showed up using a debugger.
User avatar
Aspras
NULL
 
Posts: 100
Joined: Mon Jan 05, 2009 12:42 am

Re: Dragon Age: ORIGINS

Postby [Psych] » Fri Jan 01, 2010 11:19 pm

Aspras wrote:Its definitely because we have different versions of the game. The first version of my game I got by downloading a RELOADED release and thats probably why everything was unsigned long (even hp).


I highly doubt an update/version difference is going to change the datatypes the game uses for it's variables. There isn't going to be one guy who, on his game, has found HP using LONG, and another dude bringing it up as FLOAT :-/ It is, however, possible that one datatype is used for the real value, and another used for the ghost value, which is present in some games (maybe in this one; I don't know).
[Psych]
Hacker Smacker
 
Posts: 41
Joined: Thu Jul 16, 2009 4:15 pm

Re: Dragon Age: ORIGINS

Postby Aspras » Sat Jan 02, 2010 1:49 am

The addresses I had found were definitely not ghost ones. I remember using a .lssave file when I had the unpatched version of the game where all the addresses were unsigned long , thats why I mentioned they were unsigned long when I posted the first injection and those few pointers in the first place. What I suspect might have happened is me having searched for 4 byte addresses using cheat engine instead of mhs and then having transfered the pointers to mhs and used unsigned long instead of float.
User avatar
Aspras
NULL
 
Posts: 100
Joined: Mon Jan 05, 2009 12:42 am

Next

Return to Others (Offline)

Who is online

Users browsing this forum: No registered users and 0 guests

cron