CSGOをチートしよう!チート対策を回避!?


CSGO、正式名称はCounter-Strike: Global Offensiveで一人称視点のシューティングゲームです。今回はこのゲームをチートする方法をご紹介します。この記事の内容通りにすれば対策を回避しながらチートできるはずです。現在、steamで無料でプレイできるので興味のある方はやってみてください。


2022年8月17日 追記:
対策されたようです。このチートをオンラインで使用すると高確率でBANになります。詳細は以下のリンクをご参照ください。

https://github.com/dretax/GarHal_CSGO/issues/109


CSGOには以下の2つのチート対策がされています。


Valve Anti-Cheat(VAC)
ユーザーモードで動作するチート対策ソフト。検出方法は様々ですが、主にバイトパターン検索が使用されているようです。VACで保護されているサーバーに接続しているとき、既知のチートソフトを使用しているとパターンが一致し、BANになります。

OverWatch
疑わしいプレイヤーの対戦が録画され、Investigatorと呼ばれる調査員がチートしているか否かの判決をくだし、黒だった場合アカウントがBANになります。チートを多用しすぎて、人間技とは思えないプレイを連発していると危険です。


注意:
オンラインではテストしておらず、本当にVACを回避できているか確証はとれていません。オフラインでのBOT対戦で動作確認をしただけです。そのため、何らかの手違いが発生し、アカウントがBANになる可能性がありますので、そのリスクを受け入れたうえで自己責任で使用してください。


今回のチートでできること

・Driver Hiding (Kill Patchguard before use) @JKornev

・Process Hiding (Kill Patchguard before use) @landhb

・Simple glow Wallhack

・Highlights defuser

・No flash

・Aimbot

・Smooth aimbot

・TriggerBot - Supports randomized delay.

・Another simple program to Display Ranks (Work in progress)

・Displays enemies on the Radar

・Bunny hop

・OBRegisterCallback to limit access to the GarhalController.exe & GarhalRankDisplayer.exe (Read VAC section)

VAC Bypassのイメージ図


必要なツール

GarHal_CSGO - 今回のメインになるCSGOをチートするためのプログラム、VC++のソースコード

https://github.com/dretax/GarHal_CSGO


Visual Studio Community 2019 - GarHal_CSGOをビルドするために使用するIDE

https://visualstudio.microsoft.com/ja/vs/community/


Windows Driver Kit (WDK) & SDK - ドライバーを開発するために必要なライブラリ

https://docs.microsoft.com/ja-jp/windows-hardware/drivers/download-the-wdk


Haze-Dumper v2.4.1 - CSGOからアドレスとオフセットを抽出するプログラム

https://github.com/frk1/hazedumper

https://www.unknowncheats.me/forum/counterstrike-global-offensive/169351-haze-dumper-json-config-based-offset-dumper.html


環境

Windows10 HOME 2004 19041.867 64bit


ダウンロード & インストール方法

GarHal_CSGO


Codeボタンをクリックし、Download ZIPを選択してダウンロード。
解凍したファイルは、 C:\GarHal_CSGO-masterにあると仮定して進めていきます。




Visual Studio community 2019


C++によるデスクトップ開発をチェックしてから、個別のコンポーネントを選択します。



画像赤枠のMSVC v142 ... 軽減ライブラリ(最新)をチェックし、右下の変更をクリック。
これでVisual Studioのインストールは完了です。




Windows Driver Kit (WDK) & SDK


赤枠部分をクリックしてSDKとWDKをインストール。
これでドライバをビルドする環境が整いました。


CSGOの設定

念のため、CSGOをinsecureモードに変更しておきましょう。
Steamを起動し、赤枠のライブラリをクリック。



左にあるゲームリストから、CSGOを右クリックしてプロパティを選択。



一般タブの下のほうにある起動オプションに -insecure と入力します。



これでVACで保護されているサーバーに接続できなくなりました。
VACを無効にしたわけではないので、その辺は注意が必要です。


Haze-Dumperで最新のオフセットを抜き出す

まずこちらのサイトにアクセスし、exeファイルをダウンロードしましょう。



次にこちらのサイトからconfig.jsonをダウンロードします。



config.jsonをクリック


画面右端にあるRawをクリック



右クリックから名前を付けて保存を選択し、config.jsonをダウンロードします。


ダウンロードできましたら、hazedumper-v2.4.1.exeと同じディレクトリにおいてください。
そうすると↓画像のようになったと思います。



CSGOを起動し、 bot対戦を開始してから、hazedumper-v2.4.1.exeを実行します。


これでオフセットが自動で抜き出されました。 hazedumper-v2.4.1.exeと同じディレクトリにcsgo.hppがあるので、これをテキストエディタで開いてください。



