トップページ > 記事閲覧
文字列を隠したい
名前:にこよん 日時: 2018/03/26 23:42

こんばんわ プログラム内で char *test = "aaaaaaa" みたいなのを定義して、コンパイルしたexeファイルをエディタでひらくと簡単に見れてしまいます どうしても見られたくないものがあるのですが(DXアーカイブのパスワードみたいな) 何か方法はありますでしょうか? 調べても見つけられなかっただけなので、おすすめのサイトや調べるべき言葉など、ご教授くださいm(__)m 違うファイルに書き出たものを読み込む方法はできれば避けたいです int a = 100 int b = 45 pass(a + b); の様な方法は思いつきましたが、結局意味がなさそうなので質問させていただきました
メンテ

Page: 1 |

Re: 文字列を隠したい ( No.1 )
名前:管理人 日時:2018/03/27 00:44

プログラム内に直接書いてある以上、バイナリエディタで開くと見えてしまうのは防ぎようがありません、 どんな方法を行っても解析能力のある方が解析すればプログラム中に書かれた文字列は 読み取られてしまいますが、バイナリエディタで簡単に確認できない程度で良いのでしたら、例えば 文字の a は16進数で表すと 0x61 であるなど、文字もすべて数字なので、すべての文字から 0x32 を引いた値を プログラムに書いておいて使う前に 0x32 を足すようにすれば、とりあえずバイナリエディタで開いた程度では読み取られなくなります ( なぜ 0x32 なのかといいますと 0x32 が半角のスペース文字の値で、それ未満の値には文字が割り当てられていないからです ) "aBcDeFg" という文字列の各文字の値から 0x32 を引いてバイナリエディタで開いても見えないようにしておいて、 実行時に 0x32 を足して( 元に戻して )から画面に描画する、というプログラムを組んでみましたので、よろしければ参考にしてください #include "DxLib.h" // 定義の中で引いておけば、バイナリエディタで開いても aBcDeFg とは表示されません char String[] = { 'a' - 0x32, 'B' - 0x32, 'c' - 0x32, 'D' - 0x32, 'e' - 0x32, 'F' - 0x32, 'g' - 0x32, 0x00 } ; int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { ChangeWindowMode( TRUE ) ; if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } // 使う前に 0x32 足す for( int i = 0 ; String[ i ] != 0x00 ; i++ ) { String[ i ] += 0x32 ; } SetDrawScreen( DX_SCREEN_BACK ) ; while( ProcessMessage() == 0 ) { ClearDrawScreen() ; DrawString( 0, 0, String, GetColor( 255,255,255 ) ) ; ScreenFlip() ; } DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 }
メンテ
Re: 文字列を隠したい ( No.2 )
名前:にこよん 日時:2018/03/27 03:45

> どんな方法を行っても解析能力のある方が解析すればプログラム中に書かれた文字列は > 読み取られてしまいますが ですよね.... でもパッと見ただけで誰もにばれるのは嫌なのでせめて技術がある程度ある人だけにしかばれないように、 教えていただいた方法を使っておこうと思います サンプルコードありがとうございましたm(__)m サンプルを参考に(そのまま)使わさせていただきましたm(__)m これは以下のように先にdefineで定義したものを使っても大丈夫なのでしょうか? 確かdefineはコンパイル時に置換されるだけだとどこかで見た気がするのですが... それとも何か0x32を定義しているな、みたいなことがばれてしまったりするのでしょうか? #define CHAR_ADD_KEY (0x32) //文字列を保護するキー char pass[128] = { '1' - CHAR_ADD_KEY, '2' - CHAR_ADD_KEY, '3' - CHAR_ADD_KEY, '.' - CHAR_ADD_KEY, '.' - CHAR_ADD_KEY 0x00 }; この文字列を使用した後は for (int i = 0; pass[i] != 0x00; i++) pass[i] -= 0x32; のようにして元の状態に戻しておいたほうがいいでしょうか? 特にこちらは気にしなくて大丈夫なのでしょうか?(技術者は考えないこととして)
メンテ
Re: 文字列を隠したい ( No.3 )
名前:yumetodo 日時:2018/03/27 21:28

