解析

2015年07月26日

サイファーテック

ゲーム系Webを見ていたら解析者の興味を引く記事を見つけました。
http://www.4gamer.net/games/999/G999905/20150714027/

なんか、セキュリティー会社がAVAチート問題などの事を語っている様です。
一般人が、この記事を読めばナルホドと思えるような内容なので有意義ではあると思います。

では、解析者目線ですとどうでしょう。
当然、サイファーテックのプロテクトがどんな物か試したくなりますよね。
で、いろいろ調べた結果、同人誌などを販売しているDLsiteのDLsite Viewerに
 スクリーンショット取得を防ぐためにサイファーテックのプロテクトが採用されている事がわかりました。

早速やってみましょう。
DLsiteで同人誌を購入しDLsite Viewerで開きます。
スクリーンショットが撮れるかな?

・PrintScreenキーを押す > ダメだって言うメッセージが出て取れない(泣)
・Windows標準のSnapping Toolを起動すると
 なんか変なウインドウがでてスクリーンショット撮れなさそう
 p3
・それでも無理に範囲を選択してスクリーンショットをとると
p2
丸ごと防がれた!!

どうやらしっかり仕事してそうですよ

PrintScreenキーを防ぐのを解除するのは、キーフックなどで簡単に出来るので
今回は捨て置き、スクリーンショット制御部分を解析しました。

 結論から言うと以下の感じです。

cguard.exe(ver 2.0.17.1、size 698,192Byte、64bit)のアセンブラ
ベースアドレスは0x140000000

14008F4AB - E8 34420000           - call 1400936E4
14008F4B0 - 4C 8B 4C 24 40        - mov r9,[rsp+40]
14008F4B5 - 4C 8B C0              - mov r8,rax
14008F4B8 - 49 8B D7              - mov rdx,r15
14008F4BB - 48 8B CB              - mov rcx,rbx
14008F4BE - E8 F9FBFFFF           - call 14008F0BC
14008F4C3 - 85 C0                 - test eax,eax
14008F4C5 - 74 55                 - je 14008F51C
14008F4C7 - F6 43 78 10           - test byte ptr [rbx+78],10
14008F4CB - 74 25                 - je 14008F4F2 //判定
14008F4CD - 41 BF 04000000        - mov r15d,00000004
14008F4D3 - 48 8B CB              - mov rcx,rbx
14008F4D6 - E8 29C2FFFF           - call 14008B704
14008F4DB - 0FBA E0 08            - bt eax,08
14008F4DF - 41 8D 47 01           - lea eax,[r15+01]
14008F4E3 - 44 0F42 F8            - cmovb r15d,eax
14008F4E7 - 41 8B D7              - mov edx,r15d
14008F4EA - 48 8B CB              - mov rcx,rbx //call 14009301Cの第一引数
14008F4ED - E8 2A3B0000           - call 14009301C //スクリーンショットを防ぎたいウインドウの上にウインドウを表示する
14008F4F2 - 48 83 7B 40 00        - cmp qword ptr [rbx+40],00
14008F4F7 - 74 23                 - je 14008F51C
14008F4F9 - C7 44 24 30 97000000  - mov [rsp+30],00000097
14008F501 - 83 64 24 28 00        - and dword ptr [rsp+28],00
14008F506 - 83 64 24 20 00        - and dword ptr [rsp+20],00
14008F50B - 45 33 C9              - xor r9d,r9d
14008F50E - 45 33 C0              - xor r8d,r8d
14008F511 - 33 D2                 - xor edx,edx
14008F513 - 48 8B CB              - mov rcx,rbx
14008F516 - E8 9DC5FFFF           - call 14008BAB8
14008F51B - 90                    - nop 
14008F51C - EB 2A                 - jmp 14008F548
14008F51E - 48 8B 9C 24 B0000000  - mov rbx,[rsp+000000B0]
14008F526 - 4C 8B 64 24 48        - mov r12,[rsp+48]
14008F52B - 48 8B 7C 24 50        - mov rdi,[rsp+50]
14008F530 - 44 8B B4 24 B8000000  - mov r14d,[rsp+000000B8]
14008F538 - 48 8B B4 24 C8000000  - mov rsi,[rsp+000000C8]
14008F540 - 44 8B AC 24 C0000000  - mov r13d,[rsp+000000C0]
14008F548 - 45 85 ED              - test r13d,r13d
14008F54B - 74 0D                 - je 14008F55A


140029590 - 48 89 4C 24 08        - mov [rsp+08],rcx
140029595 - 48 83 EC 38           - sub rsp,38
140029599 - 48 8B 44 24 40        - mov rax,[rsp+40]
14002959E - 48 89 44 24 28        - mov [rsp+28],rax
1400295A3 - C7 44 24 20 02010000  - mov [rsp+20],00000102
1400295AB - 81 7C 24 20 02010000  - cmp [rsp+20],00000102
1400295B3 - 75 39                 - jne 1400295EE //判定
1400295B5 - 48 8B 4C 24 28        - mov rcx,[rsp+28] //call 1400288E0の第一引数
1400295BA - E8 21F3FFFF           - call 1400288E0 //デバイスコンテキストのガード
1400295BF - 33 D2                 - xor edx,edx
1400295C1 - 48 8B 4C 24 28        - mov rcx,[rsp+28]
1400295C6 - 48 8B 89 C0000000     - mov rcx,[rcx+000000C0]
1400295CD - FF 15 E5820E00        - call qword ptr [1401118B8] : [kernel32.WaitForSingleObject]
1400295D3 - 89 44 24 20           - mov [rsp+20],eax
1400295D7 - 81 7C 24 20 02010000  - cmp [rsp+20],00000102
1400295DF - 75 0B                 - jne 1400295EC
1400295E1 - B9 64000000           - mov ecx,00000064
1400295E6 - FF 15 AC820E00        - call qword ptr [140111898] : [kernel32.Sleep]
1400295EC - EB BD                 - jmp 1400295AB
1400295EE - 33 C0                 - xor eax,eax
1400295F0 - 48 83 C4 38           - add rsp,38
1400295F4 - C3                    - ret 
1400295F5 - CC                    - int 3 
1400295F6 - CC                    - int 3 
1400295F7 - CC                    - int 3 
1400295F8 - CC                    - int 3 
1400295F9 - CC                    - int 3 
1400295FA - CC                    - int 3 
1400295FB - CC                    - int 3 
1400295FC - CC                    - int 3 
1400295FD - CC                    - int 3 
1400295FE - CC                    - int 3 
1400295FF - CC                    - int 3 

