チート

2013年11月17日

BattleField4

久しぶりの更新です。
お題は一週間ぐらい前に日本で発売されたBattleField4のチートについてです。
まずはEXEについて、BF4のゲームプログラムは32bit版と64bit版があり
ゲームをインストールすると両方のEXEがインストールされます。
*64bitOSの場合だけかもしれません。64BitOSユーザーは両方のEXEでゲームが出来ます。

外人は64bit版をいじくり回しているようですが、私は64bit用の解析ツールを
あまり持ってないので、32bit版を改造します。

EXEはパックされていますが解析防止機能が強い訳でもないので
アンパックなどせずそのまま解析できます。
普通にゲームを起動してollyなどでアタッチして解析します。

ゲームガードはPunkBasterです。
PunkBasterはザル過ぎなので、これも基本は無視でよいのですが
こいつは、解析途中にしくじって一回でも引っかかると問答無用でBANされる可能性があります。
ザルプロテクタだが、失敗できないという点で厳しいかと思います。

じゃあ、どうやって解析するのよって思ったことでしょう。
BF4はシングルプレイモードがあり、EXEが同じなのでほとんどの処理が
シングル・マルチプレイで共有となります。
このため、PunkBasterが効いていないシングルプレイで解析するのがよいです。
シングルプレイで解析したものを、自作DLLにでもして
マルチプレイで使用すればOKです。

PunkBasterのチェックは以下です。
・モジュールのシグネチャー
  アンチウイルスソフトと同じでパターンマッチするものを検出する
  一般公開されてないチートは安全
・DirectXインターフェースのチェック
  WHなどでDirectXインターフェースがフックされていないかをチェックする
  DirectXインターフェースのポインタがDirectXモジュールのアドレスかはみ出ていなければOK
・EXEの指定アドレスのMD5確認
  PBが指定したアドレスの範囲のMD5が正しいかをチェックしプログラム領域の書き換えを検出する
  チェック範囲のjmpをnopにしたりするとMD5が変わるので引っかかる
  11/17時点ではチェック範囲は限定されているようです
  定義ファイルは、ゲームをインストールしたフォルダの\pb\htmにある、*.htmです。
  定義ファイルは不用意に書き換えてはいけません。
  範囲の読み出しは、ReadProcessMemoryとドライバ経由の2通り
  ドライバ経由の読み出しはメモリアクセスブレークポイントでは引っかからない
・スクリーンショット
  プレイ中のゲーム画面を勝手にサーバーに送るよ
  スクリーンショットを撮る範囲は画面の中央、デフォルトでは320*240
  BF4ではDirectXのバッファから取得しているらしい(未確認)

こんなもんです。
ワークメモリやプログラムコード中の再配置でアドレスが変わる部分は
チェック対象でないので、まあなんとかなると思いますよ。

テスト中のSSを貼っておきます。
ScreenshotWin32-0003

ScreenshotWin32-0002

アセンブラを、詳しく読めていないので処理関数の先頭アドレスだけおいておきます。

11/17現在
00645DD0 車両タグ
007BE240 プレイヤーダグ
00C513F0 リコイル
00C532D0 リロード

01195A9E 83BE F4080000 00 CMP DWORD PTR DS:[
ESI+8F4],0 
ESI+8F4がシングルプレイ時の自分の陣営、0が中立、1がアメリカ、2が敵
ここを変えたりしながらタグとかの処理を追うのがよいかも
自分の陣営を変えるとタグの色が変わったりします。
ミニマップはタグを表示させると連動して表示されるようです。とくに何もしないでOKでした。

私は未だ、この程度の状況ですが外人はすでにAutoAimを実装し始めています。
まじ半端ねえ!!! 

unvirus at 18:56|PermalinkComments(20)TrackBack(0)

2012年12月21日

ガンダムオンライン

こんばんは、ブログネタが無いので
12/22の午後、余裕があればオープンベータが開始された
ガンダムオンラインとか言うゲームをプレイしてみます。 
チート防止機能はガメポプロテクターらしい。
livetube.cc/unvirusで配信予定

ガンダムオンラインのCheatEngineチェックっていうか
No.125か025だったかのエラー判定部分
下記は、最新バージョンのEXEではないですが
最新版のクライアントでもたぶん大して変わってないと思うので
アドレスずらしでいけるんじゃね?
私はIPBAN食らったので、最新版では確認してません。
まあ、ルーターを含めてMACアドレス変えれば良いだけだと思いますが・・・

