A simple function suitable for shareware applications to check if a registered username is "legal". For example, if a username contains the string "cracked by", or ends with " krew", or matches the name of a known cracker group then it returns 0 (illegal name). It returns 1 if the name is legal.

Just a couple notes ...
- Only the 32bit CRC of cracking groups names are stored, not the name itself. This makes it very hard for the cracker to work out which groups are on the blacklist due to the one-way nature of hashes.

- It 'normalizes' the text before checking it so that it doesn't matter if for example "kr3w", "KrEw", or "krêw" is used because they all become "KREW" before any checks on it are made.

- It also checks against common generic names that shouldn't ever be used for keynames, like "Administrator", "Admin", "Registered User" etc

- The words "crew", "krew" and "team" are ignored when making comparisons, so for example "Deviance", "Team Deviance" and "Deviance Crew" are all seen simply as "Deviance" when checks are made.

- I often like to break up sensitive strings into individual characters. For example, instead of this:
> strKey = "key"
I'll use this:
> strKey = "k"&"e"&"y"
The end result is that the string is dynamically built at runtime by code rather than being referenced as a standard string, so you won't even find the string "key" in the executable like you normally would. This is obviously obscurity and provides no real security, but such tricks can often SLOW the progress of crackers down, and if you can slow down and frustrate a cracker enough he/she may move on.

Code:
#COMPILE EXE

FUNCTION calcCRC32(BYVAL dwOffset AS DWORD, BYVAL dwLen AS DWORD) AS DWORD
#REGISTER NONE
 ! mov esi, dwOffset  ;esi = ptr to buffer
 ! mov edi, dwLen     ;edi = length of buffer
 ! mov ecx, -1        ;ecx = -1
 ! mov edx, ecx       ;edx = -1
 nextbyte:           ';next byte from butter
 ! xor eax, eax       ;eax = 0
 ! xor ebx, ebx       ;ebx = 0
 ! lodsb              ;get next byte
 ! xor al, cl         ;xor al with cl
 ! mov cl, ch         ;cl = ch
 ! mov ch, dl         ;ch = dl
 ! mov dl, dh         ;dl = dh
 ! mov dh, 8          ;dh = 8
 nextbit:            ';next bit in the byte
 ! shr bx, 1          ;shift bits in bx right by 1
 ! rcr ax, 1          ;(rotate through carry) bits in ax by 1
 ! jnc nocarry        ;jump to nocarry if carry flag not set
 ! xor ax, &h08320    ;xor ax with 33568
 ! xor bx, &h0EDB8    ;xor bx with 60856
 nocarry:            ';if carry flag wasn't set
 ! dec dh             ;dh = dh - 1
 ! jnz nextbit        ;if dh isnt zero, jump to nextbit
 ! xor ecx, eax       ;xor ecx with eax
 ! xor edx, ebx       ;xor edx with ebx
 ! dec edi            ;finished with that byte, decrement counter
 ! jnz nextbyte       ;if edi counter isnt at 0, jump to nextbyte
 ! not edx            ;invert edx bits - 1s complement
 ! not ecx            ;invert ecx bits - 1s complement
 ! mov eax, edx       ;mov edx into eax
 ! rol eax, 16        ;rotate bits in eax left by 16 places
 ! mov ax, cx         ;mov cx into ax
 ! mov FUNCTION, eax  ;crc32 result is in eax
END FUNCTION


SUB UCaseEx(BYVAL bPtr AS BYTE PTR, BYVAL dwLen AS DWORD)
LOCAL i AS LONG
FOR i = 1 TO dwLen
    SELECT CASE @bPtr
        CASE 97 TO 122, 224 TO 254: @bPtr = @bPtr - 32
    END SELECT
    INCR bPtr
NEXT i
END SUB


FUNCTION IsNameLegal (sName AS STRING) AS DWORD
LOCAL bLen AS BYTE, dwCRC AS DWORD, bPtr AS BYTE PTR, dwPtr AS DWORD PTR, sTestName AS STRING, i AS DWORD, sTmp AS STRING
sTestName = sName
FOR i = 1 TO 10: REPLACE "  " WITH " " IN sTestName: NEXT
REPLACE "0" WITH "O" IN sTestName
REPLACE "1" WITH "I" IN sTestName
REPLACE "3" WITH "E" IN sTestName
bPtr = STRPTR(sTestName)
FOR i = 1 TO LEN(sTestName)
   SELECT CASE @bPtr
     CASE 192 TO 197, 224 TO 229: @bPtr = 65 '("A")
     CASE 199, 231: @bPtr = 67 '("C")
     CASE 200 TO 203, 232 TO 235: @bPtr = 69 '("E")
     CASE 204 TO 207, 236 TO 239: @bPtr = 73 '("I")
     CASE 208, 240: @bPtr = 68 '("D")
     CASE 209, 241: @bPtr = 78 '("N")
     CASE 210 TO 214, 216, 242 TO 246, 248: @bPtr = 79 '("O")
     CASE 217 TO 220, 249 TO 252: @bPtr = 85 '("U")
   END SELECT
   INCR bPtr