この辺を弄ると
p1
スクリーンショットが撮れるようになるかもしれない
技術的保護手段解除問題もあって断定する表現は使えない
画像はイメージです。実際のSSではないです

お縄になるので解除ツール、すぐに解除出来るような情報の記載は
残念ながらできません。
しかし自分で解析する分には合法なので興味のある方は
この部分の処理を追いかけてみてはどうでしょうか。

とりあえず解析してみましたが特に難しくなく温い感じです。
はっきり言って韓国製プロテクタの足下にも及びません。
このレベルでは法律で守られている日本国内で商売するのがやっとでしょう。
コピーが横行しているアジア圏ではノーガードと同義です。

技術的保護手段(ここではスクリーンショット制限)についても
Windowsが提供する機能を阻害するような実装で
ファイル自体(購入した漫画)に技術的保護手段がかかっている訳ではありません。
そういう意味で本来の技術的保護手段とは違って法をすり抜けられるかと思いましたが
同機能を持つコミスケ3を売ってた奴逮捕されてたのね、知らなかった。 


unvirus at 00:41|PermalinkComments(47)TrackBack(0)

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)

2013年06月29日

APIモニター

ネタが無いのでツール紹介で記事を水増しですよ
体験版の制限解除などでは、デバッガでアセンブラを追いかける前に
WinAPIの呼び出しを抽出してある程度の当たりをつける場合が多いです。
今回紹介するのは、WinAPI呼び出しを丸ごと吸い出せるツールとなります。

http://www.rohitab.com/apimonitor

実行方法は
・ツールを起動
・キャプチャーしたいAPIをチェック
・対象のアプリを起動
・キャプチャーするか聞かれるのでキャプチャーする

以上です。
ReadProcessMemory、WriteProcessMemory
Socket通信内容もキャプチャーするので、ゲームの解析にも利用できます。
チート防止機能が無ければの話ですが・・・



unvirus at 16:57|PermalinkComments(5)TrackBack(0)

2013年02月07日

pso2 サポートツール

pso2 サポートツールの元をつくってみました。
より細かい状況でのオートワードや使い勝手の良いチャット機能などを
実装出来るかもしれません。
pso2 サポートツール自体は何の機能も持ちません。(チート機能もありません)
APIとして機能を提供するだけなので、何をやるのもユーザー次第です。
現状はベータ版ですし、CやC++でプログラムできる方で無いと使い道はありませんので
無条件に公開はしません。
プログラム組んでみたい方はskypeまで。
ちょっとチャットして、使いこなしてくれそうな方に只でわたします。



unvirus at 00:35|PermalinkComments(30)TrackBack(0)

2012年09月15日

VAIO TV with nasneの解析4

VAIO TV with nasneの制限を外すツールを置いておきます。
ただ、現状では安定性などがα版以下の完成度です。
nasneのファームをver1.51にしたせいか、使用している環境のせいか分かりませんが
開発PCで はVAIO TV with nasneの録画視聴がまともに動かない状況です。
2-3分で例外落ちします。
ほぼ同じ環境のテストPCとMACでは、視聴できる状況です。

nasneのファームはダウングレードできませんので
現状で安定している環境であるならば、そのまま利用するのをお勧めします。 
ツール自体は ver1.50+初版の VAIO TV with nasne でも動作すると思います。

http://members.jcom.home.ne.jp/alpa001/Blog/Bin/vldr_0915.zip
間違えて、失敗作をUPしてしましました。

http://members.jcom.home.ne.jp/alpa001/Blog/Bin/vldr_0915_2.zip
こちらが正しいです。

追記;品質が悪いので、暇だからテストしてみても良いかなって
感じの方のみ使ってください。

あと、自分で作ったほうが性能良いのできるし早いって方向け

認証処理は
IWbemClassObject::Get を乗っ取って"Sony Corporation"を返せばOKです。

画面制限は
GetMonitorInfoWで得ていますので、ここで偽サイズを返せばOKです。

PrintScreen制限は、一般的な方法である
SetWindowsHookExでやっています。

正規のVAIOユーザーで、画面のサイズ制限とPrintScreen制限のみ外したいという
ご要望に応えて、VAIOチェック外し機能を外した物をUPしておきます。
さすがに、これは法的問題に引っかかることは無いと思うのです。
http://members.jcom.home.ne.jp/alpa001/Blog/Bin/vldr_0923_1.zip
 



unvirus at 16:19|PermalinkComments(51)TrackBack(0)