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│Comments(47)TrackBack(0)解析 

トラックバックURL

この記事へのコメント

1. Posted by ko   2015年07月27日 10:43
fpsでNorecoilを作ってみたいのですがどういう感じでつくるんですか
2. Posted by unvirus   2015年07月27日 22:49
私がやるなら

☆簡単な場合
・武器名、弾数などメモリサーチしやすい物をまず探す
・見つかったら、その周辺のメモリで数値っぽいのを適当に書き換えて
武器性能が変わるか試す
・もしコレでリコイル値が見つかったら、ココにメモリアクセスブレークポイントを
貼って射撃を行うとブレークするので
そこがリコイル制御とわかる
・該当箇所のアセンブラを書き換えてリコイル無しにする

☆難しい場合
・武器名、弾数などメモリサーチしやすい物をまず探す
・見つかったら、その周辺のメモリで数値っぽいのを適当に書き換えて
武器性能が変わるか試す
・全く変化なしだった
・弾数にメモリアクセスブレークを貼って射撃すると、ブレークする
・ブレークした部分は弾数の表示を減算する部分だと予想できる
・弾数も射撃処理の一部なので周辺のアセンブラをひたすら読んで
運良くリコイル処理にたどり着ければノーリコイルチートが出来る
3. Posted by rm   2015年08月01日 23:56
アセンブリを勉強するのにオススメはなんですか?
弾を壁貫通させて的に当てるのはどのようなアプローチをしますか?
4. Posted by unvirus   2015年08月05日 17:57
offset dumperってどんな感じで作るのですか?
5. Posted by rm   2015年08月07日 22:43
これのことかな?
https://github.com/Y3t1y3t/CSGO-Dumper
6. Posted by unvirus   2015年08月09日 14:41
>offset dumper
ファイルまたはメモリのパターンマッチです。
CheatEngineでバイト検索するのも同義です。
たとえば本記事のサーファーガードなら
CheatEngineでcguard.exeを開いて
Array検索で
E8 2A 3B 00 00 48 83 7B 40 00 74 23
を検索するとアドレス14008F4EDがヒットするとおもわれます。
このような検索を自動で行うのが
offset dumperだとおもいます
7. Posted by tor   2015年08月09日 18:27
初歩的な質問で申し訳ありません。
XIGNCODEを起動させないようにするやり方を探していたらこちらに辿り着いたのですが、
これは起動させないようにするだけだったらゲームに関係なくできるという感じでしょうか?
XIGNCODEさえ回避できたらほかのセキュリティーがなさそうなのでチート自体はできるようなのですが…
もし差支えなければXIGNCODEを起動させないようにするにはどうすればよいのか教えていただけないでしょうか?
8. Posted by fh   2015年08月11日 06:09
サドンアタックに導入されているCodemonという謎のプロテクターがAPIを丸ごと自分の領域にコピーしそれを使用してきます。CRC等があり邪魔なのでコピーを防ぎ正規のAPIを使わせる方法はありますか?またCodemonの内部は完全難読化されており中身を弄ることが出来ない状態なのでAPIでコピーを防ぐしか方法がありません。興味があれば解析してもらう事はできませんか?
9. Posted by unvirus   2015年08月12日 16:11
>XIGNCODEを起動させないようにするやり方
デバッガ経由でクライアントを起動し、x3.xemをロードしない様にします。
これはLoadLibraryWかLdrLoadDllにブレークポイントを貼っておけば良いとおもいます。
ロードさせないと、エラーメッセージが出るのでそれを無視するようにします。

XIGNCODEを外だけなら上記のように簡単ですが同期キー通信しなくなるので数分でゲームは切断されます。

