Help how to change GPCI number in 2022?

stynne

Member
Joined
Mar 15, 2022
Messages
6
Reaction score
0
I'm trying to change my GPCI but it isn't working. I read before that changing the directory of your GTA would change the GPCI, but it didn't in my case. I used to play in my main SSD and then I downloaded a brand new GTA and put it in my old HD, so it's literally a different hardware but the GCPI number was still the same for the server I was.

I have two questions:

1. How can I change it?
2. How can I check my GPCI with Cheat Engine? I downloaded it and I'm trying my best, that way I would know if it actually changed.

This post is going to be useful for others as well, if we find a solution.

Thank you in advance.
 

dphome

Well-known member
Joined
Mar 21, 2020
Messages
475
Solutions
9
Reaction score
168
Location
Poland
1. Use CLEO script https://ugbase.eu/threads/gpci-unbanner-cleo.273/ or s0beit.
PHP:
void RakClient::SendFakeClientInfo(ClientInfo OriginInfo, char DriveID[64])
{
    BitStream bsSend;

    addMessageToChatWindow("===============[Активирован разбан железа]=============");
    bsSend.Write(OriginInfo.iVersion);
    addMessageToChatWindow(" iVersion-> %d", OriginInfo.iVersion);
    bsSend.Write(OriginInfo.byteMod);
    addMessageToChatWindow(" byteMod-> 0x%X", OriginInfo.byteMod);
    bsSend.Write(OriginInfo.byteNameLen);
    bsSend.Write(OriginInfo.g_szNickName, OriginInfo.byteNameLen);
    bsSend.Write(OriginInfo.uiClientChallengeResponse);
    addMessageToChatWindow(" uiClientChallengeResponse-> 0x%X", OriginInfo.uiClientChallengeResponse);
    bsSend.Write((BYTE)strlen(DriveID));
    bsSend.Write(DriveID, (BYTE)strlen(DriveID));
    addMessageToChatWindow(" DriveID-> %s", DriveID);
    bsSend.Write(OriginInfo.iClientVerLen);
    bsSend.Write(OriginInfo.szClientVersion, OriginInfo.iClientVerLen);
    addMessageToChatWindow(" szClientVersion-> %s", OriginInfo.szClientVersion);
    g_RakClient->RPC(RPC_ClientJoin, &bsSend);
    addMessageToChatWindow("=======================[COMPLITE]======================", OriginInfo.szClientVersion);
}
2. GPCI checking only works on the SA:MP server. CLEO script/s0beit funcs showing false results.
samp.ugbase.eu:7777
 

stynne

Member
Joined
Mar 15, 2022
Messages
6
Reaction score
0
1. Use CLEO script https://ugbase.eu/threads/gpci-unbanner-cleo.273/ or s0beit.
PHP:
void RakClient::SendFakeClientInfo(ClientInfo OriginInfo, char DriveID[64])
{
    BitStream bsSend;

    addMessageToChatWindow("===============[Активирован разбан железа]=============");
    bsSend.Write(OriginInfo.iVersion);
    addMessageToChatWindow(" iVersion-> %d", OriginInfo.iVersion);
    bsSend.Write(OriginInfo.byteMod);
    addMessageToChatWindow(" byteMod-> 0x%X", OriginInfo.byteMod);
    bsSend.Write(OriginInfo.byteNameLen);
    bsSend.Write(OriginInfo.g_szNickName, OriginInfo.byteNameLen);
    bsSend.Write(OriginInfo.uiClientChallengeResponse);
    addMessageToChatWindow(" uiClientChallengeResponse-> 0x%X", OriginInfo.uiClientChallengeResponse);
    bsSend.Write((BYTE)strlen(DriveID));
    bsSend.Write(DriveID, (BYTE)strlen(DriveID));
    addMessageToChatWindow(" DriveID-> %s", DriveID);
    bsSend.Write(OriginInfo.iClientVerLen);
    bsSend.Write(OriginInfo.szClientVersion, OriginInfo.iClientVerLen);
    addMessageToChatWindow(" szClientVersion-> %s", OriginInfo.szClientVersion);
    g_RakClient->RPC(RPC_ClientJoin, &bsSend);
    addMessageToChatWindow("=======================[COMPLITE]======================", OriginInfo.szClientVersion);
}
2. GPCI checking only works on the SA:MP server. CLEO script/s0beit funcs showing false results.
samp.ugbase.eu:7777
Thank you so much for the reply.

Is there a simple gamemode with a command to check GPCI I could try?

I know the basics (I guess), I assume if I have a gamemode with such command I could just run it locally then login and test?

Thank you again.
 

dphome

Well-known member
Joined
Mar 21, 2020
Messages
475
Solutions
9
Reaction score
168
Location
Poland
PHP:
{$CLEO .cs}
thread 'Flapjack92'
0662: printstring "Flapjack92"

:Flapjack92_1
1@ = 0x46 // Hex Code For ASCII Character 'F'
2@ = 0x4C // Hex Code For ASCII Character 'L'
3@ = 0x41 // Hex Code For ASCII Character 'A'
5@ = 0x50 // Hex Code For ASCII Character 'P'

