HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
0912
SADOUS以下の暗号方式だとどんな問題がありますか?16解決


SADOUS

リンク

2014/9/12(Fri) 19:34:36|NO.64860

偏差値40代の高校で更に数学が苦手さんなので
ネットにあるような難しそうな計算式を理解することができず、
独自に考えてみたのですが・・・
あっさり解読されそう。
バイナリファイルすらもどうやって読み書きするのかわからないんで現状テキストです。
→サークルで作るゲームのセーブデータ保護



3つのセーブファイルを用意し
・値一つは2/3以上の一致で信頼
・すべてのデータが2つ以上の不一致で疑

3つのセーブファイルは
・BMPイメージ,テキスト,テキスト

3つのセーブファイルの暗号化は
・xor暗算のみ
・プログラム内の暗号キー、各ファイル毎の暗号キーの計2つ以上を所持
→プログラム内の暗号キーはゲームアップデート時にしか変動しない(できない)
→各ファイル毎の暗号キーはほぼ完全な乱数
・各データの保存位置は毎回変動し、3つの保存位置は独立(リンクしない)



これ読むだけでも十分に解読しやすくなりそうです。
確かプログラムの逆コンパイルすらできるようなことを聞いたことが有りますが、
そんなことされたら一溜りもないや
・・・ご協力お願いします。



この記事に返信する


cats

リンク

2014/9/12(Fri) 21:25:34|NO.64864

具体的に暗号化、復号化済みのデータが無いと理解しにくいのですが、
セーブデータの難読化はバイナリの方が良いかと。
アルゴリズムについてざっと読んだところ無駄が多いと思います。
ここまですると処理が遅くなるのは明らかで、波を棒で防ぐような部分が多いです。
使い捨てパッドなどでプログラムにキーを持たせ、外部からは解読不可能にするのが簡単でしょう。
http://ja.wikipedia.org/wiki/%E3%83%AF%E3%83%B3%E3%82%BF%E3%82%A4%E3%83%A0%E3%83%91%E3%83%83%E3%83%89
さらにキーの漏洩を防ぐため、様々な手法でデバッグ等を検知するべきです。
低レイヤーの話ではありますが、デバッグ検知については研究が進んでいますので是非参考に。
http://www.textfiles.com/virus/adebgtut.txt
http://d.hatena.ne.jp/ninoseki/20091124/1259053644
http://hsptv.sakura.ne.jp/play/pforum.php?mode=pastwch&num=54191
逆アセンブラ対策としては、重要処理の機械語化や、実行ファイル圧縮(逆アセンブラ対策用のパッカー)
などで難読化することが挙げられます。
http://hsp.tv/make/tool4.html
(※UPX等はアンパッカーがあるので難読化では意味がありません。)
個人的には、暗号化のアルゴリズムについては結城浩氏の「暗号技術入門」
リバースエンジニアリング対策には愛甲健二氏の「たのしいバイナリの歩き方」が
非常に参考になったので、開発者として読んでみてはいかがでしょうか。



SADOUS

リンク

2014/9/13(Sat) 00:51:43|NO.64877

>catsさん
知らないことだらけで勉強になります!
OTPはそこまで難しくもなさそうだし、xor、位置ずらしを組み合わせれば
かなりの"難読化"が図れそう。
3つのファイルでデータの信憑性の判定もやれば。
debugの確認をして自プロセスをキルするやりかたには感動しました。すげぇ、
フラグをいじるわけじゃないからアンチウイルスに誤検出されたりもしなさそう。

>>重要処理の機械語化や、実行ファイル圧縮(逆アセンブラ対策用のパッカー)
機械語化はまだよくわからない。そんなソフトあったっけ・・・
実行ファイル圧縮は処理が重くなったりすると聞いたことがあるし、じゃあ
暗号/復号化は別の実行ファイルで処理させればいいのでしょうか?

なんか違うような気がする。



SADOUS

リンク

2014/9/13(Sat) 01:10:42|NO.64878

ふと思ったんですが、
OTPには少なくとも
・毎回変わる乱数表(外部ファイルで要保持?)
・鍵(できれば毎回変えたいかも)
・データ
の3つが必要ですが、肝心の乱数表を
外部ファイルに保存してしまったら意味が無いような。
とするとどうやって実現すればいいんだろう。


.プログラム内部の乱数表Aで外部に乱数表Bを保存
.乱数表Aはアップデートなどで偶に更新、乱数表Bは常に更新
としても、乱数表Aを使いまわすことになるから意味が無いか・・・




今更ですが、これってHSP関係ないですね。このスレ大丈夫ですか?



cats

リンク

2014/9/13(Sat) 09:51:33|NO.64880

