Blizzhackers

Return of the Jedi

* Login   * Register    * FAQ    * Search

Join us on IRC: #bh@irc.synirc.net (or Mibbit Web IRC)


MuleFactory


It is currently Sun May 19, 2013 1:02 pm


All times are UTC [ DST ]





Post new topic Reply to topic  [ 16 posts ]  Go to page 1, 2  Next
Author Message
 Post subject: How to find out if I am hostiled?
PostPosted: Fri Sep 02, 2011 5:45 pm 
 
User
User

Joined: Sun Jun 22, 2008 7:40 pm
How can i tell if I am hostiled? I cant find any address/pointer.
all I found was ASMPTR(D2CLIENT, TestPvpFlag_I, 0x4FCE0) but when Call that function using

ProcCall("game.exe","stdcall",$D2Client + 0x4FCE0, "int")

or
ProcCall("game.exe","fastcall",$D2Client + 0x4FCE0, "int")

it returns me 0

when I memory read that address it showed me 232 as value and hostile didn't change it. any ideas?

I tried to do changed and unchanged value scan with CE but it didn't seem to work.

_________________
Discuss: Copy-Paste [url=http://www.blizzhackers.cc/viewtopic.php?f=182&t=483257&p=4520230#p4520230]Tabbed Dia
Download: Copy-Paste Tabbed Dia D2 function caller

Top
 Profile  
 Post subject: Re: How to find out if I am hostiled?
PostPosted: Fri Sep 02, 2011 6:31 pm 
 
User
User

Joined: Sun Jun 22, 2008 7:40 pm
I also tried this code but it returned me 0

;==================================================================================
; Function:         _DiaAPI_ReadRosterUnit($hProc)
; Description:      Reads the roster unit struct for player information.
; Parameter(s):      $hProc   -   The handle to the opened Diablo 2 process as returned
;                        by _Dia_OpenProcessByWindow
; Requirement(s):   None.
; Return Value(s):    On Success - Returns the specified info of a player.
;               On Failure - Returns 0
; Author(s):      Murder567
; Note(s):
;==================================================================================
;Todo: Make It Read And Store All Data In Array
Func _DiaAPI_ReadRosterUnit() ; works to read party members iffy on single player with urself lol
   $pRosterUnitStruct = 0x11BC14
   $pNextRU = 0x80
   $dwPartyFlagsRU = 0x30

   Local $Buffer = DllStructCreate('ptr')
   Local $AreaLevel = DllStructCreate('dword')
   Local $iRead1 = 4
   Local $iRead2 = 2
   _WinAPI_ReadProcessMemory($Diablo_MemHandle, $D2CLIENT_OFFSET+$pRosterUnitStruct, DllStructGetPtr($Buffer), DllStructGetSize($Buffer), $iRead1)
   $Pointer1 = '0x' & Hex(DllStructGetData($Buffer, 1)+$pNextRU)
   _WinAPI_ReadProcessMemory($Diablo_MemHandle, $Pointer1, DllStructGetPtr($Buffer), DllStructGetSize($Buffer), $iRead1)
   $Pointer2 = '0x' & Hex(DllStructGetData($Buffer, 1)+$dwPartyFlagsRU) ;specify what to read here
   _WinAPI_ReadProcessMemory($Diablo_MemHandle, $Pointer2, DllStructGetPtr($AreaLevel), DllStructGetSize($AreaLevel), $iRead1)
   Return DllStructGetData($dwPartyFlagsRU, 1)
EndFunc


any suggestions?

_________________
Discuss: Copy-Paste [url=http://www.blizzhackers.cc/viewtopic.php?f=182&t=483257&p=4520230#p4520230]Tabbed Dia
Download: Copy-Paste Tabbed Dia D2 function caller

Top
 Profile  
 Post subject: Re: How to find out if I am hostiled?
PostPosted: Fri Sep 02, 2011 6:38 pm 
 
Moderator
Moderator
User avatar

Joined: Mon Jan 30, 2006 2:29 pm
Location: Barrie, Ontario
TestPvPFlag(playerId, yourId, 8)

Also it has a non-standard calling convention, so you need to edit the way ProcCall does it.

Top
 Profile  
 Post subject: Re: How to find out if I am hostiled?
PostPosted: Fri Sep 02, 2011 7:08 pm 
 
User
User

Joined: Sun Jun 22, 2008 7:40 pm
Found this from d2helpers.cpp but not sure what to do with it. I would have to convert it to opcodes but how? using http://ref.x86asm.net/coder32.html? or is there any better methods?
DWORD __declspec(naked) __fastcall TestPvpFlag_STUB(DWORD planum1, DWORD planum2, DWORD flagmask)
{
   __asm
   {
      push esi;
      push [esp+8];
      mov esi, edx;
      mov edx, ecx;
      call D2CLIENT_TestPvpFlag_I;
      pop esi;
      ret 4;
   }
}

_________________
Discuss: Copy-Paste [url=http://www.blizzhackers.cc/viewtopic.php?f=182&t=483257&p=4520230#p4520230]Tabbed Dia
Download: Copy-Paste Tabbed Dia D2 function caller


Last edited by butcher on Fri Sep 02, 2011 7:13 pm, edited 1 time in total.
Top
 Profile  
 Post subject: Re: How to find out if I am hostiled?
PostPosted: Fri Sep 02, 2011 7:09 pm 
 
User
User

Joined: Tue Mar 01, 2005 8:31 pm
Check the last byte of packet 8c is another way.

Top
 Profile  
 Post subject: Re: How to find out if I am hostiled?
PostPosted: Fri Sep 02, 2011 7:43 pm 
 
User
User

Joined: Sun Jun 22, 2008 7:40 pm
I am not hooking packet function here.


I am terrible noob at C++.. but how would function look like in c++ ?

just looking for function that would input d2 handle and return true if hostiled


edit: Shaggi said me to convert this to autoit
for(RosterUnit * unit = *D2CLIENT_PlayerUnitList; unit; unit = unit->pNext)
    if(unit->dwPartyFlags & PLAYER_HOSTILE) {
        // do stuff like chicken
}


so I am on my way to it.
$playerunitlist = _ReadD2Memory($Diablo_MemHandle, $d2client + 0x11BC14, "int")


gut I am not sure what RosterUnit * unit = *D2CLIENT_PlayerUnitList means. could anyone explain that? Partt of code I cant understand is * unit = * Does it mean I have to multiply something?



Or is it something like this?
while $unit
$playerunitlist = _ReadD2Memory($Diablo_MemHandle, $d2client + 0x11BC14, "int")
$RoosterUnit = $playerunitlist
$unit =  _ReadD2Memory($Diablo_MemHandle, $d2client + 0x11BC14, "int")
wend


Could anyone explain me that C++ loop in plain english please? and what does unit->pNext mean?

Edit2: Shaggi suggested me this loop instead
Func IsHostiled()
   $unit = _ReadD2Memory($Diablo_MemHandle, $D2CLIENT_OFFSET + 0x11BC14)
   ConsoleWrite("unit "&$unit&@CRLF)
   While $unit
      $unit = _readd2memory($Diablo_MemHandle, $unit + 0x30)
      ConsoleWrite("unit "&$unit&@CRLF)
      If $unit = 8 Then MsgBox(0, 0, "Hostiled")
   WEnd
EndFunc   ;==>IsHostiled


but it outputs me
Quote:
unit 90767616
unit 1
unit 0


which means that there has to be logic problem in that loop because it ends with 0

also in C++ source there is if(unit->dwPartyFlags & PLAYER_HOSTILE) { which I am not sure what it does. I think it means
if BitAnd( readd2memory($Diablo_MemHandle) + $dwPartyFlags , $PLAYER_HOSTILE )
Correct me if I am wrong about that if

Edit3:
Here's latest code I could come up with but it's still buggy
Func IsHostiled()
   $dwPartyFlags = 0x30
   $PLAYER_HOSTILED = 0x08
   $unit = _ReadD2Memory($Diablo_MemHandle, $D2CLIENT_OFFSET + 0x11BC14)
   ConsoleWrite("unit "&$unit&@CRLF)
   While $unit
      $unit = _readd2memory($Diablo_MemHandle, $unit + 0x30)
      ConsoleWrite("unit "&$unit&@CRLF)
      If BitAND(_readd2memory($Diablo_MemHandle,$unit + $dwPartyflags),$PLAYER_HOSTILED) Then MsgBox(0, 0, "Hostiled")
   WEnd
EndFunc   ;==>IsHostiled


for those who arent friendly to Autoit ReadD2Memory returns value of address.

There must be some logic problem or something.

_________________
Discuss: Copy-Paste [url=http://www.blizzhackers.cc/viewtopic.php?f=182&t=483257&p=4520230#p4520230]Tabbed Dia
Download: Copy-Paste Tabbed Dia D2 function caller

Top
 Profile  
 Post subject: Re: How to find out if I am hostiled?
PostPosted: Fri Sep 02, 2011 11:57 pm 
 
Section Leader
Section Leader

Joined: Fri Jul 05, 2002 8:51 pm
Location: /sbin/
You basically can't call it from AutoIT unless you want to do a lot of hard conversion work. And if you don't understand the C enough to convert it, I'd suggest you learn C.

_________________
D2BS
Programming motherfuckers... DO YOU SPEAK IT?!
I, for one, welcome our new black overlo... I mean, president!
  1. Create signature generator.
  2. ???
  3. Profit!

Top
 Profile  
 Post subject: Re: How to find out if I am hostiled?
PostPosted: Sat Sep 03, 2011 4:08 am 
 
BHDev
BHDev
User avatar

Joined: Mon Jul 13, 2009 5:13 pm
Location: Denmark
Here is the correct source..
Func IsHostiled()
   Local $RosterUnit = _ReadD2Memory($Diablo_MemHandle,$D2Client + 0x11BC14)
   While $RosterUnit
      If BitAND(_ReadD2Memory($Diablo_MemHandle,$RosterUnit + 0x30),0x08) Then Return True
      $RosterUnit = _ReadD2Memory($Diablo_MemHandle,$RosterUnit + 0x80)
   WEnd
   Return False
EndFunc
(According to public source)
Would be equilivant to
bool IsHostiled() {
   for(RosterUnit * unit = *p_D2CLIENT_PlayerUnitList; unit; unit = unit->pNext)
      if(unit->dwPartyFlags & PLAYER_HOSTILED)
         return true;
   return false;
}

_________________
Autumn, Itemdumper & D2ExtraImage

Top
 Profile  
 Post subject: Re: How to find out if I am hostiled?
PostPosted: Sat Sep 03, 2011 9:36 am 
 
User
User

Joined: Sun Jun 22, 2008 7:40 pm
this didn't seem to work. But it seems to list all players in game

Quote:
$RosterUnit = 103923200
PVP Flag: 0
$RosterUnit = 103920896
PVP Flag: 0
$RosterUnit = 103920384
PVP Flag: 0
$RosterUnit = 103921152
PVP Flag: 0
$RosterUnit = 103922688
PVP Flag: 0
$RosterUnit = 103920640
PVP Flag: 0
$RosterUnit = 103922176
PVP Flag: 0
$RosterUnit = 0


Func IsHostiled()
   Local $RosterUnit = _ReadD2Memory($Diablo_MemHandle,$D2CLIENT_OFFSET + 0x11BC14)
   ConsoleWrite("$RosterUnit = "&$RosterUnit&@CRLF)
   While $RosterUnit
      If BitAND(_ReadD2Memory($Diablo_MemHandle,$RosterUnit + 0x30),0x08) Then Return True
     ConsoleWrite("PVP Flag: "&_ReadD2Memory($Diablo_MemHandle,$RosterUnit + 0x30)&@CRLF)
      $RosterUnit = _ReadD2Memory($Diablo_MemHandle,$RosterUnit + 0x80)
     ConsoleWrite("$RosterUnit = "&$RosterUnit&@CRLF)
   WEnd
   Return False
EndFunc


Maybe we should use my pointer read udf instead?

Func _MemoryReadPointer($hProcess, $pBaseAddress, $pBuffer, $iSize, ByRef $iRead, $sPointers = "")
   If $sPointers = "" Then
      Return _WinAPI_ReadProcessMemory($hProcess, $pBaseAddress, $pBuffer, $iSize, $iRead)
   Else
      $PtrSize = 4
      $PtrStruct = DllStructCreate("ptr")
      $aPointers = StringSplit($sPointers,";")
      ConsoleWrite("0x"&Hex($pBaseAddress)&@CRLF)
      _WinAPI_ReadProcessMemory($hProcess, $pBaseAddress, DllStructGetPtr($PtrStruct), DllStructGetSize($PtrStruct), $PtrSize)
      For $i = 1 To $aPointers[0] -1
         ConsoleWrite(DllStructGetData($PtrStruct,1) + dec($aPointers[$i])&@CRLF)
         _WinAPI_ReadProcessMemory($hProcess, DllStructGetData($PtrStruct,1) + dec($aPointers[$i]), DllStructGetPtr($PtrStruct), DllStructGetSize($PtrStruct), $PtrSize)
      Next
      ConsoleWrite(DllStructGetData($PtrStruct,1) + dec($aPointers[$i])&@CRLF)
      Return _WinAPI_ReadProcessMemory($hProcess, DllStructGetData($PtrStruct,1) + dec($aPointers[$i]), $pBuffer, $iSize, $iRead)
   EndIf
EndFunc   ;==>_MemoryReadPointer

_________________
Discuss: Copy-Paste [url=http://www.blizzhackers.cc/viewtopic.php?f=182&t=483257&p=4520230#p4520230]Tabbed Dia
Download: Copy-Paste Tabbed Dia D2 function caller

Top
 Profile  
 Post subject: Re: How to find out if I am hostiled?
PostPosted: Sat Sep 03, 2011 1:45 pm 
 
User
User

Joined: Thu Oct 11, 2007 6:41 pm
Location: Moscow
May be you should learn some programming (not scripting) language in order to write proper hacks.

_________________
----

Top
 Profile  
 Post subject: Re: How to find out if I am hostiled?
PostPosted: Sat Sep 03, 2011 2:36 pm 
 
User
User

Joined: Sun Jun 22, 2008 7:40 pm
You should not speak. You know nothing about what you are talking about. Allow me to demonstrate:
Quote:
May be you should learn some programming (not scripting) language in order to write proper hacks.

It doesn't matter if it's programming or scripting language. What matters is wether that language can call DLLs or not. If you have programming language that doesn't allow you to call functions from DLL files you wouldn't be able to write proper hacks at all.

AutoIt has ability to call dll files which means it has access to whole WINAPI which is what all hacks on this site use. Before you say that you can't write proper hacks in autoit you should see some hacks made by Shaggi. His maphack that ins entirely in autoit and that actually reveals map in d2 is just 1 example.

Finding out if I am hostiled is something that you can read out from memory all you need to do is read memory. There were chicken for 1.11 patch that worked just with memory read so it's possible.

So all I need to know is proper addresses and offsets and data types. You don't give any information at all so you're not helping.

Although I agree that in C++ it would be easier since most of code is already written, but it doesn't automatically mean that AutoIt can't do that and if there weren't D2BS source there wouldn't be difference in difficulty.

_________________
Discuss: Copy-Paste [url=http://www.blizzhackers.cc/viewtopic.php?f=182&t=483257&p=4520230#p4520230]Tabbed Dia
Download: Copy-Paste Tabbed Dia D2 function caller

Top
 Profile  
 Post subject: Re: How to find out if I am hostiled?
PostPosted: Sat Sep 03, 2011 7:45 pm 
 
User
User

Joined: Tue Mar 01, 2005 8:31 pm
Just curious:
Why do you want to do an autoit conversion?

Why don't you use simple/elegant solutions?

Of course you can do things with dozen patches.
But if some company cares and you don't have got experience in antidetection mechanisms they most likely catch a sensitive patch.

I can tell you if you rely on public code you will find some bad strucs/pointers or even worse c and c++ code butchering.(no pun to your username intended)

Depending on the code you rely on you will have got real difficulties to create an autoit conversion.

Firk surely didn't intend to insult you but a lack of c++ knowledge will give you a hard time.

Example:
Public code that handles pointers to classes/strucs wrong.

You assume the code is right and the results are daft since the error was in the c++ code you relied on.

Top
 Profile  
 Post subject: Re: How to find out if I am hostiled?
PostPosted: Sat Sep 03, 2011 9:44 pm 
 
User
User

Joined: Sun Jun 22, 2008 7:40 pm
@Vampirewolve youre're right. What do you mean by Why don't you use simple/elegant solutions?


Quote:
Why do you want to do an autoit conversion?
Just thought it would be good that way.. everything would be in 1 language and easy to handle. if I'd keep IsHostiled function in dll I would have to edit dll's source but now I can have all in 1 file.

If I'd see C++ dll that has function IsHostiled then I could tell if that public code is right.

_________________
Discuss: Copy-Paste [url=http://www.blizzhackers.cc/viewtopic.php?f=182&t=483257&p=4520230#p4520230]Tabbed Dia
Download: Copy-Paste Tabbed Dia D2 function caller

Top
 Profile  
 Post subject: Re: How to find out if I am hostiled?
PostPosted: Sun Sep 04, 2011 11:15 pm 
 
User
User

Joined: Tue Mar 01, 2005 8:31 pm
For example hostile chicken.

Unless you want to create a bot that resists on hostile or something similar that makes TestPVPFlag better than adding bools for example there is no need to use the TestPVPFlag function.


If you want to do an autoit conversion of some public hacks you will have to do a conversion of PacketSend, PacketReceive and Decompression anyway.

With Packethandling you can skip memoryreading and patching in many cases.

All you have to do is to check the last byte of packet 8C.
That check is slightly faster than TestPVPFlag anyway.

FYI on affecting relationship updates you receive 2 8c packets for example
8c Player A You 00 "hostile State"(Forgot the stateid but easy to find out anyway)
and then
8c You Player A 00 "hostile State"


You got the choice between packet handling and memory reading many times but in some cases memory reading is the better solution.
For example quest state reading.
Public hacks do it with a terrible wall of "ifs" on Quest State packet.(No array created etc it rather resembles notes)
A better solution is memory reading since you can also check if you did the cowking quest for example or if finished quests are still open(a bit buggy for some quests but that's blizzards fault)

Quote:
If I'd see C++ dll that has function IsHostiled then I could tell if that public code is right.

There are some but it doesn't mean they are used or strucs/ptrs are updated.

That's one of many ways how to butcher code.

In the end you can reduce most public code to 5 more or less public code from tools/hackitmodules till 2005.

Top
 Profile  
 Post subject: Re: How to find out if I am hostiled?
PostPosted: Sun Sep 04, 2011 11:24 pm 
 
BHDev
BHDev
User avatar

Joined: Mon Jul 13, 2009 5:13 pm
Location: Denmark
Mystery solved...
RosterUnit.dwPartyFlags only show the relation between parties.. which is kinda obvious based on the name lol

reversing testpvpflag shows, that the rosterunit struct contains a loop to a list of playerrelations:

6FAFFD8F     CC             INT3                                     ;  TestPVPFlag(DWORD PlayerID1,DWORD PlayerID2, DWORD BitMask) :: EDX = PLAYER1, ESI = PLAYER 2, ESP+4 = dwBitMask
6FAFFD90  /$ E8 9BD80400    CALL D2Client.6FB4D630                   ;  RosterUnit * Player =  GetRosterUnit(PlayerID1);
6FAFFD95  |. 85C0           TEST EAX,EAX                             ;  if(!Player)
6FAFFD97  |. 74 22          JE SHORT D2Client.6FAFFDBB               ;  return false;
6FAFFD99  |. 8B40 34        MOV EAX,DWORD PTR DS:[EAX+34]            ;  PlayerRelations * rel = Player->pPlayerRelations;
6FAFFD9C  |. 85C0           TEST EAX,EAX
6FAFFD9E  |. 74 1B          JE SHORT D2Client.6FAFFDBB               ;  if(!rel) return false;
6FAFFDA0  |. 3BD6           CMP EDX,ESI                              ;  if(Player1 == Player2) return false;
6FAFFDA2  |. 74 17          JE SHORT D2Client.6FAFFDBB
6FAFFDA4  |. 8B00           MOV EAX,DWORD PTR DS:[EAX]
6FAFFDA6  |. 85C0           TEST EAX,EAX
6FAFFDA8  |. 74 11          JE SHORT D2Client.6FAFFDBB
6FAFFDAA  |. 8D9B 00000000  LEA EBX,DWORD PTR DS:[EBX]               ;  ...
6FAFFDB0  |> 3930           /CMP DWORD PTR DS:[EAX],ESI              ;  if(rel->dwPlayerID == PlayerID2)
6FAFFDB2  |. 74 0C          |JE SHORT D2Client.6FAFFDC0              ;      break;
6FAFFDB4  |. 8B40 08        |MOV EAX,DWORD PTR DS:[EAX+8]            ;  rel = rel->pNext;
6FAFFDB7  |. 85C0           |TEST EAX,EAX                            ;  if(!rel) return false;
6FAFFDB9  |.^75 F5          \JNZ SHORT D2Client.6FAFFDB0             ;  ::loop
6FAFFDBB  |> 33C0           XOR EAX,EAX
6FAFFDBD  |. C2 0400        RETN 4
6FAFFDC0  |> 8B40 04        MOV EAX,DWORD PTR DS:[EAX+4]             ;  DWORD Ret = rel->dwPlayerRelation;
6FAFFDC3  |. 234424 04      AND EAX,DWORD PTR SS:[ESP+4]             ;  return Ret & dwBitMask;
6FAFFDC7  \. C2 0400        RETN 4


Updated struct:
struct PlayerRelation {
   DWORD dwPlayerId;
   DWORD dwFlags;
   PlayerRelation * pNext;
};
struct RosterUnit {
   char szName[16];            //0x00
   DWORD dwUnitId;               //0x10
   DWORD dwPartyLife;            //0x14
   DWORD _1;                  //0x18
   DWORD dwClassId;                //0x1C
   WORD wLevel;               //0x20
   WORD wPartyId;              //0x22
   DWORD dwLevelId;                //0x24
   DWORD Xpos;                  //0x28
   DWORD Ypos;                  //0x2C
   DWORD dwPartyFlags;            //0x30
   PlayerRelation ** pPlayerRelations;   //0x34 - updated, before BYTE * _5;
   DWORD _6[11];               //0x38
   WORD _7;                  //0x64
   char szName2[16];            //0x66
   WORD _8;                  //0x76
   DWORD _9[2];               //0x78
   RosterUnit * pNext;            //0x80
};


Following code illustrates the use:
/*   Loop through rosterunit list   */
for(auto rounit = *p_D2CLIENT_PlayerUnitList; rounit; rounit = rounit->pNext)
{
   /*   Print party flags   */
   Print(0x2,"%s (PlayerID : %d) partyrelation to you: %d",rounit->szName,rounit->dwUnitId,rounit->dwPartyFlags);
   /*   Loop each roster units relation to others   */
   auto rel = *rounit->pPlayerRelations;
   for(int i = 0; rel; ++i) {
      Print(0x3,"   Relation #%d to %d: %d",i,rel->dwPlayerId,rel->dwFlags);
      rel = rel->pNext;
   }
}


Each PlayerRelation struct has generally 8 as dwFlags if the rosterunit is hostiled towards dwPlayerID

E: The code will then end up being
Func IsHostiled()
   Local $RosterUnit = _ReadD2Memory($Diablo_MemHandle,$D2Client_Offset + 0x11BC14), $MyID = _ReadD2Memory($Diablo_MemHandle,$RosterUnit+0x10), $Rel, $Flags,$ID
   While $RosterUnit
      $Rel = _ReadD2Memory($Diablo_MemHandle,_ReadD2Memory($Diablo_MemHandle,$RosterUnit + 0x34))
      While $Rel
         $ID = _ReadD2Memory($Diablo_MemHandle,$Rel)
         $Flags = _ReadD2Memory($Diablo_MemHandle,$Rel + 0x4)
         If $ID = $MyID AND BitAND($Flags,0x08) Then Return True
         $Rel = _ReadD2Memory($Diablo_MemHandle,$Rel + 0x8)
      WEnd
      $RosterUnit = _ReadD2Memory($Diablo_MemHandle,$RosterUnit + 0x80)
   WEnd
   Return False
EndFunc
In autoit, and
bool IsHostiled() {
   for(auto rounit = *p_D2CLIENT_PlayerUnitList, me = rounit; rounit; rounit = rounit->pNext){
      for(auto rel = *rounit->pPlayerRelations; rel; rel = rel->pNext) {
         if((me->dwUnitId == rel->dwPlayerId) && (rel->dwFlags & PVP_HOSTILED_YOU)) {
            return true;
         }
      }
   }
   return false;
}
in C++

_________________
Autumn, Itemdumper & D2ExtraImage

Top
 Profile  
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 16 posts ]  Go to page 1, 2  Next

All times are UTC [ DST ]


Who is online

Users browsing this forum: No registered users and 2 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
Jump to:  
cron