// This Code Uses A Randomization Algorithm, Which Changes Your GPCI String
// (Starting address = C9236C)
// Each Time You Start GTA.
:Flapjack92_2
wait 0
0209: 4@ = random_int_in_ranges 1 5 // Chooses A Number From 1 to 4 (I think? Damn opcodes lol)
gosub @Check_1 // Call The Decision Making Function (BELOW)
0A8C: write_memory 0x00C9236C size 1 value 4@ virtual_protect 1 // Write The Character Chosen from the Decision Function
0209: 4@ = random_int_in_ranges 1 5                             // To The GPCI String In Memory
gosub @Check_1
0A8C: write_memory 0x00C9236D size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C9236E size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C9236F size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C92370 size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C92371 size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C92372 size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C92373 size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C92374 size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C92375 size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C92376 size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C92377 size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C92378 size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C92379 size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C9237A size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C9237B size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C9237C size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C9237D size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C9237E size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C9237F size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C92380 size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C92381 size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C92382 size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C92383 size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C92384 size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C92385 size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C92386 size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C92387 size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C92388 size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C92389 size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C9238A size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C9238B size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C9238C size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C9238D size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C9238E size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C9238F size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C92390 size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C92391 size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C92392 size 1 value 4@ virtual_protect 1
0A93: end_custom_thread
                          
:Check_1 // Decision Making Function Based on Random Number Generated Earlier From 0209.                       
wait 0                             
if                                 
4@ == 1 // If the Random Number Generated From Opcode 0209 is one, Return value 'F'
jf @Check_2 // is written to memory later by 0A8C
0085: 4@ = 1@
return

:Check_2
wait 0
if
4@ == 2 // If the Random Number Generated From Opcode 0209 is two, Return value 'L'
jf @Check_3
0085: 4@ = 2@
return

:Check_3
wait 0
if
4@ == 3 // If the Random Number Generated From Opcode 0209 is three, Return value 'A'
jf @Check_4
0085: 4@ = 3@
return

:Check_4
wait 0 // Last Possible Outcome of Random Int(Has to be 4; no test needed) Returns 'P'
0085: 4@ = 5@
return
 

Attachments

  • GpciUnban.cs
    24.4 KB · Views: 48

stynne

Member
Joined
Mar 15, 2022
Messages
6
Reaction score
0
PHP:
{$CLEO .cs}
thread 'Flapjack92'
0662: printstring "Flapjack92"

:Flapjack92_1
1@ = 0x46 // Hex Code For ASCII Character 'F'
2@ = 0x4C // Hex Code For ASCII Character 'L'
3@ = 0x41 // Hex Code For ASCII Character 'A'
5@ = 0x50 // Hex Code For ASCII Character 'P'

// This Code Uses A Randomization Algorithm, Which Changes Your GPCI String
// (Starting address = C9236C)
// Each Time You Start GTA.
:Flapjack92_2
wait 0
0209: 4@ = random_int_in_ranges 1 5 // Chooses A Number From 1 to 4 (I think? Damn opcodes lol)
gosub @Check_1 // Call The Decision Making Function (BELOW)
0A8C: write_memory 0x00C9236C size 1 value 4@ virtual_protect 1 // Write The Character Chosen from the Decision Function
0209: 4@ = random_int_in_ranges 1 5                             // To The GPCI String In Memory
gosub @Check_1
0A8C: write_memory 0x00C9236D size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C9236E size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C9236F size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C92370 size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C92371 size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C92372 size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C92373 size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C92374 size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C92375 size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C92376 size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C92377 size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C92378 size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C92379 size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C9237A size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C9237B size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C9237C size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C9237D size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C9237E size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C9237F size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C92380 size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C92381 size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C92382 size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C92383 size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C92384 size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C92385 size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C92386 size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C92387 size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C92388 size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C92389 size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C9238A size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C9238B size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C9238C size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C9238D size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C9238E size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C9238F size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C92390 size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C92391 size 1 value 4@ virtual_protect 1
0209: 4@ = random_int_in_ranges 1 5
gosub @Check_1
0A8C: write_memory 0x00C92392 size 1 value 4@ virtual_protect 1
0A93: end_custom_thread
                         
:Check_1 // Decision Making Function Based on Random Number Generated Earlier From 0209.                      
wait 0                            
if                                
4@ == 1 // If the Random Number Generated From Opcode 0209 is one, Return value 'F'
jf @Check_2 // is written to memory later by 0A8C
0085: 4@ = 1@
return

:Check_2
wait 0
if
4@ == 2 // If the Random Number Generated From Opcode 0209 is two, Return value 'L'
jf @Check_3
0085: 4@ = 2@
return

:Check_3
wait 0
if
4@ == 3 // If the Random Number Generated From Opcode 0209 is three, Return value 'A'
jf @Check_4
0085: 4@ = 3@
return

:Check_4
wait 0 // Last Possible Outcome of Random Int(Has to be 4; no test needed) Returns 'P'
0085: 4@ = 5@
return

Thank you so much!

Working just fine. You're a beast :)
 
Top