2016年3月15日火曜日

C# BackgroundWorkerでClipboardを使うときはInvoke

これは全くゲーム関係ない事です・・。

ロリポップ!レンタルサーバ

めも

スレッド中からクリップボードを操作するとき

            Dispatcher.Invoke(new Action(() =>
            {
                System.Windows.Forms.Clipboard.SetText(data);
            }));

スレッド中からはUIがいじれないのと同様に

クリップボードも弄れないのでinvokeして使いました。

検索したら英語のサイトしかなかったので、めも程度に残します。


クリップボードって1個だけしかないのね、ハードに近いオブジェクトなのかな・・?

仕組みによっては、退避処理つくらないとバグになりそうな感じ



C#簡単で生産性が高くていい感じですね(・ω・)とか偉そうに言ってみる。


何で急にクリップボードの話になったかというと、スマホに文字入力しようとして困ったからです

adb で全角入力まで対応する場合、スマホ側に受け手になるサービスを作りこまないといけないらしく

androidまで作りたくなかったので、C#からのコピペで対応しました

ロリポップ!レンタルサーバ

実機をマクロ化(android)シェルを使うバージョン

スマホにシェルを置いてマクロ化する方法です。
まずはシェルの準備。

ロリポップ!レンタルサーバ

○使うもの

Android携帯
PC
USBケーブル
adb.exe

○やること
前準備        ・・・環境を整える
シェル作成の調査 ・・・シェルを作るためにスマホのログを調査
シェル作成     ・・・シェルを作成


○手順
--------------
●前準備

1.adb.exeを入手(AndroidSDKの中に入ってます。)

2.USBデバッグをONにする方法をぐぐって調べる。

3.マクロ確認用に、スマホに絵をかくスマホアプリをインストール
  私は「スケッチ」をつかってます。
  https://play.google.com/store/apps/details?id=com.sonymobile.sketch&hl=ja


●自分のスマホ用に、シェルを作るための調査

1.USBでPCとスマホを繋ぎます。

2.USBデバッグを許可します。

3.コマンドプロンプトを起動
  (windowsキー + Rキー → cmd → OK押下)

4.adbで接続確認「adb devices」


6.スマホでお絵かきアプリを立ち上げる
7.コマンドプロンプトで、スマホのイベントログをとる
  「adb shell getevent /dev/input/event0

8.スマホのお絵かきアプリ上で、タップ
9.コマンドプロンプト上にログが流れなかったら、「ctrlキー + Cキー」で、停止して
  7.へ戻って、event1、event2、event3、、と調べていく。

10.ログが流れたらeventの何番だったかメモメモ(上記だとevent1です)


●自分用のシェルの作成

1.PCのテキストでシェルを作ります。

ファイル名:tap.sh(名前何でもいいです。event1の番号を端末にあわせて変更)
sendevent /dev/input/event1 0 0 0
sendevent /dev/input/event1 3 57 0
sendevent /dev/input/event1 3 55 0
sendevent /dev/input/event1 3 53 $1
sendevent /dev/input/event1 3 54 $2
sendevent /dev/input/event1 3 58 53
sendevent /dev/input/event1 0 2 0
sendevent /dev/input/event1 0 0 0
/system/bin/sleep $5
sendevent /dev/input/event1 3 57 0
sendevent /dev/input/event1 3 55 0
sendevent /dev/input/event1 3 53 $3
sendevent /dev/input/event1 3 54 $4
sendevent /dev/input/event1 3 58 53
sendevent /dev/input/event1 0 2 0
sendevent /dev/input/event1 0 0 0
sendevent /dev/input/event1 0 2 0
sendevent /dev/input/event1 0 0 0

