Μετάβαση στο περιεχόμενο
  • ChatBox

    ChatBox

    Chatroom Rules

    • Το GreekHacking.Gr είναι ένα ελληνικό forum και επιτρέπεται μόνο η χρήση της Ελληνική Γλώσσας (ούτε greeklish).
    • Δεν επιτρέπονται οι βρισιές και γενικά η χρήση χυδαίας γλώσσας.
    • Απαγορεύεται αυστηρά το πορνογραφικό, προσβλητικό και βίαιο περιεχόμενο.
    • Μην χρησιμοποιείτε κεφαλαία γράμματα η σύμβολα.
Clipper

Reversing Windows Native Api Functions

Recommended Posts

Clipper

Reversing Windows Native Api Functions

Θα παίξουμε ένα μικρό παιχνίδι. Θα δούμε πως ψάχνουμε μέσα στο native API των windows για functions οι οποίες χρησιμοποιούνται από τις εσωτερικές διεργασίες του λειτουργικού συστήματος και δεν συνίσταται (από την μαμά) να καλούνται από τα προγράμματα μας. Όχι μόνο θα τις ανακαλύψουμε, αλλά θα τις καλέσουμε και θα ελέγξουμε τα αποτελέσματα τους. Όπως είπαμε, θα χρησιμοποποιήσουμε συναρτήσεις που βρίσκονται μέσα στο native API των Windows. Το native API είναι ένα επίπεδο πιο κάτω από το γνωστό Base API που η μαμά συστήνει (και όχι άδικα) να χρησιμοποιούμε για λόγους συμβατότητας και για να διασφαλίσουμε οτι τα προγράμματα μας θα τρέχουν σε όλες τις εκδόσεις και Service Packs των windows.

Το Native API είναι το τελευταίο layer σε user mode το οποίο κάνει άμεσες κλήσεις στο kernel mode των windows και συγκεκριμένα μέσα στο NTOSKRNL.EXE που είναι ο pure windows kernel.
Πρέπει να πω εδώ οτι (κατά την άποψη μου) η διαδικασία ελέγχου των συναρτήσεων native APIs δεν είναι μια εύκολη διαδικασία. Θα πω οτι είναι δυσκολότερη από αυτή του linux αφου ο κώδικας των windows είναι κλειστός και δεν παρέχονται sources. Μόνο κώδικας assembly και αυτός (στις περισσότερες φορές είναι έξω από από τον kernel). Αν θέλουμε να debug-άρουμε τον ίδιο τον kernel χρειάζονται πιο ειδικά προγράμματα που δεν θα τα δείξουμε σε αυτόν τον ποστ. Εδώ θα δούμε πως ακόμα και από user-mode μπορούμε να δούμε διαδικασίες και συναρτήσεις (ακόμα και undocumented) μέσα στο Native API Interface ή αλλιώς μέσα στο ntdll.dll.

Θα μου πείτε: Γιατί να το κάνουμε όλο αυτό?
Χμ.... οι λόγοι είναι πολλοί:
1. Είναι ένα πολύ καλό πρώτο μάθημα για τους επίδοξους reversers του λειτουργικού. Σε αρχικό στάδιο βέβαια!
2. Θα μάθουμε πως να ελέγχουμε τα βασικά των εσωτερικών διεργασιών του συστήματος μας.
3. θα δούμε από πρώτο χέρι να τρέχει κώδικας των windows που ανήκει στο (ολίγον cryptic) native API επίπεδο.

Γνώσεις που απαιτούνται για να διαβάσετε το ποστ?
Oχι πολλές.
1. Στοιχειώδεις γνώσεις τεχνικών reversing και δη, χρήσης του olly debugger.
2. Μικρή (ναι μικρή) όσο κι αν φανεί παράδοξο, γνώση assembly language. θα συναντήσουμε (μοιραία) πολύ κώδικα assembly, αλλά δεν θα αναλώσω το ποστ (αυτό τουλάχιστον) σε στείρα assembly listings με επεξηγήσεις, Θα δούμε μάλιστα πως αυτό που θέλουμε να κάνουμε δεν απαιτεί κάποιον assembly programmer.

Πρώτα απ' όλα να πώ οτι η ntdll.dll που υλοποιεί το native api είναι μέσα στο c:\windows\system32. Καλό είναι να την κάνουμε ένα copy/paste σε ένα άλλο directory και να την δουλέψουμε εκεί. Το παράδειγμα μας θα γίνει σε box με windows 7 ultimate 64bit.