NEXT i
sTmp = sTestName
sTestName = ""
bPtr = STRPTR(sTmp)
FOR i = 1 TO LEN(sTmp)
    SELECT CASE @bPtr
        CASE 32, 48 TO 57, 65 TO 90, 97 TO 122: sTestName = sTestName & CHR$(@bPtr)
    END SELECT
    INCR bPtr
NEXT i

UCaseEx(BYVAL STRPTR(sTestName), BYVAL LEN(sTestName))
sTestName = TRIM$(sTestName)

IF INSTR(1, sTestName, "C"& LEFT$("X",0)&"R"& LEFT$("Z",0)& "A"&"C"&"K"&"E"&"D") > 0 OR _
   INSTR(1, sTestName, "C"&"R"&"A"&"C"&"K"&"E"&"R"&"S") > 0 OR _
   INSTR(1, sTestName, "C"&"R"&"A"&"C"&"K"&"I"&"N"&"G") > 0 OR _
   INSTR(1, sTestName, "W"&"A"&"R"&"E"&"Z") > 0 OR _
   INSTR(1, sTestName, " "&"K"&"R"&"E"&"W") > 0 OR _
   INSTR(1, sTestName, "H"&"A"&"X"&"O"&"R"&"E"&"D") > 0 OR _
   INSTR(1, sTestName, "B"&"Y"&" "&"T"&"E"&"A"&"M") > 0 THEN EXIT FUNCTION

SELECT CASE LEFT$(sTestName, 5)
    CASE "T"&"E"&"A"&"M ", "C"&"R"&"E"&"W ": sTestName = RIGHT$(sTestName, LEN(sTestName) - 5)
END SELECT
SELECT CASE RIGHT$(sTestName, 5)
    CASE " "&"T"&"E"&"A"&"M", " "&"C"&"R"&"E"&"W", " "&"K"&"R"&"E"&"W": sTestName = LEFT$(sTestName, LEN(sTestName) - 5)
END SELECT
IF LEFT$(sTestName,12) = "L"&"I"&"C"&"E"&"N"&"S"&"E"&"D"&" "&"T"&"O"&" " THEN sTestName = RIGHT$(sTestName, LEN(sTestName) - 12)
IF LEFT$(sTestName,14) = "R"&"E"&"G"&"I"&"S"&"T"&"E"&"R"&"E"&"D"&" "&"T"&"O"&" " THEN sTestName = RIGHT$(sTestName, LEN(sTestName) - 14)

bLen = LEN(sTestName)
dwCRC = calcCRC32(BYVAL STRPTR(sTestName), BYVAL bLen)
bPtr = CODEPTR(IllegalNames)
dwPtr = bPtr + 1
DO
    IF @bPtr = 0 THEN EXIT DO
    IF @bPtr = bLen THEN
        IF @dwPtr = dwCRC THEN EXIT FUNCTION
    END IF
    dwPtr = dwPtr + 5
    bPtr = bPtr + 5
LOOP

