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
|