/**************************************************************************************************************
* Simple C# RTE Tutorial v1.0 by FarSideX
* Default names of controls given by the designer were kept for ease of duplicating the tutorial,
* normally you should rename them with more descriptive names.
* Although this program is ment for learning purposes it does function to block banning in
* Call of Duty: Ghosts v1.07 by replacing a branch with link register update (bl)
* with ori 0,0,0 (nop). This method was, to the best of my knowledge, first publicly posted by
* Red-EyeX32 on NGU. I personally think there are better ways of doing Anti-Ban.
* But it works so who am I to judge 
**************************************************************************************************************/
using System; // namespaces we will be using System and Forms, also PS3Lib
using System.Windows.Forms;
using PS3Lib; // Add PS3Lib.dll by iMCSx to references
namespace RTE_Tool_Tutorial // This is our namespace, namespaces allow us to use the same varibles, etc. as other namespaces
{ // change this if you started a new project with a different namespace
public partial class Form1 : Form // We will be extending the Form class with our own methods
{
private PS3API PS3 = new PS3API(); // create an instance of iMCSx's PS3API
private static UInt32 antiBanOffset = 0x00556638; // set offsets in static varibles so you only need to update one spot
// when there is an update
private UInt32 orgOpcode; // this will be used to hold the orginal contents of the memory we change
public Form1() // This construtor is called after our Base class is instantiated
{
InitializeComponent(); // Initalizes all the stuff you did in the designer and VS wrote the code for you
}
// Form1_Load is called once your form is loaded into memory and the inital constructor is finished
// This is where we finish setting up our controls, it could be done in the constructor also
//
private void Form1_Load(object sender, EventArgs e)
{
this.Text = "Anti-Ban"; // set the form's title, can also be done in the designer under Form1 properies
button1.Text = "Enable"; // set the text on the button, we will be changing this later when we toggle the button
radioButton1.Text = "TMAPI"; // set first radioButton to be SN System's Target Manager API
radioButton2.Text = "CCAPI"; // set second radioButton to be Enstone's Control Console API
radioButton1.Checked = true; // set TMAPI as default API; setting this here will cause a CheckChanged event to occur
}
// radioButton1_CheckedChanged event handler
// This private method is where we set which API PS3API is to use
// Past this we do not have to make any differentaion between using Target Manager or Control Console APIs
// Only one CheckChanged event handler is required because there are only two radioButtons and the
// event occurs when it changes and not only when set, when using more than two consider using a checkedListBox or array.
// Do not use an eventhandler for both as both will be called
//
private void radioButton1_CheckedChanged(object sender, EventArgs e)
{
if (radioButton1.Checked == true) // Inspect radioButton state to determine which is selected
PS3.ChangeAPI(SelectAPI.TargetManager); // If true let PS3API know we want TargetManager APi
else
PS3.ChangeAPI(SelectAPI.ControlConsole); // If false we want ConsoleControl API
}
// button1_Click event handler
// this is where all the work is done
// I consider the nested if/else statements to be messy, normally this can be avoided with the use of exceptions
// but unfortunatly some libraries do not make use of them leaving few options for more effient and cleaner code.
//
private void button1_Click(object sender, EventArgs e)
{
if (button1.Text == "Enable") // When button1.Text == "Enable' we insert the hack code
{
if (PS3.ConnectTarget()) // Connect to target PS3, CCAPI users will see a dialog to enter the PS3's IP
if (PS3.AttachProcess()) // Attach to the main game process
{
orgOpcode = PS3.Extension.ReadUInt32(antiBanOffset); // ReadUInt32 should throw an exception but it doesn't and has no error reporting
PS3.Extension.WriteUInt32(antiBanOffset, 0x60000000); // No exception, no error report, verify needed
if (PS3.Extension.ReadUInt32(antiBanOffset) == 0x60000000) // Verify the data was written as PS3Lib does not provide any error reporting
{ // and there is no in game signs if this worked or not
MessageBox.Show("Anti-Ban activated!"); // Let user know it was a success!
// Environment.Exit(); // For an anti-ban only tool exiting app here would be a good idea
// Uncomment it to have the app close after anti-ban is set.
button1.Text = "Disable"; // Success! Change button text so we can toggle its function
radioButton1.Enabled = false; // disable radioButtions so API does not get changed
radioButton2.Enabled = false;
}
else
MessageBox.Show("Verify failed!\nAnti-Ban is not active, PS3 may not be stable please retry.", "Warning!");
}
else
MessageBox.Show("Unable to attach to Ghosts.\nAnti-Ban is not active", "Warning!");
else
MessageBox.Show("Unable to connect to PS3.\nAnti-ban is not active.", "Warning!");
}
else // button1.Text == "Disable" so we restore the Anti-Cheat code, This is just for demonstration purposes
{
PS3.Extension.WriteUInt32(antiBanOffset, orgOpcode); // write back the data we stored
if (PS3.Extension.ReadUInt32(antiBanOffset) == orgOpcode) // verify the write
{
MessageBox.Show("Anti-Cheat restored.\nDo not mod while online.");
PS3.DisconnectTarget(); // Disconnect in case user wants to change targets
button1.Text = "Enable"; // change button1.Text for toggle
radioButton1.Enabled = true; // enable radioButton again
radioButton2.Enabled = true;
}
else
{
MessageBox.Show("Failed to restore Anti-Cheat.", "Warning");
}
}
}
// These last two methods are not required. I use them to prevent myself from picking up too many bad habits
// while coding in C#. If you truly want to learn to program I suggest you choose another less hand holding type of
// programing language such as C or assembly or even PHP. These languages allow you to learn by making mistakes.
// Yes they are more difficult to learn but that is the whole point, C# is more like an application construction set.
// This is called before the form closes
// Since our cleanup is brief we can do it here rather than after the form closes
//
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
PS3.DisconnectTarget(); // Cleanup connection
}
// This is called after the form closes
//
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
GC.Collect(); // Force garbage collection. Not required but not a bad idea either
}
}
}
namespace RTE_Tool_Tutorial
Copyright © 2026, NextGenUpdate.
All Rights Reserved.