FUNCTION = 1
EXIT FUNCTION
IllegalNames:
! db &h07        ;Length of name. (Both the length and CRC are used to help prevent any collisions)
! dd &hF70C7805  ;GOBBLES
! db &hE
! dd &h1C28628A  ;THE BITTER END
! db &hA
! dd &hD96C3A4C  ;BITTER END
! db &h04
! dd &h5301C46F  ;ICON
! db &h06
! dd &h41EC29E1  ;WOOWOO
! db &h04
! dd &h648F5A54  ;TESO
! db &h05
! dd &hA04C746E  ;LOPHT
! db &h0E
! dd &hC9830ACD  ;LEGION OF DOOM
! db &h08
! dd &h51B4A68C  ;VIRILITY
! db &h07
! dd &hA15716B9  ;PHROZEN
! db &h08
! dd &h2DCC803D  ;REG USER
! db &h0F
! dd &h523E23EF  ;REGISTERED USER
! db &h0D
! dd &hA630A548  ;LICENSED USER
! db &h09
! dd &hDC4651B5  ;THE OWNER
! db &h05
! dd &h7F5ACFC6  ;ADMIN
! db &h0D
! dd &h7E9304B4  ;ADMINISTRATOR
! db &h03
! dd &hE895935F  ;SSG
! db &h04
! dd &h5D1868FB  ;CORE
! db &h05
! dd &h64F5994C  ;AGAIN
! db &h03
! dd &hD1DDCD2A  ;UCF
! db &h07
! dd &h02983959  ;UCF2OOO
! db &h15
! dd &h308DC423  ;UNITED CRACKING FORCE
! db &h04
! dd &hFB5B2174  ;TSRH
! db &h03
! dd &h399BBA05  ;TMG
! db &h06
! dd &hF7019DBC  ;XFORCE
! db &h03
! dd &h405FD6E0  ;ICU
! db &h03
! dd &h07962C0A  ;ZWT
! db &hE
! dd &h09C2F57E  ;SEEK N DESTROY
! db &h03
! dd &h8EF0AEF9  ;SND
! db &h03
! dd &hB2CA2446  ;FFF
! db &h04
! dd &hA559FCE6  ;FHCF
! db &h07
! dd &hAEA0E24C  ;REVENGE
! db &h04
! dd &h3351578A  ;ACME
! db &h08
! dd &h5AA38F83  ;DIGERATI
! db &h03
! dd &h08359331  ;DVT
! db &h07
! dd &h8210CAA5  ;ECLIPSE
! db &h03
! dd &h62FD40DE  ;ROR
! db &h04
! dd &h485E48F8  ;HAZE
! db &h08
! dd &h1175DCF4  ;HERITAGE
! db &h03
! dd &hE939E204  ;WKT
! db &h03
! dd &h20F64469  ;LZO
! db &h07
! dd &hD967D848  ;TEAMLIB
! db &h03
! dd &h500DC7E6  ;TBE
! db &h04
! dd &h7A6BE5A3  ;FOSI
! db &h05
! dd &h228A75D5  ;FOSSI
! db &h03
! dd &h80000CF5  ;TWK
! db &h04
! dd &h28F8BD25  ;MP2K
! db &h03
! dd &h9608A818  ;TNT
! db &h07
! dd &hD7141E3C  ;EMBRACE
! db &h03
! dd &h97F06DA4  ;ARN
! db &h07
! dd &h32372338  ;EQUINOX
! db &h04
! dd &h90D9AA5E  ;DAMN
! db &h03
! dd &h0C747D90  ;EAT
! db &h03
! dd &h0E32C3C9  ;FAT
! db &h03
! dd &hADFD6FC1  ;CIA
! db &h03
! dd &h8E822A4D  ;DOD
! db &h02
! dd &h4003B888  ;AG
! db &h03
! dd &h80000CF5  ;TWK
! db &h04
! dd &hA82B15F2  ;RISE
! db &h0A
! dd &h80A28FA4  ;TERMINATOR
! db &h02
! dd &h02B896A8  ;ME
! db &h05
! dd &hE44B76BE  ;ORION
! db &h03
! dd &h8A247CC1  ;EVC
! db &h04
! dd &h38F86873  ;ETHO
! db &h07
! dd &h7E04E3E3  ;PARADOX
! db &h07
! dd &hA2FF0D78  ;SEMTHEX
! db &h03
! dd &h38C69B02  ;CZW
! db &h04
! dd &h8FB55D44  ;F4CG
! db &h04
! dd &h485E48F8  ;HAZE
! db &h06
! dd &h2F1AE200  ;SCOTCH
! db &h06
! dd &h69E59FB5  ;HYBRID
! db &h03
! dd &hBB9CBD84  ;FLT
! db &h0C
! dd &h58422AA7  ;RESURRECTION
! db &h03
! dd &h16440BAD  ;DSI
! db &h03
! dd &h9056566A  ;FAS
! db &h09
! dd &h640F5C5C  ;FAIRLIGHT
! db &h06
! dd &hB9787DDD  ;FALLEN
! db &h03
! dd &h9A2FC34D  ;HOT
! db &h03
! dd &h5ED12210  ;TFT
! db &h08
! dd &h107D79B5  ;INFECTED
! db &h03
! dd &hB2CA2446  ;FFF
! db &h07
! dd &hD7141E3C  ;EMBRACE
! db &h0A
! dd &hDF435ED6  ;AGGRESSION
! db &h09
! dd &h55A48C8F  ;TELOPHASE
! db &h08
! dd &h78FC49A4  ;ORTHODOX
! db &h07
! dd &hD3D11D92  ;NOROUZI
! db &h08
! dd &h03137C35  ;DEVOTION
! db &h0B
! dd &h517CA44F  ;PHILBUSTIER
! db &h04
! dd &h529B8A93  ;KOMA
! db &h08
! dd &h83EEA558  ;RAZOR9II
! db &h09
! dd &h87FFE916  ;RAZORI9II
! db &h0A
! dd &h82BD81F1  ;RAZOR I9II
! db &h08
! dd &hD5BCAE39  ;DEVIANCE
! db &h03
! dd &h2AC7FA71  ;AIR
! db &h0D
! dd &h30FD0022  ;ROGUEWARRIORZ
! db &h05
! dd &h5FF1F172  ;TPORT
! db &h06
! dd &hFE35CE2A  ;MIRAGE
! db &h04
! dd &h4148B0C7  ;RISC
! db &h00        ;Terminator.
END FUNCTION


FUNCTION PBMAIN() AS LONG
LOCAL sName AS STRING

'// Examples ...
sName = "Joe Bloggs"              '// valid
'sName = "h4x0r kr3w"              '// illegal
'sName = "Razor 1911"              '// illegal
'sName = "Some Company Pty. Ltd."  '// valid

IF IsNameLegal(sName) = 1 THEN
    STDOUT "Yes, legal name"
ELSE
    STDOUT "ILLEGAL!"
END IF
WAITKEY$
    
END FUNCTION