次にプロジェクト内のオフセットを更新します。
管理者モードでVisual Studioを起動し、C:\GarHal_CSGO-master\Garhal.slnを開きましょう。



画像の赤枠にoffsets.hppと入力し、目的のファイルを検索します。
GarhalControllerとGarhalRankDisplayerに1つずつありますね。
この2つをダブルクリックして開いてください。


先ほど開いておいたcsgo.hppにnamespace netvarsと記載があると思います。
先頭のnの左にカーソルを置き、Ctrl + Shift + Endキーを押し、Ctrl + Cでコピーします。
その状態でVisual Studioに移りましょう。


offsets.hppにもnamespace netvarsと記載がありますよね。
同じように先頭のnの左にカーソルを置き、Ctrl + Shift + Endキーを押し、Ctrl + vで張り付けます。
これで最新のオフセットに更新できました。


offsets.hppはGarhalControllerとGarhalRankDisplayerの合計2つあるので、2つとも同じ手順で更新しておきましょう。
わかりにくいと思うので、こちらに動画を用意しました。



右が更新前、左が更新後です。
画像のように、ほとんどのアドレスが変わっていることがわかります。
これで最新のオフセットに更新され、ビルドの準備が整いました!


Visual Studioでビルドしよう

今回ビルドするプロジェクトは以下の3つです。
・Garhal - カーネルドライバー。CSGOのメモリの読み書きを担当
・GarhalController - ドライバーに対して指示を送る、ユーザーモードで動作するプログラム
・GarhalRankDisplayer - ランキングを表示するプログラム


それでは始めていきましょう。
まず、ビルド構成をDebugからReleaseに変更してください。



このままビルドするとエラーが出るので、それを修正します。
画像の赤枠にhide.cと入力し、ダブルクリックして開いてください。



紫字が変更箇所です。


1行目、#pragma warning...の最後に 6001 6387) と6387を付け足します。
8行目、LPSTR result = ExAllocatePool 2(NonPagedPool, 2 * sizeof(ULONG) + 30,'Tag1');


これで一度ビルドします。
メニューバーのビルドからソリューションのビルドをクリック。



ここで下記画像のようにエラーが出ると思うので、赤枠をダブルクリックしてntos.hを開き、
Ctrl + Sを押し上書き保存します。出来ましたら、もう一度ビルドしてみましょう。




これでようやくビルドが成功しました。
ビルドが終わるとC:\GarHal_CSGO-master\x64\Releaseに以下の3つのファイルが作成されます。
今回使用するのは上の2つだけです。


・Garhal.sys
・GarhalController.exe
・GarhalRankDisplayer.exe


チートの設定を変更しよう

C:\GarHal_CSGO-master\GarhalController\garhal.cfgを GarhalController.exeと同じディレクトリ
C:\GarHal_CSGO-master\x64\Releaseにコピーしてください。
garhal.cfgが設定ファイルになるので、これをテキストエディタで開き、自分好みに変更できます。


ここではひとまず以下の設定を変更してみました。左の数字は行数です。
2.Aimbots = 2
4.AimbotKey = 0x43
6.Aimbot Target = 1
26.Radar = True


セキュアブートを無効にする

まずお使いのパソコンでセキュアブートが有効になっているかを確認します。
Windowsキー + R を押し、msinfo32と入力後、OKをクリックしてください。



そうすると↓画像のようにシステム情報が表示されるので、検索文字列にブートと入力し、
次を検索をクリックしてセキュアブートの状態を確認します。



セキュアブートはBIOSの設定から無効にできます。
BIOSの起動方法はパソコンによって違うので、説明書を見たり、サポセンに電話するなりして調べてください。


参考画像


Enabled -> 有効
Disabled -> 無効


セキュアブートはセキュリティ上必要な機能のため、どこかのタイミングで有効に戻しておきましょう。


ドライバーを起動してチートを有効にしよう

セキュアブートを無効にできたら、次はドライバーをインストールします。
まず、windowsキー + Rを押し、cmdと入力したあと、Ctrl + Shift + Enterで管理者としてコマンドプロンプトを起動しましょう。
次に、下記のコマンドを実行し、テストモードをオンにします。


bcdedit /set testsigning on



この時点でセキュアブートを無効にしてないと、上のコマンドを実行したとき、エラーが出ます。
ここで一度コンピュータを再起動してください。そうするとデスクトップの右下にテストモードがオンになったことを知らせる表記があると思います。



再び管理者としてコマンドプロンプトを起動して、下記のコマンドを実行します。