C++のconstexprをつかうともうすこしすっきり書けると思います。VS2015Update2以降くらいで使えます。 wandbox.org/permlink/IiWQ34vh5t9azYFw constexpr auto s = inferior_encrypted_string::make_inferior_encrypted_string("arikitari"); int main() { std::cout << s.str << std::endl << s.decrypt() << std::endl; } inferior_encrypted_string::make_inferior_encrypted_stringに文字列リテラルを渡して使うときはメンバ関数decryptを呼びだせばいいです。 (C++14constexpr版の実装は簡単なのにC++11constexpr版実装が難しすぎる問題がありますが)
メンテ
Re: 文字列を隠したい ( No.4 )
名前:にこよん 日時:2018/03/27 23:43

ご回答ありがとうございます すっきり書ける....? 多分自分の技術不足のせいで全くもって理解できる部分がない... とりあえずURL先をコピペしてみたのですが使い方が分からなかったです 書いていただいたのに申し訳ないですm(__)m
メンテ
Re: 文字列を隠したい ( No.5 )
名前:管理人 日時:2018/03/28 00:29

> これは以下のように先にdefineで定義したものを使っても大丈夫なのでしょうか? はい、大丈夫です > この文字列を使用した後は > for (int i = 0; pass[i] != 0x00; i++) pass[i] -= 0x32; > のようにして元の状態に戻しておいたほうがいいでしょうか? 改造ツールなどで実行中のプログラムのメモリの中身を見る方法もありますので、 確かに使用した後は再度 0x32 を引いておいたほうが良いかもしれません ( そこまでされる方ならこのくらいの対策は難なく破られそう、というのはさておき・・・ )
メンテ
Re: 文字列を隠したい ( No.6 )
名前:にこよん (解決) 日時:2018/03/28 01:23

バイナリエディタで検索しても見つけられなかったので十分満足です ありがとうございましたm(__)m
メンテ
Re: 文字列を隠したい ( No.7 )
名前:8127 日時:2018/03/29 16:11

横から失礼します。 >> yumetodoさん inferior_encrypted_stringをありがたく使わせていただきます。 思ったのですが、文字が"ariki2tari"のように"2"を含むと復号後の文字が"ariki"のように2の前で打ち切られてしまいます。(wandboxで確認) (ShiftJisで"2"の文字コードが0x32であるから、暗号化後に"\0"になり、 std::basic_string<CharType> re = this->str の行で"\0"を踏んでしまっているのだと思われます)
メンテ
Re: 文字列を隠したい ( No.8 )
名前:管理人 日時:2018/03/30 00:18

> 8127さん > (ShiftJisで"2"の文字コードが0x32であるから、暗号化後に"\0"になり、 > std::basic_string<CharType> re = this->str > の行で"\0"を踏んでしまっているのだと思われます) すみません、私の No.1 の返信に誤りが二つありました <誤りその1>    No.1 の返信で『0x32 が半角のスペース文字の値で、それ未満の値には文字が割り当てられていない』   と書いていますが、半角のスペース文字の値は 0x32 ではなく、正しくは 32 <誤りその2>    文字が割り当てられている最初の数値は 32 ですが、32 を引いてしまうと 8127さんがご指摘の通り   スペース文字が 0 になってしまうので、正しくは 31 を引く必要がある なので、yumetodoさんのプログラムで『0x32』と書かれている箇所を 31 ( 若しくは 0x1f ) に書き換えてください m(_ _;m > にこよんさん 8127さんへのご返信の通り 0x32 は誤りでした、正しくは 31 ( 16進数で表す場合は 0x1f ) となります m(_ _;m
メンテ
Re: 文字列を隠したい ( No.9 )
名前:にこよん (解決) 日時:2018/03/30 01:01

> 8127さんへのご返信の通り 0x32 は誤りでした、正しくは 31 ( 16進数で表す場合は 0x1f ) となります m(_ _;m なるほどです 途中で文字列がきれていたので文字の相性が悪かったのかと思い 0x20 とかでやってたのですが 本来はそんなことは起こるはずがなかったのですね 31に書き直しておきました ありがとうございますm(__)m
メンテ
Re: 文字列を隠したい ( No.10 )
名前:yumetodo(解決) 日時:2018/03/31 20:34

日頃から文字コード周りはうるさく行っている人のくせにアスキーの範囲すら脳内に入っていないのでこういうポカをするんですね。 つらい。 31に書き直したうえで、利用しやすいようにヘッダーファイルを落としてincludeすればいいようにし、Boost Software License にしたものを gistにあげておきました。 gist.github.com/yumetodo/238c52d4382db93e1978743cf299ba4d wandbox.org/permlink/SOsUuAvhLRbFeWUS
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存