とにかく暗号化のアルゴリズムがバレない限り、セーブデータを自由に改変されることはありません。
例え簡単な暗号化を行っただけでも、その暗号化方法がわからなければ解析者は打つ手がありません。
そのため、内部でどのような処理を行っているか、を隠すことが重要です。
複雑な処理を行うほど解析は難しくなります。
逆アセンブル、デバッグを完全に対策すれば内部の処理は分からなくなります。
>実行ファイル圧縮は処理が重くなったりする
実行時に圧縮した内容を展開するのですが、人が気にするような時間はかかりません。
今のところ解読されない圧縮方法というのもあるようなので使用してみてはどうでしょう。
>機械語化はまだよくわからない
HSPでも機械語を埋め込んだコードが転がっているのですが、
難しいので気が向いたときにでも勉強してみてください。
というかサークルのゲームでそこまでデータを厳重に管理する必要はあるのでしょうか。
まあ暗号化技術や解析の防止といった勉強になるので良いことなのでしょう。
▼重要なファイルの保存場所、保存方法について
https://developer.salesforce.com/page/JP:Secure_Coding_Storing_Secrets



さっくん

リンク

2014/9/13(Sat) 10:11:43|NO.64881

まず、コンパイルするとネイティブコードに変換される。

0114061c f7de 0114061e 01f7 001140620 f7de 01140622 897d40 01140628 c7454c81ffffffffff 〜省略〜



774

リンク

2014/9/13(Sat) 18:54:49|NO.64891

> まず、コンパイルするとネイティブコードに変換される。
一般にコンパイルによってネイティブコードへ変換されるとは限りません



さっくん

リンク

2014/9/13(Sat) 19:07:41|NO.64892

start.axを見るとこんな感じ。