009667C0 A1 3C0CC700 MOV EAX,DWORD PTR DS:[C70C3C] 009667C5 85C0 TEST EAX,EAX 009667C7 75 01 JNZ SHORT GundamOn.009667CA 009667C9 C3 RETN 009667CA 8B4C24 04 MOV ECX,DWORD PTR SS:[ESP+4] 009667CE 8B10 MOV EDX,DWORD PTR DS:[EAX] 009667D0 8911 MOV DWORD PTR DS:[ECX],EDX 009667D2 8B50 04 MOV EDX,DWORD PTR DS:[EAX+4] 009667D5 8951 04 MOV DWORD PTR DS:[ECX+4],EDX 009667D8 8B48 08 MOV ECX,DWORD PTR DS:[EAX+8] 009667DB 85C9 TEST ECX,ECX 009667DD 890D 3C0CC700 MOV DWORD PTR DS:[C70C3C],ECX 009667E3 75 06 JNZ SHORT GundamOn.009667EB 009667E5 890D 400CC700 MOV DWORD PTR DS:[C70C40],ECX 009667EB 50 PUSH EAX 009667EC E8 0F000000 CALL GundamOn.00966800 009667F1 83C4 04 ADD ESP,4 009667F4 B8 01000000 MOV EAX,1 //MOV EAX,0とでもすれば良い
009667F9 C3 RETN


書き換え後はCheatEngineが使えます。
よくわかりませんが、ガメポプロテクトってこんなに緩いのでしょうか。
ベータ版だから特別に非常に緩くしているという可能性の方が高いですね。 


unvirus at 21:10|PermalinkComments(27)TrackBack(0)

2012年10月27日

DLLを使用しないコードインジェクト

昨今のチートでは、対象アプリに自作DLLをインジェクトして
いろいろ都合が良いように、自作DLL経由でアプリの操作を行うという
手法が流行っています。
ゲームにはチート防止機能がありますが、チート防止機能が有効になる前に
自作DLLをインジェクトすることで、容易にチート防止機能をすり抜けることができ
かつ、DLL自体の作成にはさほど技術力を必要としないので
どのゲームのチートでも専用DLLを使うみたいな流れになっています。
自作DLLは扱いが楽で個人で利用するには便利なのですが
公開する場合はどうでしょうか
インジェクトするDLLが丸わかりなので、DLL名とサイズをチェックするだけで
簡単に検出されてしまいます。これでは配布に耐えません。

今回の記事は、配布に耐えるツールの初期版としてDLLを使わない
コードインジェクトのサンプルを載せます。
DLLを使わないので配布は1つのファイルだけですみシンプルです。

このサンプルは、ターゲットアプリの任意(毎回違う)アドレスに
ハックコードを挿入する物です。
DLLではないので、検出側は全メモリを総なめにチェックするか
このサンプルであれば、API呼び出しを検出するかでしか検出できないと思います。
ソースはVisualStudio2010で作成しています。

コードの仕組みはソースを読んでいただく方が良いと思いますので
ここでは説明しません。

使い方は
1.ソースをビルド
2.できあがったバイナリを実行
3.電卓を起動 
 64bitOSの方は32bitのcalc.exeを利用してください。サンプルは32bit用です。
 この時点ですで電卓にハックコードがインジェクトされているはずです。
4.電卓画面でPageUpキーを押すと
 インジェクトしたコードがメッセージボックスを表示します。

 http://members.jcom.home.ne.jp/alpa001/Blog/Src/XInject_Base.zip





unvirus at 14:37|PermalinkComments(40)TrackBack(0)

2012年08月11日

PSO2パケット

PSO2に限ったことではありませんが、Windowsのアプリケーションでは
一般的に公開されている暗号方式の利用は、ほとんどの場合でWindowsが提供している
ライブラリを利用しています。
このため、高度な数学が出来なくとも簡単に暗号の利用ができ、とても便利なのですが
ライブラリ自身のAPIが公開されているため、解析が容易になるというリスクもあります。
もちろん、鍵がバレなければ ライブラリ自身のAPI が解っていても一般人(私を含めて)では
暗号の解読はほぼ不可能ですので問題無いのですが、ゲームパケットの暗号化に利用するような
場合では、 Windowsが提供しているライブラリを使用すると、自前で暗号化処理を組むより簡単に
暗号の解読が出来てしまします。

