- Moderatör
-
- #1
Słyszę, słyszę letni powiew.
Kurucu
Merhaba memoryhackers.org üyeleri, bir pubg konusuyla yeniden beraberiz. Bugün size "tehavatar" tarafından PUBG oyunu için hazırlanmış skeleton esp kaynak kodunu paylaşacağım. (ToMatrixWithScale yapımında bu arkadaşımıza ApocDev tarafından yardım edilmiş.)
Bu arkadaşın açıklamalarına göre, güzel bir 3D iskelet çizebilmek için kafa pozisyonunu bilmesi lazımmış (ee tabiki yani mq) bundan dolayıda size şimdi atacağım sourceyi kullanıyormuş.
Bilgi için, ilgili bone numaraları şurda yer alır:
Entity döngünüzde ComponentToWorld bilgilerini okumanız lazım (USkeletalMeshComponent in içinden FTransform'da bulabilirsiniz ).
Dumplanmış sdk nın içinde bu bölüm olmadığından dolayı manuel olarak bulmanız lazım, şanslısınız ki bulmanız ve bunu çözmeniz o kadar zor değil.
Şuanki offsetleri size veriyorum, bu sayede bir dahaki güncellemede kendiniz elle güncelleyebilirsiniz.
ComponentToWorld = [AActor + 0x400] + 0x190
İşte burda arkadaşımızın paylaştığı external GetBoneIndex methodunu görebiliriz.
Bu kodlar tüm bone bilgilerini içeren array dizesinin içinden istediğimiz bireysel boneleri okumamıza olanak sağlıyor.
Bu array dizini UE4 ün websitesinde 'CachedBoneSpaceTransforms' olarak adlandırılmış fakat SDK nın içinde herhangi bir şekilde bulunmuyor, yani bu demek oluyorki eğer bu fix yerse, elle güncellemeniz gerekecek.
Buda her bone için dünya koordinatlarını alıyor.
Son güncellenen bone ıd ları:
Ve son olarak, her bone arasına line çizme kodumuz. Entity loopunuzun içinde kullanın.:
Evet arkadaşlar konumuzun sonuna geldik, eğer her şeyi doğru yaptıysanız ve offsetler + adresler güncel ise güzel bir external bone esp kullanabilirsiniz.
Eğer programlama hakkında & reverse engineering hakkında gram bilginiz yoksa, bu konu size çöp gibi gözükebilir. Fakat ben bu konuyu ingilizceden türkçeye gerçekten bir şeyler öğrenmeyi isteyen ve programlama hakkında umut veren arkadaşlar için çevirdim. Ne yazıkki websitemizde pubg oyunu için hazıra konabileceğiniz bir konu bulunmamaktadır & bulunmayacaktır.
Umarım faydalı olmuştur.
Kaynak: UnknownCheats
Bu arkadaşın açıklamalarına göre, güzel bir 3D iskelet çizebilmek için kafa pozisyonunu bilmesi lazımmış (ee tabiki yani mq) bundan dolayıda size şimdi atacağım sourceyi kullanıyormuş.
Bilgi için, ilgili bone numaraları şurda yer alır:
Entity döngünüzde ComponentToWorld bilgilerini okumanız lazım (USkeletalMeshComponent in içinden FTransform'da bulabilirsiniz ).
Dumplanmış sdk nın içinde bu bölüm olmadığından dolayı manuel olarak bulmanız lazım, şanslısınız ki bulmanız ve bunu çözmeniz o kadar zor değil.
Şuanki offsetleri size veriyorum, bu sayede bir dahaki güncellemede kendiniz elle güncelleyebilirsiniz.
ComponentToWorld = [AActor + 0x400] + 0x190
PHP:
actor.ComponentToWorld = ReadFTransform(mesh+ 0x190);
PHP:
public class FTransform
{
public Vector4 Rotation;
public Vector3 Translation;
public Vector3 Scale3D;
public FTransform(Vector4 rot, Vector3 translation, Vector3 scale)
{
Rotation = rot;
Translation = translation;
Scale3D = scale;
}
public Matrix ToMatrixWithScale()
{
Matrix m = new Matrix();
m.M41 = Translation.X;
m.M42 = Translation.Y;
m.M43 = Translation.Z;
float x2 = Rotation.X + Rotation.X;
float y2 = Rotation.Y + Rotation.Y;
float z2 = Rotation.Z + Rotation.Z;
float xx2 = Rotation.X * x2;
float yy2 = Rotation.Y * y2;
float zz2 = Rotation.Z * z2;
m.M11 = (1.0f - (yy2 + zz2)) * Scale3D.X;
m.M22 = (1.0f - (xx2 + zz2)) * Scale3D.Y;
m.M33 = (1.0f - (xx2 + yy2)) * Scale3D.Z;
float yz2 = Rotation.Y * z2;
float wx2 = Rotation.W * x2;
m.M32 = (yz2 - wx2) * Scale3D.Z;
m.M23 = (yz2 + wx2) * Scale3D.Y;
float xy2 = Rotation.X * y2;
float wz2 = Rotation.W * z2;
m.M21 = (xy2 - wz2) * Scale3D.Y;
m.M12 = (xy2 + wz2) * Scale3D.X;
float xz2 = Rotation.X * z2;
float wy2 = Rotation.W * y2;
m.M31 = (xz2 + wy2) * Scale3D.Z;
m.M13 = (xz2 - wy2) * Scale3D.X;
m.M14 = 0.0f;
m.M24 = 0.0f;
m.M34 = 0.0f;
m.M44 = 1.0f;
return m;
}
}
PHP:
public FTransform ReadFTransform(long ptr)
{
//i know this is shitty. I still dont care.
float quatX = ReadFloat(ptr + 0x00);
float quatY = ReadFloat(ptr + 0x04);
float quatZ = ReadFloat(ptr + 0x08);
float quatW = ReadFloat(ptr + 0x0C);
float transX = ReadFloat(ptr + 0x0010);
float transY = ReadFloat(ptr + 0x0014);
float transZ = ReadFloat(ptr + 0x0018);
float scaleX = ReadFloat(ptr + 0x0020);
float scaleY = ReadFloat(ptr + 0x0024);
float scaleZ = ReadFloat(ptr + 0x0028);
Vector4 fQuat = new Vector4(quatW, quatX, quatY, quatZ);
Vector3 trans = new Vector3(transX, transY, transZ);
Vector3 scale = new Vector3(scaleX, scaleY, scaleZ);
FTransform fTransform = new FTransform(fQuat, trans, scale);
return fTransform;
}
İşte burda arkadaşımızın paylaştığı external GetBoneIndex methodunu görebiliriz.
Bu kodlar tüm bone bilgilerini içeren array dizesinin içinden istediğimiz bireysel boneleri okumamıza olanak sağlıyor.
Bu array dizini UE4 ün websitesinde 'CachedBoneSpaceTransforms' olarak adlandırılmış fakat SDK nın içinde herhangi bir şekilde bulunmuyor, yani bu demek oluyorki eğer bu fix yerse, elle güncellemeniz gerekecek.
PHP:
public FTransform GetBoneIndex(long actorPtr, int boneIndex)
{
long mesh = ReadInt64(actorPtr + 0x400); //USkeletalMeshComponent
long arrayBones = ReadInt64(mesh + 0x0790); //CachedBoneSpaceTransforms
var transform = ReadFTransform(arrayBones + (boneIndex * 0x30));
return transform;
}
Buda her bone için dünya koordinatlarını alıyor.
PHP:
public Vector3 GetBoneWithRotation(int id, ArrayActorInfo actor)
{
var bone = GetBoneIndex(actor.BasePointer , id); //get the bone vector without any rotation applied
var boneMatrix = bone.ToMatrixWithScale();
var componentToWorldMatrix = actor.ComponentToWorld.ToMatrixWithScale(); //bone translations are applied to ComponentToWorld matrix
var newMatrix = boneMatrix * componentToWorldMatrix;
return new Vector3(newMatrix.M41, newMatrix.M42, newMatrix.M43);
}
Son güncellenen bone ıd ları:
Kod:
enum Bone : int
{
Root = 0,
pelvis = 1,
spine_01 = 2,
spine_02 = 3,
spine_03 = 4,
neck_01 = 5,
Head = 6,
face_root = 7,
eyebrows_pos_root = 8,
eyebrows_root = 9,
eyebrows_r = 10,
eyebrows_l = 11,
eyebrow_l = 12,
eyebrow_r = 13,
forehead_root = 14,
forehead = 15,
jaw_pos_root = 16,
jaw_root = 17,
jaw = 18,
mouth_down_pos_root = 19,
mouth_down_root = 20,
lip_bm_01 = 21,
lip_bm_02 = 22,
lip_br = 23,
lip_bl = 24,
jaw_01 = 25,
jaw_02 = 26,
cheek_pos_root = 27,
cheek_root = 28,
cheek_r = 29,
cheek_l = 30,
nose_side_root = 31,
nose_side_r_01 = 32,
nose_side_r_02 = 33,
nose_side_l_01 = 34,
nose_side_l_02 = 35,
eye_pos_r_root = 36,
eye_r_root = 37,
eye_rot_r_root = 38,
eye_lid_u_r = 39,
eye_r = 40,
eye_lid_b_r = 41,
eye_pos_l_root = 42,
eye_l_root = 43,
eye_rot_l_root = 44,
eye_lid_u_l = 45,
eye_l = 46,
eye_lid_b_l = 47,
nose_pos_root = 48,
nose = 49,
mouth_up_pos_root = 50,
mouth_up_root = 51,
lip_ul = 52,
lip_um_01 = 53,
lip_um_02 = 54,
lip_ur = 55,
lip_l = 56,
lip_r = 57,
hair_root = 58,
hair_b_01 = 59,
hair_b_02 = 60,
hair_l_01 = 61,
hair_l_02 = 62,
hair_r_01 = 63,
hair_r_02 = 64,
hair_f_02 = 65,
hair_f_01 = 66,
hair_b_pt_01 = 67,
hair_b_pt_02 = 68,
hair_b_pt_03 = 69,
hair_b_pt_04 = 70,
hair_b_pt_05 = 71,
camera_fpp = 72,
GunReferencePoint = 73,
GunRef = 74,
breast_l = 75,
breast_r = 76,
clavicle_l = 77,
upperarm_l = 78,
lowerarm_l = 79,
hand_l = 80,
thumb_01_l = 81,
thumb_02_l = 82,
thumb_03_l = 83,
thumb_04_l_MBONLY = 84,
index_01_l = 85,
index_02_l = 86,
index_03_l = 87,
index_04_l_MBONLY = 88,
middle_01_l = 89,
middle_02_l = 90,
middle_03_l = 91,
middle_04_l_MBONLY = 92,
ring_01_l = 93,
ring_02_l = 94,
ring_03_l = 95,
ring_04_l_MBONLY = 96,
pinky_01_l = 97,
pinky_02_l = 98,
pinky_03_l = 99,
pinky_04_l_MBONLY = 100,
item_l = 101,
lowerarm_twist_01_l = 102,
upperarm_twist_01_l = 103,
clavicle_r = 104,
upperarm_r = 105,
lowerarm_r = 106,
hand_r = 107,
thumb_01_r = 108,
thumb_02_r = 109,
thumb_03_r = 110,
thumb_04_r_MBONLY = 111,
index_01_r = 112,
index_02_r = 113,
index_03_r = 114,
index_04_r_MBONLY = 115,
middle_01_r = 116,
middle_02_r = 117,
middle_03_r = 118,
middle_04_r_MBONLY = 119,
ring_01_r = 120,
ring_02_r = 121,
ring_03_r = 122,
ring_04_r_MBONLY = 123,
pinky_01_r = 124,
pinky_02_r = 125,
pinky_03_r = 126,
pinky_04_r_MBONLY = 127,
item_r = 128,
lowerarm_twist_01_r = 129,
upperarm_twist_01_r = 130,
BackPack = 131,
backpack_01 = 132,
backpack_02 = 133,
Slot_Primary = 134,
Slot_Secondary = 135,
Slot_Melee = 136,
slot_throwable = 137,
coat_l_01 = 138,
coat_l_02 = 139,
coat_l_03 = 140,
coat_l_04 = 141,
coat_fl_01 = 142,
coat_fl_02 = 143,
coat_fl_03 = 144,
coat_fl_04 = 145,
coat_b_01 = 146,
coat_b_02 = 147,
coat_b_03 = 148,
coat_b_04 = 149,
coat_r_01 = 150,
coat_r_02 = 151,
coat_r_03 = 152,
coat_r_04 = 153,
coat_fr_01 = 154,
coat_fr_02 = 155,
coat_fr_03 = 156,
coat_fr_04 = 157,
thigh_l = 158,
calf_l = 159,
foot_l = 160,
ball_l = 161,
calf_twist_01_l = 162,
thigh_twist_01_l = 163,
thigh_r = 164,
calf_r = 165,
foot_r = 166,
ball_r = 167,
calf_twist_01_r = 168,
thigh_twist_01_r = 169,
Slot_SideArm = 170,
skirt_l_01 = 171,
skirt_l_02 = 172,
skirt_l_03 = 173,
skirt_f_01 = 174,
skirt_f_02 = 175,
skirt_f_03 = 176,
skirt_b_01 = 177,
skirt_b_02 = 178,
skirt_b_03 = 179,
skirt_r_01 = 180,
skirt_r_02 = 181,
skirt_r_03 = 182,
ik_hand_root = 183,
ik_hand_gun = 184,
ik_hand_r = 185,
ik_hand_l = 186,
ik_aim_root = 187,
ik_aim_l = 188,
ik_aim_r = 189,
ik_foot_root = 190,
ik_foot_l = 191,
ik_foot_r = 192,
camera_tpp = 193,
ik_target_root = 194,
ik_target_l = 195,
ik_target_r = 196,
VB_spine_03_spine_03 = 197,
VB_upperarm_r_lowerarm_r = 198
}
PHP:
static Bone[] skeletonUpper = new Bone[] {
Bone.forehead, Bone.Head, Bone.neck_01,
};
static Bone[] skeletonRightArm = new Bone[] {
Bone.neck_01, Bone.upperarm_r, Bone.lowerarm_r, Bone.hand_r
};
static Bone[] skeletonLeftArm = new Bone[] {
Bone.neck_01, Bone.upperarm_l, Bone.lowerarm_l, Bone.hand_l
};
static Bone[] skeletonSpine = new Bone[] {
Bone.neck_01, Bone.spine_01, Bone.spine_02, Bone.pelvis
};
static Bone[] skeletonLowerRight = new Bone[] {
Bone.pelvis, Bone.thigh_r, Bone.calf_r, Bone.foot_r
};
static Bone[] skeletonLowerLeft = new Bone[] {
Bone.pelvis, Bone.thigh_l, Bone.calf_l, Bone.foot_l
};
static Bone[][] skeleton = new Bone[][] {
skeletonUpper, skeletonLeftArm, skeletonRightArm, skeletonSpine, skeletonLowerRight, skeletonLowerLeft
};
Ve son olarak, her bone arasına line çizme kodumuz. Entity loopunuzun içinde kullanın.:
PHP:
foreach (Bone[] part in skeleton)
{
Vector3 previousBone = new Vector3();
foreach (Bone b in part)
{
var currentBone = GetBoneWithRotation((int)b, actor);
if (previousBone.X == 0) //first bone no draw happens
{
previousBone = currentBone;
continue;
}
else
{
//draw line from previousBone to currentBone W2S
DrawLine3D(previousBone, currentBone);
previousBone = currentBone;
}
}
}
Evet arkadaşlar konumuzun sonuna geldik, eğer her şeyi doğru yaptıysanız ve offsetler + adresler güncel ise güzel bir external bone esp kullanabilirsiniz.
Eğer programlama hakkında & reverse engineering hakkında gram bilginiz yoksa, bu konu size çöp gibi gözükebilir. Fakat ben bu konuyu ingilizceden türkçeye gerçekten bir şeyler öğrenmeyi isteyen ve programlama hakkında umut veren arkadaşlar için çevirdim. Ne yazıkki websitemizde pubg oyunu için hazıra konabileceğiniz bir konu bulunmamaktadır & bulunmayacaktır.
Umarım faydalı olmuştur.
Kaynak: UnknownCheats