sc create garhal type= kernel binpath="C:\GarHal_CSGO-master\x64\ReleaseGarhal.sys"



sc start garhal



これでドライバーが起動しました。
この状態でCSGOを起動し、GarhalController.exeを実行すれば設定したチートがオンになります。



ドライバーを停止させるには下記のコマンドを入力します。


sc stop garhal



ゲームを終了した後は、念のためドライバを停止しておきましょう。
起動し続けていると何らかの不具合が起き、OSが強制終了になる可能性があります。


最後に下記のコマンドを実行して、テストモードをオフにします。


bcdedit /set testsigning off



POINT

テストモードをオンにするのは無署名のドライバーをインストールするためです。インストールしてしまえば次回からはテストモードにする必要はなく、そのままsc start garhalとして起動できます。


まとめ

今回のキーになるのはユーザーモード、カーネルモード間をどのようにして通信しているかです。DeviceIoControlというWinApi関数でドライバーにコントロールコードとデータを送り、それを受け取ったドライバーが要求された指示を実行しているということです。例えば、コントロールコードがIO_READ_REQUESTなら指定されたプロセスのメモリを読み取り、IO_WRITE_REQUESTなら指定されたメモリに値を書き込みます。コントロールコードは開発者が定義し、またそれを受け取ったドライバーが何を実行するのかも自分で実装できます。このあたりを紐解いていけば全貌が見えてくると思うので、ぜひソースを読み込んでみてください。


参考リンク
誰でもわかるデバイスドライバ講座
Practical Reverse Engineering.pdf


関連記事

7 Comments

abc

刀神のCheat Engineを使用したチートについて

掲載された記事とは全く関係ない話で申し訳ありませんが刀神のCheat Engineを使用したチートについて
もし似たような経験や助言なりあればと思い投稿させてもらいました
私自身は改造に関しては検索して値を書き換えるしかやったことのないほぼ素人です
刀神なのですが、ダッシュしたりすると減るスタミナなようなもので活力というものがあります
一時的なアドレスの特定はダッシュ変動前後の4byteの整数値検索で容易にできます
上のアドレスに対し書込みブレークポイントを仕掛け命令を特定し最大値へ書き換えるコードの作成もして動作確認もできたのですが
ゲームを再起動すると上記コードのチェックボックスが有効化できなかったため、直接アドレスを確認したら全く別の内容になっていました
上記の活力書込み命令をバイト列検索すると全く別のアドレスになっていました
書き換えた内容は具体的には
20A02D5BB4E - 48 63 88 84000000 - movsxd rcx,dword ptr [rax+00000084]
20A02D5BB55 - 2B CE - sub ecx,esi
20A02D5BB57 - 89 88 84000000 - mov [rax+00000084],ecx
から
20A02D5BB4E - 48 63 88 84000000 - movsxd rcx,dword ptr [rax+00000088] ;活力最大値の読取
20A02D5BB55 - 90 90 - nop
20A02D5BB56 - 90 90 - nop
20A02D5BB57 - 89 88 84000000 - mov [rax+00000084],ecx
のような感じに書き換えました
再起動後に、20A02D5BB4Eを見ても全く別の内容で、バイト列検索したところ全く別のアドレスになっていました
アドレスが絶対値表示になっており、exeやdllなどからの相対アドレスではありません
刀神のインストールデータ群に対して上記のバイト列でグレップを掛けても該当するファイルはありません
刀神はおそらくUnityを使用しています
Unityは全く知らないのですが、何かしらのスクリプトや中間言語を実行時にネイティブに翻訳でもして動的に配置しているのでしょうか?
この動的に変わるアドレスを解決する手段や助言などあればお願いいたします

  • 2021/04/18 (Sun) 19:02
  • REPLY

-

To abcさん

アドレスが変わっているだけならAOBで対応出来そうなものですが、それも無理なのでしょうか?

  • 2021/04/20 (Tue) 10:53
  • REPLY

Nameless

abcさんへ:
刀神のCTを作成したことがあるので助力します。

”Unityは全く知らないのですが、何かしらのスクリプトや中間言語を実行時にネイティブに翻訳でもして動的に配置しているのでしょうか?”
その通りで刀神はmonoを使用しJITコンパイルされています。なので他のゲームでよく使われているaobscanでは確実性が保証されません。

”この動的に変わるアドレスを解決する手段や助言などあればお願いいたします”
詳細を省いて結論から言うと、"Mono Features"と"aobscanregion"または"assert"による解決手段があります。
あなたが書いたコードを記載してくれればより詳細に助言できると思います。

管理人さんへ:
DiscordにCTまたはzipを添付できますか?できるなら刀神のCTを提供したいと思います。

  • 2021/04/20 (Tue) 18:56
  • REPLY