Αυτό που θα κάνω πρώτα είναι να εξάγω από αυτήν όλες τις functions που χρησιμοποιεί και να επιλέξω μια (στην τύχη...?) για να ελέγξω. Για να εξάγω τις exported functions από μια DLL θα χρησιμοποιήσω το πρόγραμμα dumpbin που προσφέρται από την μαμά μαζί με το Visual Studio.

Δίνω

D:\work2>dumpbin ntdll.dll /exports > exports.txt


και δημιουργώ το exports.txt που περιέχει τις export functions της ntdll.dll

Ανοίγοντας το με τον ultraedit θα δω το παρακάτω:

kernel01_dumpbin.thumb.jpg.a91c532ab4499099833295684863e94e.jpg

Ψάχνοντας λίγο το αρχείο, "πέφτω" επάνω στο παρακάτω:

    ordinal hint RVA    name
    933  398  0003859A RtlGetVersion


Βλέπω την συνάρτηση RtlGetVersion η οποία βρίσκεται στην RVA (Relative Virtual Address) 3859Α. Το RVA είναι η σχετική διεύθυνση που θα φορτωθεί η function RtlGetVersion όταν το αρχείο που την περιέχει φορτωθεί στην μνήμη και αποκτήσει Base Address. Αν δηλαδή το RVA μιας συνάρτησης είναι το 15 και το εκτελέσιμο φορτωθεί στην θέση 100, τότε η συνάρτηση μου θα βρίσκεται στην θέση (διεύθυνση) 115.

Θέλω τώρα να δω τι ακριβώς κάνει αυτή η συνάρτηση. Για να το κάνω αυτό κάνω disassemble όλη την ntdll.dll:

D:\work2>dumpbin /disasm ntdll.dll > ntdlldisasm.txt

Το αρχείο ntdlldisasm.txt που δημιουργείται περιέχει όλο τον assembly κώδικα της dll. Είναι ένα ASCII αρχείο 17Mb! Χμ... πως θα βρώ τώρα σε ποιό σημείο καλείται η RtlGetVersion;
Χμ... καθόλου δύκολο.
Αρκεί να εφαρμόσω τον τύπο:

IMAGE_BASE_ADDRESS + Function_RVA = Function Address


Το RVA το έχουμε. Είναι 0003859A.
Το IMAGE_BASE_ADDRESS της DLL όμως ποιό είναι;
Για να το βρω δίνω απλά:

D:\work2>dumpbin /headers ntdll.dll | find "image base"
        7DE70000 image base (7DE70000 to 7DFEFFFF)

Οπότε 7DE70000 + 0003859A = 7DEA859A.
Άρα στην διεύθυνση 7DEA859A βρίσκεται η συνάρτηση RtlGetVersion.

kernel01_ntdlltext.thumb.jpg.6af06457087137d11b2ed28a623df75a.jpg