>codemonという謎のプロテクター
XIGNCODE+codemonという構成なのでしょうか
両方とも回避するのはかなり難しいと思います。
XIGNCODEだけでも非常に大変ですし、無理なんじゃね?
10. Posted by tor   2015年08月13日 22:34
コメントありがとうございます。
アラド戦記というゲームで試しているのですが、教えてもらった方法でやると確かにゲーム接続が切れました。
チートツール自体はPerXでDLLを読み込んで使用するタイプなのですが、
DLLを通すだけなら簡単だと聞いたのですがXIGNCODEをどうすれば簡単に通すことができるでしょうか?
11. Posted by unvirus   2015年08月14日 17:45
チートエンジン検出されるのって
プログラミングできないと回避不能ですか?
12. Posted by tor   2015年08月14日 18:50
返信ありがとうございます。
検出されないようにする方法を掲示板で聞いてみたりしたのですが、
DLL通すだけなら簡単にいける、という答えでした。
どうすればよいのかわからず初歩的な事ですが質問をしました…
13. Posted by unvirus   2015年08月14日 19:39
あ、ぼくは本物のunvirusじゃないです
14. Posted by unvirus   2015年08月21日 18:49
レス遅れましたすみません

>チートツール自体はPerXでDLLを読み込んで使用するタイプなのです

XIGNCODE付きゲームはほぼ鯖同期型なのでXIGNCODEを丸ごと外す方法はとれません
XIGNCODEが有効ですと、DLLインジェクトで使用する
CreateRemoteThreadというAPIで作成されたスレッド自体を検知しますので
一般的なインジェクターは使えません
この辺をどうやるかは、暇があれば情報乗せたいと思っています。

>チートエンジン検出されるのって
>プログラミングできないと回避不能ですか?

nPro程度なら、サンドボックス系のソフトで検知を逃れる事が出来ます。
ただ、プロテクタでカーネルレベルで秘匿されたメモリにアクセス出来るかはちょっとわからないです。

15. Posted by 松川   2015年09月08日 10:49
DDONしようぜ☆
16. Posted by はなたろう   2015年09月10日 14:31
DDONのアンチデバッグってどんなものでしょうか?
ブレークポイントを設置した瞬間落とされます…。
HPを変更できたので完全鯖管理という訳ではなさそうなのでブレークポイントさえ設置できれば色々出来そうなんですが><
17. Posted by lum   2015年09月11日 01:55
はなたろうさん自分は人に聞いて他人には金で売るんですね。
18. Posted by unvirus   2015年09月12日 14:15
DDONはこんな感じで古典的手法をつかってます

01CF3A38 68 BD94E601 PUSH DDO.01E694BD
01CF3A3D 64:FF35 00000000 PUSH DWORD PTR FS:[0]
01CF3A44 64:8925 00000000 MOV DWORD PTR FS:[0],ESP
01CF3A4B 6A 00 PUSH 0
01CF3A4D 6A 00 PUSH 0
01CF3A4F CC INT3

こんなのとINT1をわざとやってる





19. Posted by はなたろう   2015年09月13日 04:36
回避するためのnprotectのような解説記事を書いていただけると助かります><
細やかですがお礼として例えば欲しいものリストなど貼り付けていただければ爆撃(大量注文)させていただきます。
20. Posted by unvirus   2015年09月13日 13:43
PEB!isdebugged
IsDebuggerPresent
NtQueryInformationProcess (デバッグポート)
INT3 (ブレーク)
INT1 (シングルステップブレーク)
CRC

これらが山ほど仕組まれているので大本から外す必要があります
説明めんどくさいです。


PEB!isdebugged
IsDebuggerPresent
NtQueryInformationProcess
はフックで回避

INT3
INT1
はデバッガ設定でパスできる

CRC
はデバッガ使える様にしてからメモリブレークで
地道に潰す
21. Posted by sd   2015年09月13日 19:25
他人にチート売って現在では対応が面倒になってほぼ詐欺師状態なはなたろうさんこれ以上詐欺しないでください
それで他力本願とか痛々しいですよ^^;
22. Posted by hanakuso   2015年09月14日 06:52
Unvirusさんhanatarouは相手にしないでスルーしたほうがいいですよ。こいつは大して知識もないのにMHFでチートを転売して数十万稼いでいる悪質な詐欺師です。
23. Posted by はなたろう   2015年09月14日 15:54
PEB!isdebugged
IsDebuggerPresent