2.adbで接続して適当なフォルダにプッシュします。
   今回の例は/sdcard/downloadにプッシュ
  (追記:3月23日うまく動かない場合はスマホ側で、ファイルを作成しなおしてみてください。PC側で作ってからプッシュだと、文字コードとか改行コードとかが怪しいような感じだったので追記しました。

   tap.shを保存したフォルダで「adb push tap.sh /sdcard/download」
   

13.シェルのテスト

   スマホにお絵かきアプリが立ち上がった状態で
   「adb shell sh /sdcard/download/tap.sh 500 500 400 400 1」
                            引数は、[X1 Y1 X2 Y2 秒]、
   線が引けるはずです。

もし動かない場合は、イベントログを見て、シェルを修正する必要があります。
イベントログは16進で書いてあるので、シェルに書くときは10進にしてください。

---------------------

白猫だと
「adb shell sh /sdcard/download/tap.sh 500 700 700 500 1」とかで
スキル1が発動すると思います。
意味は、座標(500,700)で1秒長押しして、座標(700,500)までスワイプです。
                     (長押し、右斜め上方向にスワイプ)
「adb shell sh /sdcard/download/tap.sh 500 500 500 500 1」とかで長押し(ガードとか)になります。
「adb shell input tap 500 500」 こっちはタップ(攻撃とか)(標準で用意されてるコマンド)


ここまでできればあとはキックするプログラムかスクリプトを組めばOKです。


ロリポップ!レンタルサーバ

2016年3月3日木曜日

アンドロイドのマクロはシェルが良さそう(adb 長押し スワイプ いろいろ操作)

いろいろやってみたけど

アンドロイドのマクロはシェルが楽でした。

スマホのsdcardのdownloadに入れて、起動する感じです。


例えば、タップの長押しとかは(べた書きですが)
longpress.sh

sendevent /dev/input/event7 1 330 1
sendevent /dev/input/event7 3 58 1
sendevent /dev/input/event7 3 53 $1
sendevent /dev/input/event7 3 54 $2
sendevent /dev/input/event7 0 2 0
sendevent /dev/input/event7 0 0 0
sleep 1
sendevent /dev/input/event7 1 330 0
sendevent /dev/input/event7 3 58 0
sendevent /dev/input/event7 3 53 $1
sendevent /dev/input/event7 3 54 $2
sendevent /dev/input/event7 0 2 0
sendevent /dev/input/event7 0 0 0

とかにして、同様に何個か必要な動きを作っておいて
メインのシェルで呼び出す感じです。
$1はx座標
$2はy座標
2か所あるのは、1点目と2点目。2個めの$1と$2を$3を$4にすればスワイプになる。

※event7 の 7 は端末によって違うので
adb shell getevent /dev/input/event●


●の数字を0~順に見てタップして、何番目が該当するか調べます。


プニこん専用のシェルも何個かつくって配置して、メインのシェルを書けばOKですね^^

IPとポート指定でADBでキックする場合は
adb -s [IP:port] shell [作ったシェルのパス] [x座標] [y座標]
 例: adb -s 192.168.12.105 shell /sdcard/Download/longpress.sh 100 200
シェルに実行権限をつけてもたぶん大丈夫です。キック方法は好きなやり方でOKです。

まとまったらアップします。
今度はアーカイブじゃなくてテキストファイルなので、
ダウンロードサイトは使わずに、ブログにペタペタ張ります。



余談ですが、既存のコマンドの一部は、DalvikVMを再利用しない作りになってるらしいです。
VMを再利用するように直すといろいろスムーズになるかもしれませんね。

最後に使ったアクティビティを調べるシェルは
aaaa.shとか適当な名前で保存して
logcat -b events -d | grep am_create_activity | tail -n 1

こんな感じ、tailもgrepも使えるから素敵(・ω・)xargsとかもあればよかったけど無いポイね


追記:3/14
xargs無いな~と思ってたら、AndroidTerminalEmulatorというスマホアプリを入れたら普通に使えました^-^
wgetもあったので、何でもインストールできそうと思い
とりあえずgccのインストールを試みたのですがうまくいかず、試行錯誤しています。

私的にはimagemagickあたりが使えればメチャ便利なので、なんとかコンパイル環境を整えたいです。

ゲームやってただけのはずがなぜかどんどん深みにはまっていくこの感じ(・ω・)

C#とadbでコツコツとツールを作って
指定した画像をクリックしたりするマクロファイルを生成ツールも作ってあるのです。
(でもこれは、シェルをスマホ側に置かないといけないので生理的に配布できないのでした。)
シェルで作ったのはスクリーンショットを取ることと、長押し、スワイプ
C#で作ったのはシェルキックする機能と、ローカル画像とスクショを比較する機能。
画像比較してる部分をスマホ側に移植するためにImageMagickを使いたくなって
コンパイル環境を整えるところで今止まってます。

2016年2月29日月曜日

ゲームのパケットを見る準備①シンプルなhttpプロキシ


ロリポップ!レンタルサーバ


使うもの
VS


とりあえず叩き台のソースを拾ってきました。
プロキシサーバモドキ
(参考(英語):http://times.imkrisna.com/2011/08/simple-http-proxy-server-c-source-code/

やり方
参考URL先のソースをコピペしてコンパイルして起動させて、端末側のプロキシの設定をする。


結果

中継させたため、通常の状態と比べてロード時間が長くなりました。

とりあえず、
協力バトルとかでロード時間がやたら遅い人がいたら、チータの可能性が高いです。



ClientConnectionクラスのHandlerメソッドで
Httpリクエストを作り直して、投げて、戻ってきたレスポンスをクライアントに中継して投げています。

この仕組みでゲームは動くけどgoogleはsorryっての返してきます。
文字列加工して投げてるだけだと嫌みたいですね。


ロリポップ!レンタルサーバ

TechAcademy [テックアカデミー]

バグで困ったときは【teratail】に相談!

2016年2月22日月曜日

Windows10 で、デコの流れ(dll→il→dll→署名→インストール→稼働)

使ったもの

VS ・・・ dllをilに、ilをdllにするのに使う。インジェクションのDLL作るのにも使う
(ilasm.exeは、開発者コマンドプロンプトを開くとパスが通ったけど、実際どこにあるか見つけられなかった。)


ロリポップ!レンタルサーバ

やったこと

スマホに対象となるゲームをインストる。

ESで、ゲームをバックアップしてSDカードに保存

どうにかしてPCに転送。



PCに転送したアーカイブを7-zipで開く

アセットの中にある、いじりたいDLLを、ildasm.exeで開いて、ilにダンプする。


dllに戻すときは、VSの開発者コマンドプロンプトを開くとパスが通るので

このコマンドプロンプトからilasm.exeを使ってdllに戻す。


スマホに転送してインストール。(動くかわからない、署名ってどうなるんだろ)




こんな流れなのかな?



やってみた結果

dll 抜く、ilに変換、dllに戻す、アーカイブに突っ込む、スマホに転送

インストールできませんでした。



jarsignerで署名見るとわかりますが、消えてます。

再署名するにはマニュフェストとか消して署名つっこめばいいけど・・どうなのかな。


進展あったら追記します。



ロリポップ!レンタルサーバ

追記:
署名したらインストールできました。


稼働も確認できたのでOKとします。

署名がかわるので、運営が更新してもこっちは更新はいらなくなります。



あとは、運営側が非正規アーカイブをどう判定してるかを見て回避すれば大丈夫そうですね。

パケットでみた情報をヒントに探すとしたら

クエストジェネレートしてるとこと、コンプリートしてるとこ、あと圧縮解凍、暗号のところらへんを見れば良さそう。

アカ規制回の方は
デジタル署名のチェックか、インストール時リファラのチェックやってると思うのでソースを解析するか、
サーバーをたてておいて、不正だよって伝えるパケットをカットする方法になるのかな。



どのみちいろんなゲームやるし、使えそうなプロキシライブラリを探します。

FidderCoreってのを見つけたのですが非商用ライセンスが無かったです。勉強には使えそうです。


調べたけっかですが
どの言語でもURLを分解して投げなおせばプロキシもどきとして使えるみたいですね。
httpクライアントのある適当な言語で自分の好きなように作るのがよさそうです。

と思ったら、シンプルなHTTPproxyモドキで処理した場合、ゲームも動くし見た目は問題なかったのですがgoogleに何やってるのって叱られました。

(追記:fiddler4でも同じの出たから、ゲーム側には影響しないにしても、回避できないのかも。)



とりあえず次はfiddlerCore遊んでます。

fiddlerCoreを使う場合は以下の3個を登録しとけばよさそうでした。
            Fiddler.FiddlerApplication.BeforeRequest
                        += new Fiddler.SessionStateHandler(リクエスト中継前にしたい処理);
            Fiddler.FiddlerApplication.BeforeResponse
                        += new Fiddler.SessionStateHandler(レスポンス中継前にしたい処理);
            Fiddler.FiddlerApplication.AfterSessionComplete
                        += new Fiddler.SessionStateHandler(レスポンス中継後にしたい処理);

リクエストの握り潰し、レスポンスの改ざん、結果の確認、何ができるかいろいろ考えられますね。


追記:3月15日
smaliというのを見つけました。
https://translate.google.co.jp/translate?hl=ja&sl=en&tl=ja&u=https%3A%2F%2Fbitbucket.org%2FJesusFreke%2Fsmali%2Fdownloads&anno=2

java側の改造はこっちでやってる人が多いみたいで情報が結構おちてますね。

java -Xmx1G -jar baksmali.jar classes.dex
でoutフォルダに展開されるので、ごにょごにょ弄って
java -jar smali.jar -o classes.dex out/
で戻してあげればできあがりみたい。

ロリポップ!レンタルサーバ

2016年2月21日日曜日

白猫のパケット

ソースの見方

必要な物:
java
jad → jd-gui
ILspy
adb
tcpdump → fiddler4

ロリポップ!レンタルサーバ

手順:

adbとtcpdunmでパケットのログを取って
パラメータに何が必要かなどを調べて、javaとC#の中を探す
 javaは、jarコマンドでapkを展開、jadで、javaを復元して見る。
 C#は、jarコマンドで展開されたフォルダ内の、assetsフォルダ内のdllをILspyで見る。
(ソースをいきなりみても追うのが大変だから先にパケットを見るという順番)

---------

初回起動時(リクエストのみ)
/ajax/regist/create
(この応答まではSO中のカギで読めると思う。この後は差し替えてから読む)


起動時のパケット概要(リクエストのみ)

registチェック
デフォルト装備
バージョン
世界のリスト
エリアリスト
loginbonus
再びバージョン
クエストリスト


クエスト開始~討伐完了までのパケット概要(リクエストのみ)

バージョン
クエストジェネレータ
再びバージョン
クエストコンプリート

ロリポップ!レンタルサーバ


パラメータに連結されていく文字列がわかればクエストはパケ投げクリアできるのかな。
ソースの見当は、 NetworkManagerでキーの名前持ってるのでこの辺りを読めばよさそうです。違うかな。
パケ投げでクリアするときは即クリじゃなくて、手動と同じ速度にしたほうが無難かもしれません。
あと、念のため白猫が更新されるたびにパケット解析したほうがいいです。


あ。でも、パケ投げする方法は反対です。


マクロ中からパケットを見て何かの判定として使うならいいけど
パケット投げるのってあるいみ攻撃なので本当やめたほうがいいです。


追記:
バージョンをキックしてるのはクッキーのチェックぽいのかな。

クッキーは、ゲームのキャシュ消しても変わらなかったから
おそらく固有の値ぽく、これは変更不可能なのかもしれない。
でも、ライフサイクルどうなってるんだろ。


あと、クエスト開始~コンプリートまで
初回のクエストジェネレータキックからコンプリートキックまでの間
ローカルやりたい放題に見えた。
箱開け、敵全滅やりたいほうだいやって、コンプリートキックとか。

ここで輝くハイジャック(・ω・)

ロリポップ!レンタルサーバ


追記:3月31日

ILSPYでNetworkManagerを見ると、IEnumeratorのメソッドがたくさんあり
見たことがなかったので少ししらべてみたところIteratorパターンでいうところの反復子にあたる部分だということがわかりました。
集合体にあたるのがEnumerableです。

ILSPYでの表示をilに切り替えると、NetworkManagerにあるIteratorが何かわかります。
Request_ImplとRequestCoroutineのMoveNextで、DecryptとEncryptしてます。
(うーん、Enumerableはイテレータってだけじゃなさそう。startで呼ばれてるから・・タスクとかスレッド?かな?httpのやりとりを貯めてって、必要がある時にmovenextで順に使ってく感じかもしれない。)
さらにたどっていくと、 RijndaelManagedが使われていることがわかりました。

余談ですが、ilのcallとcallvirtの違いは、インタフェースを実装したメソッドを呼ぶときcallvirtになるみたい
callのほうが最適化が積極的にされてるらしく、できるだけilがcallになるようなコーディングが好ましいっぽくどっかにかいてあった。とはいえC#の話であってUnityの事じゃないです。

あと、httpリクエストは一般的にはキックすると生で提供してはこず、こちらからのリクエストヘッダーを見て、対応できる形式で圧縮した状態でレスを返してきます。
なので、いちおうソース中でさがしてみましたZlibが使われてるようでした。

何を使ってるかわかったので、APIをみて使い方を調べて見ます。
サーバー立てるまでもなく、経由させればOKかも。

ここまでのまとめ。

パケットを見て、ヒントを得る。今回のヒントはトークンキーの名前。
ソース中をグレップして位置を特定。今回はNetworkManager。
何をしてるか見て、何を使うか決める。今回はRijndaelManaged、Zlib。
APIを見て使い方を調べて、必要な値をソース中から探す。

ロリポップ!レンタルサーバ



追記:4月4日

RijndaelManagedのAPIを見るとIVKEYが必要であることがわかりました。
ソース中を探すと、その2つがSOの中にあることがわかったので
IDA」のフリー版を落としてきて開いてみると、こんな感じで呼び出していたラベルがあるので


それ以降に記述してあるアセンブラを読むと戻り値がわかると思います。
アセンブラと聞くと腰が引けるかもしれませんがニーモニックは超簡単です。
慣れれば簡単な処理ならマシン語のままでも読めちゃいます。


現状、インストールしてあるものは
7-zip、IDA、VS、ILSpy、java、adb
あと、なんちゃってプロクシ(fidder4は使ってなくって、C#のなんちゃってプロクシを使ってます)

見たものはパケット(httpヘッダー、ボディ)→トークンキーの名前を発見
C#とILをトークンキーでグレップ→通信するためのクラスを発見
C#とILを読む→何を用いてるか発見
用いる物のAPIをチェック→KEYとIVが必要な事を発見
ILを読む→SOをキックしてることを発見
SOをIDAで開いてニーモニックを確認 ^-^ 
読まなくても、SOのラベルわかってるからキックすればいいのかもしれない。

気になるのは変数に入ってなければSOの値を使うぽくなってる。なんだろう。
(追記:インストールしたてで起動したときのパケットでカギがさし変わる仕組みらしい)
プロクシモドキのソースに手を加えて試してみます。
C#で作ってあるので、復元したソースのメソッドコピペで流用できちゃうのがいい感じ。dllも使える。

一般人にとってVSは本当に心強い味方(・ω・)
ま、きっと何やってるかわかればエクセルでもできちゃうんでしょう。

自分で自分のセッションハイジャックまであと少しかも・・?
(あ、パケ投げは攻撃だから駄目ですよ!あくまでも見るだけですよ!)

ロリポップ!レンタルサーバ

追記:4月7日
SO中の16進をUTF8にした文字列でググルと
「新規」か「機種変更」のときのパケットで初回の鍵がユーザ固有の鍵にさしかわるって書いてありました。



代表的なアーキやパターンを知ってればC#のソースを見て内部的に呼ばれる関数なども読み取れるのかもしれませんね。
あまり大きいソースを見たことが無かったのでいろいろ勉強になりました。



パケット復元の仕方のまとめ

C#で作る場合、apk中のzlibとjsonのdllを参照したプロジェクトを作成して
プロクシモドキを作って経由させてあげればOKぽいです。
レスポンスはdll中の関数をキックするメソッドで解凍できました。コピペメソッドです。
・・・ゲームソース中のメソッドを丸ごとコピペして使います
(必要そうなのは複合・暗号・圧縮・解凍あたり)
コピペコピペコピペ(・ω・)
ポストを見たい場合はunscapeしないとデコードできないので気を付けてね。
json中の\uで始まる16進むはUTF-16で復元できます。

SO中のカギで読めるレスポンスの中のjsonに差し替えのカギが入ってるので
まず、レスポンス中でcharset=UTF-8のパケットをデコードしてテキストに出力して読みます。
で、json中から新しいカギを見つけて、差し替えてから後々のパケットが読めるようになります。
(uhってuser hashの略かな?だとするとユーザ単位ってのはありえますね)

ロリポップ!レンタルサーバ


次は
復元した受信のパケットを、いじってクライアントに読み込ませてみます。

試したい事は
敵とか木箱とか宝を増やしたり減らしたりできるかどうか。
敵のレベルとか下げれるとクリア簡単になるかな?
まずはパラメータの調査からですねl。

2016年2月15日月曜日

白猫 マクロ作成ツール Ver 0.0.0.1

ROOT化不要でマクロ化、連戦マクロ作成用です。

雛形のソースに指示の記述を挿入するだけなんだけど、これがあると便利。

えと、方角がわかりやすいようにM0~M19の方位図も表示してみました。
今のところ使い道は無いですが、ビーム回転の指示もあります。
これをつかってマップに対応したファイルを作っていこうと思います。


下記にツールの説明を記述します。

Keep Trying [ぷにこん専用]


こんな仕様にしました。

◎使う前の準備
・PCにアンドロイドの画面を表示させます。
 Genymotion、Bluestacks、Xamarin Android Playerなどのエミュ
 もしくは、Vysor、TeamViewerなどのリモートを使用など、何でもOK
 (TeamViewerでやるのが一番簡単だったかも。)


・次に、白猫を起動し、画像を保存します。(端末の枠を含む事)

 クエスト終了後の報酬画面→BASE.bmpという名前で保存。どのクエ終了後のでもOK
                                  画面の位置やサイズの情報に使います。



・次に、設定変更です。
   カメラの回転=無し、ターゲットへ向く=無し、初期カメラ位置=遠い、スキルカットイン=無し


あとは、ツールのテキストエリアに指示を書いてSTARTです。

例えば銀狸BOSSマップであれば、キャラの強さにもよりますが、指示の記述は
M18-2000
S1
の2行で回せます。

M18-2000は、左ななめ上方向に2000ミリ秒進む。
S1はスキル1を使う。

あとは、自動的に再挑戦を繰り返します。

ロリポップ!レンタルサーバ

銀たぬきマップの動画


赤のルーン集めの動画



ロリポップ!レンタルサーバ



個人的にはTeamViewerでやるのが簡単でした。
----------
TeamViewerでやる場合は

PCにTeamViewerをインストール
スマホにQuickSupportというアプリを入れるだけです。
(※追記:2016/03/09 iphoneだと遠隔操作できません。Vennyなどを使ってスマホにVNCサーバを導入してください。)


例えば、スマホを部室で充電したまま、自宅のpcから操作でき、連戦できます。


下記は、TeamViewerで自動化した場合の実機側の動画です。
セオリが無人で連戦しているところ。


別途ページを設けました。 → ツール概要とダウンロード
にわかの私が作ったツールに興味を持っていただきありがとうございます。


開幕OKボタンがあれば押すという処理を追加しました。
あと、1回転のビーム使ってみました^^;、算数が苦手なのでひし形を描くように動かしてます。