Ολόκληρος ο κώδικας της συνάρτησης RtlGetVersion είναι ο παρακάτω:
 

  7DEA859A: 8B FF           mov         edi,edi
  7DEA859C: 55              push        ebp
  7DEA859D: 8B EC           mov         ebp,esp
  7DEA859F: 51              push        ecx
  7DEA85A0: 64 A1 18 00 00 00  mov      eax,dword ptr fs:[00000018h]
  7DEA85A6: 53              push        ebx
  7DEA85A7: 56              push        esi
  7DEA85A8: 8B 75 08        mov         esi,dword ptr [ebp+8]
  7DEA85AB: 57              push        edi
  7DEA85AC: 8B 78 30        mov         edi,dword ptr [eax+30h]
  7DEA85AF: 8B 87 A4 00 00 00  mov      eax,dword ptr [edi+000000A4h]
  7DEA85B5: 89 46 04        mov         dword ptr [esi+4],eax
  7DEA85B8: 8B 87 A8 00 00 00  mov      eax,dword ptr [edi+000000A8h]
  7DEA85BE: 89 46 08        mov         dword ptr [esi+8],eax
  7DEA85C1: 0F B7 87 AC 00 00  movzx    eax,word ptr [edi+000000ACh]
            00
  7DEA85C8: 89 46 0C        mov         dword ptr [esi+0Ch],eax
  7DEA85CB: 8B 87 B0 00 00 00  mov      eax,dword ptr [edi+000000B0h]
  7DEA85D1: 89 46 10        mov         dword ptr [esi+10h],eax
  7DEA85D4: 8B 87 F4 01 00 00  mov      eax,dword ptr [edi+000001F4h]
  7DEA85DA: 85 C0           test        eax,eax
  7DEA85DC: 74 0A           je          7DEA85E8
  7DEA85DE: 66 83 38 00     cmp         word ptr [eax],0
  7DEA85E2: 0F 85 BB 78 05 00  jne      7DEFFEA3
  7DEA85E8: 33 C0           xor         eax,eax
  7DEA85EA: 66 89 46 14     mov         word ptr [esi+14h],ax
  7DEA85EE: 81 3E 1C 01 00 00  cmp      dword ptr [esi],11Ch
  7DEA85F4: 75 5E           jne         7DEA8654
  7DEA85F6: 66 0F B6 87 AF 00  movzx    ax,byte ptr [edi+000000AFh]
            00 00
  7DEA85FE: 66 89 86 14 01 00  mov      word ptr [esi+00000114h],ax
            00
  7DEA8605: 66 8B 87 AE 00 00  mov      ax,word ptr [edi+000000AEh]
            00
  7DEA860C: B9 FF 00 00 00  mov         ecx,0FFh
  7DEA8611: 66 23 C1        and         ax,cx
  7DEA8614: 66 89 86 16 01 00  mov      word ptr [esi+00000116h],ax
            00
  7DEA861B: 66 A1 D0 02 FE 7F  mov      ax,word ptr ds:[7FFE02D0h]
  7DEA8621: 66 89 86 18 01 00  mov      word ptr [esi+00000118h],ax
            00
  7DEA8628: 8D 45 FC        lea         eax,[ebp-4]
  7DEA862B: 8D BE 1A 01 00 00  lea      edi,[esi+0000011Ah]
  7DEA8631: 50              push        eax
  7DEA8632: C6 07 00        mov         byte ptr [edi],0
  7DEA8635: E8 28 00 00 00  call        7DEA8662
  7DEA863A: 84 C0           test        al,al
  7DEA863C: 74 16           je          7DEA8654
  7DEA863E: 8B 45 FC        mov         eax,dword ptr [ebp-4]
  7DEA8641: 88 07           mov         byte ptr [edi],al
  7DEA8643: 83 F8 01        cmp         eax,1
  7DEA8646: 75 0C           jne         7DEA8654
  7DEA8648: B8 EF FF 00 00  mov         eax,0FFEFh
  7DEA864D: 66 21 86 18 01 00  and      word ptr [esi+00000118h],ax
            00
  7DEA8654: 5F              pop         edi
  7DEA8655: 5E              pop         esi
  7DEA8656: 33 C0           xor         eax,eax
  7DEA8658: 5B              pop         ebx
  7DEA8659: C9              leave
  7DEA865A: C2 04 00        ret         4

Ο παραπάνω κώδικας παρουσιάζεται μόνο για την γνωσιολογική επάρκεια μιας και όπως είπα δεν θα μπω στην διαδικασία να τον αναλύσω γραμμή προς γραμμή - dead listing analysis (στο post αυτό τουλάχιστον). Θα κάνω κάτι πιο... πρακτικό.  θα τον εκτελέσω μέσα από τον olly και θα παρακολουθήσω τα αποτελέσματα. Πως όμως θα καλέσω την συγκεκριμένη function μέσα σε μια DLL; Με τον olly δεν είναι και τόσο δύσκολο.

Πριν όμως ξεκινήσω τον έλεγχο ας δω πρώτα αν η RtlGetVersion είναι documented από την Microsoft. Πράγματι εδώ βρίσκεται περιγραφή της συγκεκριμένης συνάρτησης:

The RtlGetVersion routine returns version information about the currently running operating system.
Syntax
NTSTATUS RtlGetVersion(
  __out  PRTL_OSVERSIONINFOW lpVersionInformation
);


Parameters
lpVersionInformation [out]

    Pointer to either a RTL_OSVERSIONINFOW structure or a RTL_OSVERSIONINFOEXW structure that contains the version
information about the currently running operating system. A caller specifies which input structure is used by setting
the dwOSVersionInfoSize member of the structure to the size in bytes of the structure that is used.