http://itpro.nikkeibp.co.jp/article/Watcher/20071119/287574/
カーネルに対してのパッチングで根本的にBeingDebuggedフラグがONにならないないようにすればいいのですかね。
NtQueryInformationProcess
の解除も難しそうですし素人なので諦めます><
24. Posted by あくすまん   2015年09月23日 08:06
こんにちは。
ブログ読ませてもらって非常に凄いかたのようで・・いきなりですいませんが
オンラインゲームでチート解析してみたいっていう入門者にお勧めの書籍なんか教えてもらえないでしょうか?
25. Posted by aa   2015年09月24日 09:31
プログラム解析関係の書籍ならたくさんあるけど、それらを見たからといってゲーム解析ができるわけではないよ。
仮にあったとしてもネット上のものより内容は薄い
オフラインゲームの解析チュートリアルとか見るのが無難かと。
26. Posted by せこいやつ   2015年09月26日 09:51
はなたろうは確かにムカツクよな
知識ないのに稼いでる
27. Posted by あくすまん   2015年09月28日 08:27
aaさん貴重な意見ありがとうございます
ネットより書籍の方がしっくり来るというかお金払って買うからモチベーションも上がるかなと思って^^
まぁ解析はそんな簡単にはいかんですよね
28. Posted by はなたろう   2015年09月28日 20:19
aaさん
初心者の方にはMHFとかお勧めですよ!
セキュリティも実質的に何もないですし。
かといって何も対策されてないわけではなく例えば敵のHPは暗号化されてたりキャラクターデータもポインター形式で常時アドレス変動してます。
クライアント側のチートとその対策をどう突破するかみたいのは学べますねー。

29. Posted by はなたろう   2015年09月29日 05:11
あとドラゴンズドグマのanti-debugについて皆様に一つ情報提供するとCheatEngineの設定だけで回避可能です。
Settingのデバッガオプションをハードウェアブレークポイント、VEHデバッガーにする。これだけで回避可能です。
プロセス隠蔽ツールと合わせればMHF以外の鯖同期型のNprotectなんかのデバッグ検知も切り抜けられます。
中途半端なanti-debugなんてほぼ何の意味もないということですよね…。
30. Posted by あ   2015年09月29日 09:15
はなたろうさん荒らしにこないでください
31. Posted by tor   2015年09月30日 15:51
アセンブリを勉強するにはどの書籍、サイトがおすすめでしょうか?
英語でも構いません。
32. Posted by unvirus   2015年10月01日 10:48
自分でCやC++で簡単なプログラムを作る
それをデバッガで動かして、どのようなアセンブラに
なっているかを知るのが良いかと思います。

たとえばCで作った以下の文
int a;
int i;

a=0;
for(i=0;i<10;i++)
{
a++;
}

printf("a=%d\n",a);
単にaを10回インクリメントするだけですが
これがアセンブラレベルでどうなるかがデバッガで追いかけることで
解るわけです。
ソースコードと対応させる事も出来ますし、勉強にはもってこいかと思います。

命令自体は、普通にググればOK
細かい仕様は
http://www.intel.co.jp/content/www/jp/ja/processors/architectures-software-developer-manuals.html
全部はとても読めないので必要な説明だけ探す感じで
33. Posted by はなたろう   2015年10月02日 07:18
LuaDebug使ったDDONのAnti-CRC組んでみました。

即死と移動速度高速化をオンにしていても落ちなくなるLuaです。
---------------------------------------------
debugProcess(2)
myaddress=getAddress("DDO.exe")+0x56000
crcaddress1 =getAddress("DDO.exe")+0x1DB4317
crcaddress2 =getAddress("DDO.exe")+0x2017C4A