HSP3 ) ・ `  l 3 ・ D ・  ・ # ・ ・  ・ ・   P P   P P          6     P   @ P6  (  @ )      (  @ )  BM      (  @. )            6          @ (  @   ) @ (  @   ) @ (  @ ) @              P       (  , @ (   ) @ (   ) @ (   ) )       (  F @ (  ) @ (   ) @ (   ) )                         (   )     (   )     (   )             (   )            h          (   ) &       (   )     (   )     (   ) *        (   )     (   )                      (   )     (   )   (  @ )  0   #     (  @ )     i         P @    P P "   ?    P @ (  @ )    P P          (   ) @        j             4           @      @ @      @    @ @     Z         @ @      @         @      @         @        @    @ @                    (  )              (  )  @ @ @                    5   @ P                 (  )               (  )  @ @ @    @   P P     ・ @ P タ ? @  @ @        (   @ ) P P @       」 Pュ P タ ? @  @ @       カ Pネ P タ ? @  @ @        (   @ ) PP P      (   @ ) P@ P        "      (  )                P@ @        )   (   ) @    (     (  ! )   ・                  !    (  ! (   ) )       @        !    @ @! (   )        @ P          $ @#  "  $  &  "  (    "  '  %  %  (   & @'        J     (  I @ )      (  I @ ) @J         PC      (  )     @ (  K )       PC      (  )  L (   )      (  M @ ) @ (  L )         L   L (   )  L (   )  @L (   )  L (   )      @ (  L )       @ (  L )           O (  )     O (   )     O (   )     O (   ) R  P !   @N   ?        P         (   )      (   )   P              (   )    (  N @ ) @ @ @ @ P           @Q @R @S               !          ネ     P P     Pヘ ?P  "     " P    ! d  "        "   4    ?    #     $   > [@%     &   ` ?P  "     " P    ' d  "        d   ( # vP・P # ・PアP   ニ (   P・P2 P ワ@)     *    ・    +   # PP     ,   ) ?P  "     " P 8@-    . d  #  "        ネ   /   ?@# # IPfP # oP・P    ・ ォ@     0  " ミ   1  #  "        F     2 *  P?P・   ウ ソ@3 ナ@4 ホ@5  Z P   Pツ ヤ@6     7   8  *  P?P・ レ@9  P P ・@:     ;   *  P・P,  ・ @<     = *  P P P  ・    >   *  P・P,    @?     @ *  P P P  ・    A *  P P P  ・  $   B  *  P?P・     C P   $ (   )       $ (   ) P P P"   $ (   ) P P P2   $ (   ) P P PB   $ (   ) P @% PC   $ (  )       $ (  ) P @$ (   ) PH   @$ (  )        D D    &        &    # MP^P     &    # _P・P    &  %    B   *  P P P  ・  $   E  *  P?P・     F P   $ (   )       $ (   ) P P P   $ (   ) P P Pッ   $ (   ) P P Pニ   $ (   ) P @% Pヌ   $ (  )       $ (  ) P @$ (   ) Pフ   @$ (  )        G E     &        &    # レP・P     &    # ・PP    &  %    E       *  P P P  ・  $    '   (   @ )   ( P    $ (  )       $ (  ) P P P   $ (  ) P P P)   $ (  ) P P0 P8   $ (  ) P P@ PH   $ (  ) P PP PV   $ (  ) P P` P[   $ (  ) P Pp Ph   ' @ (  ( )    $ (  ) P @( (   ) @( (   ) P @ P         H    @    I    `    J    p    K     L # qPオP     M *  P?P・     P P  チ  ,    K   E  *  P?P・     N P   $ (   )       $ (   ) P P P・   $ (   ) P P P・   $ (   ) P P P    $ (   ) P @% P   $ (  )       $ (  ) P @$ (   ) P   @$ (  )        O A     &        &    # P2P    &      J    &  %    E         P sozai1.mp3 sozai2.mp3 bmppalette gettimestr %02d:%02d:%02d getdatestr %02d/%02d/%02d text textmode emes gfade gfade2 statictext STATIC statictext_set scrollbar SCROLLBAR progbar msctls_progress32 progbar_step progbar_set note2array array2note array2note:error arraysave arrayload USER32.DLL AppendMenuA CreateMenu CreatePopupMenu DrawMenuBar GetWindowRect MessageBoxA SetMenu TrackPopupMenu user32.dll IsWindowEnabled EnableWindow GetWindowRect MoveWindow ScreenToClient objgray p_scrwnd getobjsize resizeobj msgbox HirumOS v.1.6.4 Startup is Hirum OS... SetupStat is Start Now HirumOS Install Next Setup File Loading... Product Key Hint. Product Key Abj73gw52i7434y93ojd7wqj9823 Product Key Mirumiru Product Key Activate. Activate Abj73gw52i7434y93ojd7wqj9823 Not ProductKey Invalid. ProductKey Chk Install Now... Cancel SetupStat HirumOS is Install Complete. Hirum OS OK Button is Click Restart BIOS Restart Button Click Please Restart desktop.PNG Trash Document Music Start sozai1.mp3 sozai2.mp3 sozai1.mp3 PlayNow. Stop sozai2.mp3 PlayNow. Stop New Word Create Win32 API Start Quit Menu Word Not Support Win32API Support is hirum_winapi32.exe don`t not Exist. Win32API Trash is Clean Disk Partision Control Quit Trash Control Trash Clean Complete v1.6.4 is Not Support Hard Disk. WParted Microsoft Excel Microsoft Word Microsoft Point Control Panel Help Version Info Shutdown Hirum OS v.1.6.4 CPU Type:HSP Resope Dual CPU 4.13GHz Memory:2TB System Info Computer is Shutdown Going Down... System Setting Version Info Quit Control SysConfig.app Not Application Open. v  シ ト ・   Y ア ァ V シ  $ : R j ~ ・ ユ ル  P R d ・ z 、 ト L ・ ・  W [ t ・ ・ ? ョ カ ・ ワ  ・ d 2 : ^ { ・ i l ス j キ W ・  ゚    > 8 Q T  U  7 ・ j x d r : 4 ?    ・         !      ;      U      Z      c      k    q     x    ・     ・      ョ      ノ      ヨ      ・    ・    "   <   %   <  (  +   , 7  , B  ,  R   -  ^   /  l   3  x   5  ?    <  ・    =  ェ    ?  キ    A  ナ    G  ミ    I  ゚    K  ・   ! L  ・  " N  ・   # Q    ・         ・                       ・       ・                ・   ・   ・   ・ ・  ・  ・ ・ ・ ・  ・ ・  ・  ・ ・ ・  ・ ・  ・  ・ ・  ・  ・                                                ・ ・  



HK2

リンク

2014/9/13(Sat) 20:31:01|NO.64893

さっくんさん

axファイルはバイナリファイルではありますが、機械語(ネイティブコード)ではありません。
以下のインタプリタに関するwikipediaのページを読み、「インタプリタ」というものもあるんだと感じてください。(概要だけで十分です)
http://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%97%E3%83%AA%E3%82%BF#.E6.A6.82.E8.A6.81



check

リンク

2014/9/13(Sat) 21:01:15|NO.64894

〜HSPの仕組み〜
コンパイラがソースコードを仮想コード(ax)に置き換える

HSPランタイムが仮想コードを読み込んで、実行する

CPUは仮想コードを実行することができないので、
CPUが直接理解できる機械語になっている、HSPランタイムが仮想コードを読み込んで実行する
というインタプリタ方式をとっている。

コンパイルしたらネイティブコードに変換されるのは、C/C++言語など。
(コンパイラがアセンブリに変換して、アセンブラが機械語に変えるという方式だったけな)