たとえば暗号化されたメールの暗号解読をする場合、鍵が必要になります。
あたり前ですが鍵は、そのメールに含まれている訳はありませんし、そもそもネットで鍵を交換して
いないかも知れません。 結果的に鍵の受け渡し方法が解らないので鍵を得る事が出来ません。
ゲームはどうでしょう、サーバーとクライアントが暗号通信するためには鍵が必要になるので
必ず鍵の受け渡しが行われるはずです。
受け渡しが行われない場合はクライアントに元から鍵か組み込まれていると予想できます。
まとめますと、メールの暗号解読と違うのは、メールのようにデータのみ与えられた状態で
暗号解読に望むのでは無く,ゲームでは鍵の交換から解析を行えるという点です。

重要なのは暗号を利用するために、鍵の生成または受け渡しを行う部分です
この部分は、解析でつけ込む事が出来る最も簡単かつ効果的な部分です。
なぜならAPIが公開されているから。
http://msdn.microsoft.com/en-us/library/windows/desktop/aa380252(v=vs.85).aspx 
クライアントに組み込まれている鍵を利用する場合は
CryptImportKeyを利用すると思われますし
サーバーに鍵を通知するには鍵を取り出すためにCryptExportKeyを呼ぶことでしょう。
ここにブレークを張れば、あら簡単、鍵が手に入ります。
*公開鍵方式の場合は公開鍵か秘密鍵かで扱いが異なります。

もっと手抜きをしたいのであれば、CryptEncryptとCryptDecryptを監視して
入出力されるデータを弄ればいいだけです。

CryptEncrypt に入る前のpbDataが暗号化前のデータで
CryptEncrypt から戻ったときの pbData が暗号化後のデータです。
CryptDecrypt に入る前のpbDataが暗号データで
CryptDecrypt から戻ったときの pbData が複合化後のデータです。 

このように、暗号の知識がなくともパケットの中身を見るのは馬鹿みたいに楽ちんです。
PSO2の解析メモも置いておきます。
http://members.jcom.home.ne.jp/alpa001/Blog/Src/pso2crypt.zip

Windowsが提供する暗号ライブラリを利用するアプリはどれも同じような物だと思います。
暗号関係の処理をちょろまかしたい場合に、この記事が多少なりとも役立てば幸いです。

おまけ 0905版
Sc_376060
Sc_376094 速度調整機能付き
Sc_376211 XPも対応?版 機能追加は無し、 Sc_376094 が利用できる方は更新の必要なし

EXEのサイズが小さくなりました。
これはパッカーを変えたためです。
不安ならば実行しないことをおすすめします。 

他の場所(掲示板など)でunvirusの名前で書き込みをしたりツールをUPすることは
しませんので、注意してください。 



unvirus at 15:59|PermalinkComments(49)TrackBack(0)

2012年07月07日

PSO2 チート

こんにちは、私は暇を見つけては正式サービス開始された
PSO2の解析をしています。

まだnProを外しただけですがメモをおいておきます。
1.nProはサーバー同期型、正しくキーを返さないとログインできない。
  ずっと待たされる。
2.ゲーム中にも5分-10分おきに同期キー通信が来る
   同期キー 通信間隔が長いので、切断覚悟でクラの検知をごまかせば数分はチート可能。
3.ゲームパケット暗号方式はコードを追った感じからするとRSA
  公開鍵方式なので、パケットを途中で抜いて加工は技術的に難しいですが
  マイクロソフトの暗号ライブラリをまんま使用しているので、送信パケットの暗号前、
  受信パケットの複合化後をぶんどれば良いと思う。
  
  Botがつくりにくい・・・

ログイン時に流れるデータ24ByteのパケットがnProキー
0000   8c f2 fa 2e 99 be 64 fb 1b da 78 97 32 e5 ae 69  ......d...x.2..i
0010   57 62 5a b1 1d 65 5d b0  
丸ごと暗号化されているのでそのままでは使えない

  


unvirus at 17:35|PermalinkComments(2)TrackBack(0)