Return Value
RtlGetVersion returns STATUS_SUCCESS.

Remarks
RtlGetVersion is the kernel-mode equivalent of the user-mode GetVersionEx function in the Windows SDK. See the example
in the Windows SDK that shows how to get the system version.

Απ' ότι βλέπω η συνάρτηση αυτή δεν δέχεται input parameter και όταν κληθεί επιστρέφει τα αποτελέσματα του στην structure RTL_OSVERSIONINFOW. H structure αυτή ορίζεται εδώ και περιέχει τα εξής βασικά στοιχεία του λειτουργικού:
 

dwOSVersionInfoSize
    Specifies the size in bytes of an RTL_OSVERSIONINFOW structure. This member must be set before the structure is used with RtlGetVersion.

dwMajorVersion
    Identifies the major version number of the operating system. For example, for Windows 2000, the major version number is five.
dwMinorVersion
    Identifies the minor version number of the operating system. For example, for Windows 2000 the minor version number is zero.

dwBuildNumber
    Identifies the build number of the operating system.

dwPlatformId
    Identifies the operating system platform. For Microsoft Win32 on NT-based operating systems, RtlGetVersion returns the value VER_PLATFORM_WIN32_NT.

szCSDVersion
    Contains a null-terminated string, such as "Service Pack 3", which indicates the latest Service Pack installed on the system. If no Service Pack has been installed, the string is empty.

Ωραία μέχρι εδώ. Έμαθα τι περιμένω να πάρω σαν αποτέλεσμα. Ας επανέλθουμε στο πως θα εκτελέσω την function αυτή με τον olly. Επειδή πρόκειται για μια DLL και όχι για κάποιο εκτελέσιμο πρόγραμμα, θα κάνω το εξής: Αφού φορτώσω την DLL θα πάω στην διεύθυνση που καλείται η προς εξέταση function και θα το ορίσω ως νέο orign point, όπως φαίνεται στην επόμενη εικόνα:

kernel01_ollyntdllneworigin.jpg.cab45a77ef2c739aa2320cc0728334f2.jpg

Παρατηρήστε οτι η διεύθυνση της RtlGetVersion δεν είναι η ίδια με αυτή που έδωσε το output του hexdump. Αυτό δεν είναι περίεργο και εξηγήται από το γεγονός πως η Base Image Address είναι διαφορετική.
Αφού λοιπόν καθορίσω το νέο σημείο εκκίνησης βάζω και ένα Break Point στην διεύθυνση 776D859A και είμαι έτοιμος να πατήσω RUN και μετά να πάω step by step (πατώντας F10) παρακολουθώντας τη εκτέλεση της συνάρτησης γραμμή-γραμμή και ελέγχοντας ταυτόχρονα τις τιμές των καταχωρητών. Επίσης, για να ελέγξω τα αποτελέσματα μου καλύτερα κάνω και το εξής κόλπο: Από command line δίνω την εντολή "winver" για να δω (με βάση το documentation της μαμάς) τι τιμές θα πάρω και πού. Το winver μου δίνει:

kernel01_winver.jpg.bf45f8bd6c1b9212254909dbc2fd2195.jpg

Παρατηρήστε το "Version 6.1 (Build 7600)". Πρέπει, κι εγώ, εκτελώντας την function να πάρω τα... ανάλογα ;)
Παρακάτω έχω μια ανάλυση του κώδικα που έδωσε ο olly μαζί με σχόλια (δικά μου) για τις τιμές των καταχωρητών που πήρα. Νομίζω οτι είναι ιδαίτερα διαφωτιστικά και δεν χρειάζονται πολλά-πολλά σχόλια:


 

