Code:
private static unsafe uint FindPattern(int StartAddress, int Length, string bMask, string szMask)
{
byte[] ByteMask = new byte[szMask.Length];
//Creating Byte Array
int State = 0;
for (int i = 0; i < bMask.Length; i++)
{
if (bMask[i] == 'x')
{
ByteMask[State] = byte.Parse(bMask.Substring(i + 1, 2), System.Globalization.NumberStyles.HexNumber);
State++;
}
}
//Searching Byte Pattern
for (int i = 0; i < Length; i++)
{
bool Found = true;
for (int j = 0; j < ByteMask.Length; j++)
{
Found = Found && ((ByteMask[j] == *(byte*)(StartAddress + i + j)) || szMask[j] == '?');
}
if (Found) return (uint)(StartAddress + i); //Found it
}
return 0; //Didn't found it
}
public static unsafe int[] SequentedOffsetScanner(int StartAddress, int Length, string bMask, string szMask, int OffsetPos)
{
List<int> FoundOffsets = new List<int>();
//Creating Byte Array
byte[] ByteMask = new byte[szMask.Length];
int State = 0;
for (int i = 0; i < bMask.Length; i++)
{
if (bMask[i] == 'x')
{
ByteMask[State] = byte.Parse(bMask.Substring(i + 1, 2), System.Globalization.NumberStyles.HexNumber);
State++;
}
}
//Searching Byte Pattern
for (int i = 0; i < Length; i++)
{
bool Found = true;
for (int j = 0; j < ByteMask.Length; j++)
{
Found = Found && ((ByteMask[j] == *(byte*)(StartAddress + i + j)) || szMask[j] == '?');
}
if (Found)
{
if (!FoundOffsets.Contains(*(int*)(StartAddress + i + OffsetPos)))
FoundOffsets.Add(*(int*)(StartAddress + i + OffsetPos));
}
}
return FoundOffsets.ToArray();
}
public static unsafe int[] SequentedByteOffsetScanner(int StartAddress, int Length, string bMask, string szMask, int OffsetPos)
{
List<int> FoundOffsets = new List<int>();
//Creating Byte Array
byte[] ByteMask = new byte[szMask.Length];
int State = 0;
for (int i = 0; i < bMask.Length; i++)
{
if (bMask[i] == 'x')
{
ByteMask[State] = byte.Parse(bMask.Substring(i + 1, 2), System.Globalization.NumberStyles.HexNumber);
State++;
}
}
//Searching Byte Pattern
for (int i = 0; i < Length; i++)
{
bool Found = true;
for (int j = 0; j < ByteMask.Length; j++)
{
Found = Found && ((ByteMask[j] == *(byte*)(StartAddress + i + j)) || szMask[j] == '?');
}
if (Found)
{
if (!FoundOffsets.Contains((int)(*(byte*)(StartAddress + i + OffsetPos))))
FoundOffsets.Add((int)(*(byte*)(StartAddress + i + OffsetPos)));
}
}
return FoundOffsets.ToArray();
}
Pattern Scannings:
Code:
public static unsafe uint FindWeaponMgr(uint CShell)
{
uint WeaponMgr = FindPattern((int)CShell, 0xFFFFFF, @"\x8B\x4F\x04\xA1\x00\x00\x00\x00\x85\xC0\x8B\x51\x04\x8B\x6A\x04", "xxxx????xxxxxxxx");
WeaponMgr = (*(uint*)(WeaponMgr + 4)) - CShell;
return WeaponMgr;
}
public static unsafe uint FindCShellPointer(uint CShell)
{
uint CShell_Pointer = FindPattern((int)CShell, 0xFFFFFF, @"\xc6\x01\x01\x8b\x15\x00\x00\x00\x00\x8b\x82\x00\x00\x00\x00\x8B", "xxxxx????xx????x");
CShell_Pointer = (*(uint*)(CShell_Pointer + 5)) - CShell;
return CShell_Pointer;
}
public static unsafe uint FindBasicPlayerInfo(uint CShell)
{
uint BasicPlayerInfo = FindPattern((int)CShell, 0xFFFFFF, @"\x8B\x0D\xD8\x52\xF6\x10\x83\xC4\x04\x69\xC0\xA8\x00\x00\x00\xD9\x9C\x08\x88\x00\x00\x00\x8B\x4C\x24\x30\x3B\xCB", "xx????xxxxx????xxx????xxx?xx");
BasicPlayerInfo = (*(uint*)(BasicPlayerInfo + 2)) - CShell;
return BasicPlayerInfo;
}
public static unsafe uint FindPushToConsole(uint CShell)
{
uint BasicPlayerInfo = FindPattern((int)CShell, 0xFFFFFF, @"\x68\xB4\xB5\x5B\x10\x68\x28\x27\x4E\x10\xB9\x28\xB6\x5B\x10\xE8\x07\xE4\xB4\xFF\x68\x40\xA1\x4D\x10\xE8\x4A\xDC\xF8\xFF\x59\xC3\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\x6A\x04\x68\x3C\x27\x4E\x10\x68\x38\x3B\x5A\x10\xB9\x38\xB6\x5B\x10\xE8\xDA\xE4\xB4\xFF\x68\x50\xA1\x4D\x10\xE8\x1D\xDC\xF8\xFF", "x????x????x????x????x????x????xxxxxxxxxxxxxx?x????x????x????x????x????x????");
BasicPlayerInfo = (*(uint*)(BasicPlayerInfo + 1)) - CShell;
return BasicPlayerInfo;
}
//*****************Offsets
public static unsafe void BetaOffsetSearch(uint CShell)
{
int[] Offsets = SequentedByteOffsetScanner((int)CShell, 0xFFFFFF, @"\xD9\x5C\x24\x24\x8B\x0D\xD4\x52\xF6\x10\xD9\x44\x24\x24\x8B\x15\xD8\x52\xF6\x10\x83\xC4\x04\x69\xC9\xA8\x00\x00\x00\xD9\x5C\x11\x08", "xxx?xx????xxx?xx????xx?xx????xxx?", 32);
for (int i = 0; i < Offsets.Length; i++)
Console.WriteLine("Found Offset(C4DefuTimePattern): 0x" + Storage.DecToHex(Offsets[i]));
}
//WeaponMgr
public static unsafe uint FindReloadAnimRatio(uint CShell)
{
int[] Offsets = SequentedOffsetScanner((int)CShell, 0xFFFFFF, @"\x8B\x0D\xA4\xC5\xFC\x10\x53\x8D\x3C\xB1\xFF\x15\x54\xC4\x4D\x10\xD9\x5C\x24\x14\xD9\x44\x24\x14\x8B\x07\xD9\x98\x3C\x0C\x00\x00\x83\xC4\x04", "xx????xxxxxx????xxx?xxx?xxxx????xx?", 28);
return (uint)Offsets[1];
}
public static unsafe uint FindChangeWeaponAnimRatio(uint CShell)
{
uint Value = FindPattern((int)CShell, 0xFFFFFF, @"\x8B\x0D\xA4\xC5\xFC\x10\x53\x8D\x3C\xB1\xFF\x15\x54\xC4\x4D\x10\xD9\x5C\x24\x14\x8B\x17\xD9\x44\x24\x14\x8B\x3D\xE0\xC4\x4D\x10\xD9\x9A\x40\x0C\x00\x00\x83\xC4\x04", "xx????xxxxxx????xxx?xxxxx?xx????xx????xx?");
return (*(uint*)(Value + 34));
}
public static unsafe uint FindLeftClickAttributes(uint CShell)
{
int[] Offsets = SequentedOffsetScanner((int)CShell, 0xFFFFFF, @"\x2B\xC1\xC1\xF8\x02\x3B\xF0\x72\x0C\xFF\x15\xE0\xC4\x4D\x10\x8B\x0D\xA4\xC5\xFC\x10\x8B\x04\xB1\x83\x88\xEC\x0A\x00\x00\x01", "xxxx?xxxxxx????xx????xxxxx?????", 26);
return (uint)Offsets[0];
}
public static unsafe uint FindRightClickAttributes(uint CShell)
{
int[] Offsets = SequentedOffsetScanner((int)CShell, 0xFFFFFF, @"\x2B\xC1\xC1\xF8\x02\x3B\xF0\x72\x0C\xFF\x15\xE0\xC4\x4D\x10\x8B\x0D\xA4\xC5\xFC\x10\x8B\x04\xB1\x83\x88\xEC\x0A\x00\x00\x01", "xxxx?xxxxxx????xx????xxxxx?????", 26);
return (uint)Offsets[1];
}
public static unsafe uint FindZoomAttributes(uint CShell)
{
int[] Offsets = SequentedOffsetScanner((int)CShell, 0xFFFFFF, @"\x2B\xC1\xC1\xF8\x02\x3B\xF0\x72\x0C\xFF\x15\xE0\xC4\x4D\x10\x8B\x0D\xA4\xC5\xFC\x10\x8B\x04\xB1\x83\x88\xEC\x0A\x00\x00\x01", "xxxx?xxxxxx????xx????xxxxx?????", 26);
return (uint)Offsets[2];
}
public static unsafe uint FindZoomAction(uint CShell)
{
uint Value = FindPattern((int)CShell, 0xFFFFFF, @"\x8B\x0D\xA4\xC5\xFC\x10\x55\x8D\x1C\xB1\xFF\x15\x54\xC4\x4D\x10\xD9\x5C\x24\x14\xD9\x44\x24\x14\x8B\x0B\xD9\x9C\xB9\x20\x39\x00\x00", "xx????xxxxxx????xxx?xxx?xxxxx????");
return (*(uint*)(Value + 29));
}
public static unsafe uint FindRange(uint CShell)
{
int[] Offsets = SequentedOffsetScanner((int)CShell, 0xFFFFFF, @"\xD9\x44\x24\x14\x8B\x06\xDC\x0D\x50\xFC\x54\x10\x83\xC4\x04\xD9\x5C\x24\x10\xD9\x44\x24\x10\xD9\x98\x0C\x08\x00\x00", "xxx?xxxx????xx?xxx?xxx?xx????", 25);
return (uint)Offsets[0];
}
public static unsafe uint FindAiModeRange(uint CShell)
{
int[] Offsets = SequentedOffsetScanner((int)CShell, 0xFFFFFF, @"\xD9\x44\x24\x14\x8B\x06\xDC\x0D\x50\xFC\x54\x10\x83\xC4\x04\xD9\x5C\x24\x10\xD9\x44\x24\x10\xD9\x98\x0C\x08\x00\x00", "xxx?xxxx????xx?xxx?xxx?xx????", 25);
return (uint)Offsets[1];
}
public static unsafe uint FindDamageVariantionFactor(uint CShell)
{
int[] Offsets = SequentedOffsetScanner((int)CShell, 0xFFFFFF, @"\x8D\x34\xA9\xFF\x15\x54\xC4\x4D\x10\xD9\x5C\x24\x14\xD9\x44\x24\x14\x8B\x16\xD9\x9A\x38\x08\x00\x00", "xxxxx????xxx?xxx?xxxx????", 21);
return (uint)Offsets[2];
}
public static unsafe uint FindAmmoDamage(uint CShell)
{
int[] Offsets = SequentedOffsetScanner((int)CShell, 0xFFFFFF, @"\x8D\x34\xA9\xFF\x15\x54\xC4\x4D\x10\xD9\x5C\x24\x14\xD9\x44\x24\x14\x8B\x06\xD9\x98\x1C\x08\x00\x00", "xxxxx????xxx?xxx?xxxx????", 21);
return (uint)Offsets[0];
}
//BasicPlayerInfo
public static unsafe uint FindC4DefuseTime(uint CShell)
{
int[] Offsets = SequentedOffsetScanner((int)CShell, 0xFFFFFF, @"\x8B\x15\xD4\x52\xF6\x10\xD9\x44\x24\x24\xA1\xD8\x52\xF6\x10\x83\xC4\x04\x69\xD2\xA8\x00\x00\x00\xD9\x9C\x02\x80\x00\x00\x00", "xx????xxx?x????xx?xx????xxx????", 27);
return (uint)Offsets[0];
}
public static unsafe uint FindCharacterHiddenWalkAlpha(uint CShell)
{
int[] Offsets = SequentedOffsetScanner((int)CShell, 0xFFFFFF, @"\x8B\x15\xD4\x52\xF6\x10\xD9\x44\x24\x24\xA1\xD8\x52\xF6\x10\x83\xC4\x04\x69\xD2\xA8\x00\x00\x00\xD9\x9C\x02\x80\x00\x00\x00", "xx????xxx?x????xx?xx????xxx????", 27);
return (uint)Offsets[1];
}
public static unsafe uint FindCharacterHiddenRunAlpha(uint CShell)
{
int[] Offsets = SequentedOffsetScanner((int)CShell, 0xFFFFFF, @"\x8B\x15\xD4\x52\xF6\x10\xD9\x44\x24\x24\xA1\xD8\x52\xF6\x10\x83\xC4\x04\x69\xD2\xA8\x00\x00\x00\xD9\x9C\x02\x80\x00\x00\x00", "xx????xxx?x????xx?xx????xxx????", 27);
return (uint)Offsets[1] + 4;
}
public static unsafe uint FindMovementWalkRate(uint CShell)
{
int[] Offsets = SequentedByteOffsetScanner((int)CShell, 0xFFFFFF, @"\xD9\x5C\x24\x24\x8B\x0D\xD4\x52\xF6\x10\xD9\x44\x24\x24\x8B\x15\xD8\x52\xF6\x10\x83\xC4\x04\x69\xC9\xA8\x00\x00\x00\xD9\x5C\x11\x08", "xxx?xx????xxx?xx????xx?xx????xxx?", 32);
return (uint)Offsets[0];
}
And the Templates project:
Code:
//***************************
CShell_Pointer(5)
\xc6\x01\x01\x8b\x15\x00\x00\x00\x00\x8b\x82\x00\x00\x00\x00\x8B
xxxxx????xx????x
//***************************
WeaponMgr(4)
\x8B\x4F\x04\xA1\x00\x00\x00\x00\x85\xC0\x8B\x51\x04\x8B\x6A\x04
xxxx????xxxxxxxx
//***************************
BasicPlayerInfo(2)
\x8B\x0D\xD8\x52\xF6\x10\x83\xC4\x04\x69\xC0\xA8\x00\x00\x00\xD9\x9C\x08\x88\x00\x00\x00\x8B\x4C\x24\x30\x3B\xCB
xx????xx?xx????xxx????xxx?xx
//***************************
0: LeftClickAttributes(26), 1: RightClickAttributes(26), 2: ZoomAttributes(26), 3: ReloadAttributes(26)
\x2B\xC1\xC1\xF8\x02\x3B\xF0\x72\x0C\xFF\x15\xE0\xC4\x4D\x10\x8B\x0D\xA4\xC5\xFC\x10\x8B\x04\xB1\x83\x88\xEC\x0A\x00\x00\x01
xxxx?xxxxxx????xx????xxxxx?????
//***************************
PushToConsole(1)
\x68\xB4\xB5\x5B\x10\x68\x28\x27\x4E\x10\xB9\x28\xB6\x5B\x10\xE8\x07\xE4\xB4\xFF\x68\x40\xA1\x4D\x10\xE8\x4A\xDC\xF8\xFF\x59\xC3\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\x6A\x04\x68\x3C\x27\x4E\x10\x68\x38\x3B\x5A\x10\xB9\x38\xB6\x5B\x10\xE8\xDA\xE4\xB4\xFF\x68\x50\xA1\x4D\x10\xE8\x1D\xDC\xF8\xFF
x????x????x????x????x????x????xxxxxxxxxxxxxx?x????x????x????x????x????x????
//***************************
0: Unknown(28), 1: ReloadAnimRatio(28), 2: UnKnown(28)
\x8B\x0D\xA4\xC5\xFC\x10\x53\x8D\x3C\xB1\xFF\x15\x54\xC4\x4D\x10\xD9\x5C\x24\x14\xD9\x44\x24\x14\x8B\x07\xD9\x98\x3C\x0C\x00\x00\x83\xC4\x04
xx????xxxxxx????xxx?xxx?xxxx????xx?
//***************************
ChangeWeaponAnimRatio(34)
\x8B\x0D\xA4\xC5\xFC\x10\x53\x8D\x3C\xB1\xFF\x15\x54\xC4\x4D\x10\xD9\x5C\x24\x14\x8B\x17\xD9\x44\x24\x14\x8B\x3D\xE0\xC4\x4D\x10\xD9\x9A\x40\x0C\x00\x00\x83\xC4\x04
xx????xxxxxx????xxx?xxxxx?xx????xx????xx?
//***************************
ZoomAction(29)
\x8B\x0D\xA4\xC5\xFC\x10\x55\x8D\x1C\xB1\xFF\x15\x54\xC4\x4D\x10\xD9\x5C\x24\x14\xD9\x44\x24\x14\x8B\x0B\xD9\x9C\xB9\x20\x39\x00\x00
xx????xxxxxx????xxx?xxx?xxxxx????
//***************************
0:Range(25), 1:AiModeRange(25)
\xD9\x44\x24\x14\x8B\x06\xDC\x0D\x50\xFC\x54\x10\x83\xC4\x04\xD9\x5C\x24\x10\xD9\x44\x24\x10\xD9\x98\x0C\x08\x00\x00
xxx?xxxx????xx?xxx?xxx?xx????
//***************************
0: AIModeDamageFactorByDistance(21), 1: DamageFactorByDistance(21), 2: DamageVariantionFactor(21), 3: BoomDuration(21)
\x8D\x34\xA9\xFF\x15\x54\xC4\x4D\x10\xD9\x5C\x24\x14\xD9\x44\x24\x14\x8B\x16\xD9\x9A\x38\x08\x00\x00
xxxxx????xxx?xxx?xxxx????
//***************************
0:AmmoDamage(21), 1: ReloadAnimRatio(21)
\x8D\x34\xA9\xFF\x15\x54\xC4\x4D\x10\xD9\x5C\x24\x14\xD9\x44\x24\x14\x8B\x06\xD9\x98\x1C\x08\x00\x00
xxxxx????xxx?xxx?xxxx????
//***************************
0: C4DefuseTime(27), 1: CharacterHiddenWalkAlpha(27), 2: UnKnown(27)
\x8B\x15\xD4\x52\xF6\x10\xD9\x44\x24\x24\xA1\xD8\x52\xF6\x10\x83\xC4\x04\x69\xD2\xA8\x00\x00\x00\xD9\x9C\x02\x80\x00\x00\x00
xx????xxx?x????xx?xx????xxx????
//***************************
0: MovementWalkRate(32), 1: UnKnown(32), 2: UnKnown(32), 3: UnKnown(32), 4: UnKnwon(32)
\xD9\x5C\x24\x24\x8B\x0D\xD4\x52\xF6\x10\xD9\x44\x24\x24\x8B\x15\xD8\x52\xF6\x10\x83\xC4\x04\x69\xC9\xA8\x00\x00\x00\xD9\x5C\x11\x08
xxx?xx????xxx?xx????xx?xx????xxx?