abc

To Namelessさん

お返事ありがとうございます

また記事と無関係な件で長々と投稿して申し訳ありません

Cheat Engineも検索以外で使ったのが初めてで、-さんに助言いただいたAOBさえ知らなかったのですが
AOB Injectionというのがあったので押して活力変動で最大になるようにとりあえず勘で作ってはみたものが以下になります
マニュアルなど土日に読み込んでみます

このコードで気になる点としては
・JITコンパイルのため、ダッシュなどして一度コードをメモリ展開させるまで有効にできないこと
・再コンパイルされて別のアドレスにロードされることはないのか(短時間使用している分には問題なかった)
・INJECTION POINTへのジャンプ命令の命令サイズがジャンプ距離により変動することがあり想定通り命令を書き換えられないことがある(allocサイズを見直したら少しは安定する?)

[ENABLE]

aobscan(INJECT,48 63 88 84 00 00 00 2B CE 89 88 84 00 00 00) // should be unique
alloc(newmem,$1000,1FB8CD62CBE)

label(code)
label(return)

newmem:

code:
movsxd rcx,dword ptr [rax+00000088]
mov [rax+00000084],ecx
jmp return

INJECT:
jmp newmem
nop
return:
registersymbol(INJECT)

[DISABLE]

INJECT:
db 48 63 88 84 00 00 00 2B CE 89 88 84 00 00 00

unregistersymbol(INJECT)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: 1FB8CD62CBE

1FB8CD62C97: F2 0F 59 C1 - mulsd xmm0,xmm1
1FB8CD62C9B: F2 0F 2C F0 - cvttsd2si esi,xmm0
1FB8CD62C9F: 48 8B 47 60 - mov rax,[rdi+60]
1FB8CD62CA3: 48 63 80 84 00 00 00 - movsxd rax,dword ptr [rax+00000084]
1FB8CD62CAA: 85 C0 - test eax,eax
1FB8CD62CAC: 40 0F 9F C0 - setg al
1FB8CD62CB0: 48 0F B6 C0 - movzx rax,al
1FB8CD62CB4: 85 C0 - test eax,eax
1FB8CD62CB6: 0F 94 45 D7 - sete byte ptr [rbp-29]
1FB8CD62CBA: 48 8B 47 60 - mov rax,[rdi+60]
// ---------- INJECTING HERE ----------
1FB8CD62CBE: 48 63 88 84 00 00 00 - movsxd rcx,dword ptr [rax+00000084]
// ---------- DONE INJECTING ----------
1FB8CD62CC5: 2B CE - sub ecx,esi
1FB8CD62CC7: 89 88 84 00 00 00 - mov [rax+00000084],ecx
1FB8CD62CCD: 48 8B 47 60 - mov rax,[rdi+60]
1FB8CD62CD1: 48 63 80 84 00 00 00 - movsxd rax,dword ptr [rax+00000084]
1FB8CD62CD8: 85 C0 - test eax,eax
1FB8CD62CDA: 0F 8F 39 00 00 00 - jg 1FB8CD62D19
1FB8CD62CE0: 48 8B 47 60 - mov rax,[rdi+60]
1FB8CD62CE4: C7 80 84 00 00 00 00 00 00 00 - mov [rax+00000084],00000000
1FB8CD62CEE: 0F B6 45 D7 - movzx eax,byte ptr [rbp-29]
1FB8CD62CF2: 85 C0 - test eax,eax
}

  • 2021/04/20 (Tue) 19:55
  • REPLY
ちーたー

なんでもチート

To Namelessさん

管理人のちーたーです。
ぜひDiscordをご利用ください。
画面右のお知らせにサーバーのURLがあります。
CTやノウハウを提供して頂けると助かります。

  • 2021/04/20 (Tue) 20:26
  • REPLY

abc

To Namelessさん

ご助言いただいた通りMono Featuresを利用して無事問題解決することが出来ました
1発目からちょっと特殊だったのかもしれませんが本当に助かりました
どうもありがとうございます

管理人様へ:
関係ない件で利用させていただきありがとうございました

  • 2021/04/20 (Tue) 20:44
  • REPLY
ちーたー

なんでもチート

To Namelessさん
https://dl.dropboxusercontent.com/s/7cf08b1um3v0ga1/Image1618921241.png
Discord使い始めたばかりなんですが、画像赤枠から添付できました。

To abcさん
解決できたようでよかったです!
Mono Featuresは触ったことがなく、また何らかのゲームでテストしてみようと思います。

  • 2021/04/20 (Tue) 21:33
  • REPLY