776D859A > 8BFF             MOV EDI,EDI                     |
776D859C   55               PUSH EBP                        | Standard function prologue
776D859D   8BEC             MOV EBP,ESP                     |
776D859F   51               PUSH ECX
776D85A0   64:A1 18000000   MOV EAX,DWORD PTR FS:[18]       ====>> return the TEB (Thread Entry Block) address
776D85A6   53               PUSH EBX
776D85A7   56               PUSH ESI
776D85A8   8B75 08          MOV ESI,DWORD PTR SS:[EBP+8]    ====>> return the PEB (Process Entry Block) address
776D85AB   57               PUSH EDI
776D85AC   8B78 30          MOV EDI,DWORD PTR DS:[EAX+30]
776D85AF   8B87 A4000000    MOV EAX,DWORD PTR DS:[EDI+A4]   ===>> eax=6                 (MajorVersion)
776D85B5   8946 04          MOV DWORD PTR DS:[ESI+4],EAX
776D85B8   8B87 A8000000    MOV EAX,DWORD PTR DS:[EDI+A8]   ===>> eax=1                 (MinorVersion)
776D85BE   8946 08          MOV DWORD PTR DS:[ESI+8],EAX
776D85C1   0FB787 AC000000  MOVZX EAX,WORD PTR DS:[EDI+AC]  ===>> eax=00001DB0 i.e. 7600  (BuildNumber) MOV with zero eXtended
776D85C8   8946 0C          MOV DWORD PTR DS:[ESI+C],EAX
776D85CB   8B87 B0000000    MOV EAX,DWORD PTR DS:[EDI+B0]   ===>> eax=2                 (platformID)
776D85D1   8946 10          MOV DWORD PTR DS:[ESI+10],EAX
776D85D4   8B87 F4010000    MOV EAX,DWORD PTR DS:[EDI+1F4]
776D85DA   85C0             TEST EAX,EAX
776D85DC   74 0A            JE SHORT ntdll.776D85E8
776D85DE   66:8338 00       CMP WORD PTR DS:[EAX],0
776D85E2   0F85 BB780500    JNZ ntdll.7772FEA3
776D85E8   33C0             XOR EAX,EAX
776D85EA   66:8946 14       MOV WORD PTR DS:[ESI+14],AX
776D85EE   813E 1C010000    CMP DWORD PTR DS:[ESI],11C
776D85F4   75 5E            JNZ SHORT ntdll.776D8654
776D85F6   66:0FB687 AF0000>MOVZX AX,BYTE PTR DS:[EDI+AF]
776D85FE   66:8986 14010000 MOV WORD PTR DS:[ESI+114],AX
776D8605   66:8B87 AE000000 MOV AX,WORD PTR DS:[EDI+AE]
776D860C   B9 FF000000      MOV ECX,0FF
776D8611   66:23C1          AND AX,CX
776D8614   66:8986 16010000 MOV WORD PTR DS:[ESI+116],AX
776D861B   66:A1 D002FE7F   MOV AX,WORD PTR DS:[7FFE02D0]
776D8621   66:8986 18010000 MOV WORD PTR DS:[ESI+118],AX
776D8628   8D45 FC          LEA EAX,DWORD PTR SS:[EBP-4]
776D862B   8DBE 1A010000    LEA EDI,DWORD PTR DS:[ESI+11A]
776D8631   50               PUSH EAX
776D8632   C607 00          MOV BYTE PTR DS:[EDI],0
776D8635   E8 28000000      CALL ntdll.RtlGetNtProductType
776D863A   84C0             TEST AL,AL
776D863C   74 16            JE SHORT ntdll.776D8654
776D863E   8B45 FC          MOV EAX,DWORD PTR SS:[EBP-4]
776D8641   8807             MOV BYTE PTR DS:[EDI],AL
776D8643   83F8 01          CMP EAX,1
776D8646   75 0C            JNZ SHORT ntdll.776D8654
776D8648   B8 EFFF0000      MOV EAX,0FFEF
776D864D   66:2186 18010000 AND WORD PTR DS:[ESI+118],AX
776D8654   5F               POP EDI
776D8655   5E               POP ESI
776D8656   33C0             XOR EAX,EAX
776D8658   5B               POP EBX
776D8659   C9               LEAVE
776D865A   C2 0400          RETN 4