ぶっちゃけてしまうと、HSPランタイムのソースコードは公開されているので、
読む人が読めば逆コンパイラも作成できるし、
そこからどのような手段でデータが暗号化されているのも読み取ることができる。
しかし、そこまでするのはそのゲームが優秀だという証拠(そこまでするファンがいる)と思えばいい。



SADOUS

リンク

2014/9/13(Sat) 22:03:27|NO.64896

checkさんのコメントからするにhspで開発を行っている以上
ソースコードを読み込まれるのは仕方がないと・・・
まあ、そこまでする人が出てくるとは正直思えませんが、
そのうち逆コンパイラ等が開発されて、スマホの編集ツールを使うように
ちゃちゃっとチートされてしまうのも悔しいというかなんというか。



あまり知識のない人が解読、運良く改変できてしまったりできないような
程度でいいですよね。
わからない事もいくつかでてきて為になりました。
今回の事を元にまた迷路でも作るつもりで頑張ってみます。

ありがとうございます・・・



SADOUS

リンク

2014/9/13(Sat) 22:03:47|NO.64897

解決チェック



さっくん

リンク

2014/9/14(Sun) 08:31:45|NO.64900

ソフトを配布するときは、逆コンパイル防止のために、
start.axを添付しない方がいいですよ。
start.axが無くてもEXEは動きますから。EXEからAXを取るとすると、暗号化されているので
大丈夫だと思います。
(でも、なぜだろう?僕の場合だとKanahironさんに逆コンパイルされたけど、
 その時はstart.axを付属させてなかったのにな。どうやってEXEからstart.axを!?
 はっ!!Resource Hackerでやったんだな!!罰せないと...)



y.tack

リンク

2014/9/14(Sun) 08:49:39|NO.64903

>3つのセーブファイルを用意し
> ・値一つは2/3以上の一致で信頼
> ・すべてのデータが2つ以上の不一致で疑
一つでも一致してなければ 信頼出来ないのでは?

そう考えると3つである必要はなく
せっかくやるなら5個用意し
5個全て一致で信頼 一つでも一致しないと信頼しないみたいな

いや 画像一つみたいなんで
画像一つとデータ4個みたいに



y.tack

リンク

2014/9/14(Sun) 09:33:14|NO.64905

>・xor暗算のみ

それでもいいと思うんですけど

せっかく一致不一致判定するなら
シフト演算やった方がいいですよ

二つあったとするなら
一つ目3bit シフト
b1 b2 b3 b4 b5 b6 b7 b8

b6 b7 b8 b1 b2 b3 b4 b5

二つめ5bit シフト
b1 b2 b3 b4 b5 b6 b7 b8

b4 b5 b6 b7 b8 b1 b2 b3

みたいな

コレを入れないと

二つの最初のbitに
例えば1bitめだけのxor演算で
xor 1 xor 1 かxor 1 xor 0 かxor0 xor1 かxor0 xor0
の演算で復号できちゃうんです
こんなかんじで
ブルーフォーストアタック
できちゃいますよね

1FILEのデータ全体への
シフトかかきまぜもしないと
例えば1byte目と1byte目へ
シフト込みであっても
ブルーフォーストアタックされちゃうので
例えばシフトでずらしてれば
何byte目と何byte目に
ブルフォーストアタックすればいいのかわからないので
攻撃にかかる演算数が増える
と思ってます

とか色々考えてて
僕はセーブ処理実装出来てないので
シンプルなのを素早く実装も大事ですw
頭の中では
ああやってこうやってって
筋道固まってるんですけど
微妙にぼやけてて
なかなか実装にかかれないので
シンプルなのを手早く実装。大事です



SADOUS

リンク

2014/9/14(Sun) 12:04:58|NO.64916

>さっくんさん
詳しいことは知りませんけど実行ファイルの中に入っていたりいなかったり
しませんでしたっけ??
なんにせよHSP言語でなくても逆コンパイルなんていくらでもされてしまうので
あまり深くは考えないことにします。
(ちなみに言うとaxファイルを添付したことなかったr

>y.tackさん
シフトも考えてみます。
保存位置ずらしの処理がどうしても重く長くややこしくなってしまうので
これでなんとかできそう!
>>頭の中ではああやってこうやってって筋道固まってるんですけど
暗号化にかかわらず全ての作業でこれが当てはまってしまう自分は・・・少し分かります。



skyblue

リンク

2014/9/14(Sun) 13:28:32|NO.64921

>詳しいことは知りませんけど実行ファイルの中に入っていたりいなかったり
>しませんでしたっけ??
入れないとエラーがでます。
もちろんaxファイルの添付は入りません。
自動作成のときは暗黙的に指定されます。



ONION software Copyright 1997-2023(c) All rights reserved.