function debugger_onBreakpoint()
if (EIP==crcaddress1) then
writeBytes(0x00456644,0x8B,0x84,0xD1,0xB0,0x08,0x00,0x00)
writeBytes(0x009A063F,0xF3,0x0F,0x58,0xC8,0x84,0xDB)
writeBytes(0x009A0655,0xF3,0x0F,0x58,0x54,0x24,0x10)
print("crc1 hit")
end

if (EIP==crcaddress2) then
writeBytes(0x00456644,0x8B,0x84,0xD1,0xB0,0x08,0x00,0x00)
writeBytes(0x009A063F,0xF3,0x0F,0x58,0xC8,0x84,0xDB)
writeBytes(0x009A0655,0xF3,0x0F,0x58,0x54,0x24,0x10)
print("crc2 hit")
end
print( string.format("EIP = 0x%x ",EIP) )
debug_continueFromBreakpoint(co_run) -- continue execution
end


debug_setBreakpoint(myaddress,4,1); -- Address where to set breakpoint
34. Posted by ああ   2015年10月02日 23:41
荒らしにこないでくださいはなたろうさん
詐欺やってるなら早く捕まってください
35. Posted by あくすまん   2015年10月03日 08:28
unvirusさんほんとすき
私もいつかunvirusさんになりたい^^
36. Posted by unvirus   2015年10月06日 18:16
俺は美女が美少女だな
ちゃほやされてみたいわ
37. Posted by tor   2015年10月15日 22:52
x86,x64アセンブリを学ぶのにオススメのサイト、チート関連のオススメのサイトやフォーラム、ここは読んどけというサイトたくさん教えてください
38. Posted by unvirus   2015年10月16日 11:46
1.googleで検索をかけます
2.ヒットHPしたのを上から順によみます
 *googleはスポンサー以外のHPは人気順に列挙されます。

チートなら
http://www.unknowncheats.me/
から読めばよいです。


39. Posted by pentest   2015年10月18日 20:04
XIGNCODEを回避する際にどのようなアプローチをしますか?
検知している部分を見つけるにはどうすればいいですか?
40. Posted by unvirus   2015年10月23日 20:31
XIGNCODEは知らんす
Haxxに聞くのがよいです
41. Posted by 0xc91f348->0xa8313434   2015年10月23日 21:45
知ってるゲームガードの回避方法ありましたらアプローチを教えてください
42. Posted by unvirus   2015年10月24日 13:39
過去ログ読んでいただきたいです
ゲームガードに応用出来る手段など結構あります
43. Posted by unknownvirus   2015年10月25日 12:43
過去ログの中にあるファイルがほとんど消えているのですが、それら全てを再アップしていただけないでしょうか。ソースが見れないので困っています。
44. Posted by 531   2015年11月02日 19:53
>>39さん
まずはXC3が使ってそうなAPIをhookしてログを取る
_ReturnAddress() でリターンアドレスが見つかる。
コピーされたメモリではあるが、そこから追っていけばなんとかなる

>>40さん
自分はHaxxではないが、
XC3は回避しなくても、MemoryEditでチートは可能かもしれない
DLLにまとめて、XC3が読み込まれる前に書き換えればokかもしれない
XC3ではなくターゲットプロセスのメモリ領域のCRCを回避する必要が有るかもしれない
既出のDLL Injecter等では検出されるかもしれないので、その辺は工夫すればok

>>技術的保護手段解除問題もあって断定する表現は使えない
45. Posted by 0x80   2015年11月02日 22:18
>>44さん
よろしければ情報交換など、Skypeなど教えてくれませんか?
46. Posted by 11   2015年11月04日 20:54
DLLは普通に検知される。
昔はxignありでもチートできたけど今はもうできない
47. Posted by antixign3   2015年11月04日 21:15
最近SAで流行ったスレに貼られたチートプログラムは、xignをbypassしてないよ。inject工夫すればdllでもいける。

コメントする

このブログにコメントするにはログインが必要です。