Πολύ καλά. Πήρα (απ' ότι βλέπετε) τα ανάλογα! Έχω να κάνω ακόμα μια μικρή παρατήρηση. Όχι τίποτε άλλο αλλά για να σας προετοιμάσω και για τα επόμενα ανάλογα tuts. Προσέξτε την διεύθυνση 776D8635. Εκεί καλείται μια function, η RtlGetNtProductType. H function αυτή είναι μάλλον εσωτερική και... undocumented. Πιο πολλά γι' αυτές σε κάποιο επόμενο post μαζί με τρόπους για το πως κάνουμε debug τον kernel.

Μέχρι τώρα κατάφερα τα εξής:
1. Είδα ποιες functions υπάρχουν μέσα στην ntdll.dll
2. Απομόνωσα και διάβασα μια από αυτές.
3. Την εκτέλεσα και είδα τα αποτελέσματα της γραμμή-γραμμή.

Να πω πάλι οτι αυτή η function βρίσκεται μέσα στο native API. Εκεί γίνονται κλήσεις κατ' εθυείαν στον Kernel των windows. Πρόκειται για αρκετά "επικίνδυνα νερά", που αν εκεί κάτι δεν πάει καλά μπορεί να κρεμάσει όλο το σύστημα (στην καλύτερη!).

Παρατήρηση: Είδαμε μέχρι τώρα οτι οι συναρτήσεις που κοιτάμε αρχίζουν από Rtl. Τυχαίο? Δεν νομίζω! Οι μαμά έχει επιλέξει ένα συγκεκριμένο name convention για τις εσωτερικές συναρτήσεις της. Το prefix Rtl σημαίνει Run Time Library. Επίσης, μέσα στην ntdll θα δούμε και το περίφημο Zw prefix. Συναρτήσεις με αυτό το prefix κάνουν κλήσεις στον πυρήνα. Γενικά, να ξέρετε, οτι το name convention που ακολουθείται είναι:
<Prefix><Operation><Object>

Καλά μέχρι εδώ αλλά μου λείπει όμως κάτι: Ένα πρόηγραμμα σε C που να καλεί κατευθείαν αυτή την function από το native api και που ίσως ( λέω ίσως, ποιός ξέρει; ) να χρησιμοποιηθεί και σαν εφαλτήριο για μελλοντικούς ελέγχους άλλων πιο... άγνωστων συναρτήσεων.

Αν ψάξετε στο net η αλήθεια είναι οτι δεν θα βρείτε και πολλά πράγματα για το πως καλείτε αυτή την συνάρτηση μέσα από το native api. Όποτε καλό είναι να υπάρχει ο κώδικας σε C εδώ για να μπορέσει να τον βρει και κανένας άλλος. 😉
Το προγραμματάκι (σε visual C++ / Visual Studio 2010) είναι το παρακάτω:
 

// Kernel01.cpp : Call the RtlGetVersion from native API
//
#include "stdafx.h"
#include <Windows.h>

typedef void (WINAPI *pwinapi)(PRTL_OSVERSIONINFOW);    // [url="http://www.osronline.com/ddkx/kmarch/k109_452q.htm"]http://www.osronline...h/k109_452q.htm[/url]

int _tmain(int argc, _TCHAR* argv[])
{
    RTL_OSVERSIONINFOW info;
    pwinapi p_pwinapi;

    ZeroMemory(&info, sizeof(RTL_OSVERSIONINFOW));

    p_pwinapi = (pwinapi) GetProcAddress(GetModuleHandle(TEXT("ntdll.dll")), "RtlGetVersion");
    p_pwinapi(&info);

    return(0);
}

 

Τρέχοντας το και βάζοντας στην return(0) ένα breakpoint, βλέπουμε την... αλήθεια. ;)

kernel01_picinfo.thumb.jpg.7cafca406045720547be32645cdcf2d1.jpg

Δεν χρειάζεται να ξοδέψω άλλα bytes για να σχολιάσω. Δοκιμάστε το και μόνοι σας... :)
Κάντε debug ή ακόμα και disassemble το πρόγραμμα αυτό και ξανακάντε την διαδικασία που μόλις περιγράφτηκε.
Σας υπόσχομαι οτι δεν θα χάσετε!

 

Happy Reversing...

Κατά τον δαίμονα εαυτού...

Μοιράσου αυτή την δημοσίευση


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Απάντηση στο θέμα...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



ChatBox

ChatBox

Chatroom Rules

  • Το GreekHacking.Gr είναι ένα ελληνικό forum και επιτρέπεται μόνο η χρήση της Ελληνική Γλώσσας (ούτε greeklish).
  • Δεν επιτρέπονται οι βρισιές και γενικά η χρήση χυδαίας γλώσσας.
  • Απαγορεύεται αυστηρά το πορνογραφικό, προσβλητικό και βίαιο περιεχόμενο.
  • Μην χρησιμοποιείτε κεφαλαία γράμματα η σύμβολα.
×
×
  • Create New...