めいくりぷとのブログ

技術的なことやゲームのことやら・・・

PUBG チート

gyazo.com

  • o-

[Aimbot]
・Aimbot - Head, Neck, Body, Waist

[ESP]
・Vehicle ESP
・Line ESP
・Loot ESP (回復系だけ日本語)
・Box ESP
・Distance/Name ESP
・Team ESP
・Health ESP
・Weapon ESP (面倒だから武器のモデル名のまま放置)
・Minimap Radar ESP

[WEAPON]
・No Recoil
・No Spread
・Instant Hit
・No Muzzle
・No Sway

[追加予定
・Bone ESP]
・Death Box ESP
・Crate ESP
・Visible Check

まあ正直今のままでも十分っちゃ十分だけど作れる所まで作りたい。


Bone ESPはGetBonePosition(BoneIndex) で各部位の座標取得して、
ProjectWorldLocationToScreen(WorldToScreen)でスクリーン座標に変換してDrawLineで繋げていけばいいだけ。


頭、首、胸、腰等の座標取得は、
ProcessEvent使えるなら、

pActor->GetSkeletalMeshComponent()->GetBonePosition(BoneIndex);

使えないなら、

Head: pActor->RootComponent->RelativeLocation.Z + pActor->BaseEyeHeight;
Neck: pActor->RootComponent->RelativeLocation.Z + pActor->BaseEyeHeight - (pActor->BaseEyeHeight / 4);
Body: pActor->RootComponent->RelativeLocation.Z + pActor->BaseEyeHeight / 2;
Waist: pActor->RootComponent->RelativeLocation;

とかで取れたりする。


で、ProcessEventのアドレスは、UEって殆どの処理がProcessEventの第一引数に実行関数のポインタが渡されて、第二引数にそのパラメーターのポインタが渡されて処理されるから、
常に実行されるような関数でも引っ張ってきて、ProcessEvent自体はUObjectのvirtual functionなので、call [ecx+XX] (ecx == this ptr) って感じで呼ばれるから、そのcall先のアドレスがProcessEventのアドレスになる。
で、ProcessEvent周辺からAob取ってSDK Generatorに入れればok


で各インスタンス取得方法だけど、Class::StaticClass(); するだけだと、
そのクラスのDefaultクラス?も含むっぽいから、Defaultクラスじゃないインスタンス返すようにすれば、わざわざFindPatternとかで取らなくても済む。


で、BattleEyeだけど結論から言えばBypassする必要は無い。


BEはドライバからPsSetCreateThreadNotifyRoutineでInject時に作成されるスレッドをTerminateThreadするから、Inject失敗する。
ObRegistersCallbacksとかいう奴で、プロセスハンドル隠してる。まあメモリプロテクションって奴


カーネルモードからのbypassは、PsSetCreateThreadNotifyRoutineにBEによって登録される通知関数のアドレスをどうにかして取得 -> PsSetCreateThreadNotifyRoutine内のメモリにPspCreateThreadNotifyRoutinとかいう配列があって、その配列から該当する通知関数をNULLにして、PspCreateThreadNotifyRoutineCountとかいう変数の値をデクリメントすればいいらしい。
ObRegistersCallbacksは知らん。コイツは放っておいてもプロセスハンドルとかどうにでもなるから、PsSetCreateThreadNotifyRoutineだけどうにかすればinjectは出来るらしい。
試してないから出来るかどうかは知らない


ユーザーモードからのbypassは、BEService.exe のNtReadFile, NtWriteFileフックして、BEDaisy.sysとのドライバメッセージからどうにかすればok
ドライバメッセージはつい最近暗号化されたので、復号化する必要がある


その他
cpuz等のドライバを用いてプロセスハンドルを取得して、thread hijack等でinjectする


ではまた