ページ 11

コンパイル時に暗号!?

Posted: 2010年5月18日(火) 03:46
by しん
コンパイルするときに暗号化ってできますか?

開発環境
VC++ 2008
Windows XP SP3
C言語使用

VC++のコマンドプロントで
cl ○○.c
とやるとコンパイルが実行されて
○○.exe
という実行ファイルが作成されます。
※いつもCUIでコンパイルしてるので
 GUIの方はわかりません。

作成された実行ファイルを逆アセンブラすると
簡単にソースがわかりました。
これを回避するにはソースの暗号化しか
ないと思うのですが、どのように暗号化したら
よろしいのでしょうか?

よろしくお願いします。

Re:コンパイル時に暗号!?

Posted: 2010年5月18日(火) 09:58
by 御津凪
> 作成された実行ファイルを逆アセンブラすると
> 簡単にソースがわかりました。

デバッグ実行時の逆アセンブラ表示でのことでしょうか?
そうなのであればデバッグを助ける為にアセンブラコードと共にソースコードも一緒に表示されているだけです。

配布が行えるリリース版でビルドすれば、逆アセンブラしても元のソースコードは(ソースコードも一緒に配布していない限り)現れません。

Re:コンパイル時に暗号!?

Posted: 2010年5月18日(火) 13:49
by しん
すみません。。
配布が行えるリリース版というのはなんでしょうか?
VC++ 2008に付属していますか?

Re:コンパイル時に暗号!?

Posted: 2010年5月18日(火) 14:15
by Dixq (管理人)
メニューバーのとこに「Debug」か「Release」か選択出来るところがありますからそれをReleaseにしてください

Re:コンパイル時に暗号!?

Posted: 2010年5月18日(火) 14:18
by しん
普段VC++のコマンドプロントでコンパイルしているので
GUIの方のコンパイルがちょっと・・・・

コマンドプロントではできませんか?

Re:コンパイル時に暗号!?

Posted: 2010年5月18日(火) 15:10
by 御津凪
コマンドプロンプトではデバッグ・リリースの区別がありませんでしたね。すみません。
デバッグ情報を含めた実行ファイルにはビルドしたディレクトリなどの個人情報が紛れ込むことがあるため、
上記の記事のように書きました。(他にも理由がありますが)

通常のコマンド(cl main.c とか)では、デバッグ情報無し、最適化無しなどの状態でコンパイルします。
つまりこのような形で作られた実行ファイルにはデバッグ情報は入っていません。

dumpbin /all /out:dump.txt ○○.exe
で実行ファイルの中身を見れますが、元のソースコードの記述はどこにも無いはずです。

しんさんの仰る「ソース」が機械語(実行ファイル内のデータ)から逆アセンブルして現れるアセンブラコードのことであれば、
それを暗号化するようなことは出来ません。
(OS が理解できないコードになるため)

符号化するプログラムを含めれば実現できなくもないですが、結局そのプログラムは暗号化できないコードになるので、
突き詰めれば結局元のコードが解ってしまいます。

簡単にコードを見れないように、ということであればそのようにしてもいいのですが、
変なことをやるとセキュリティソフトにウイルスと誤認されてしまいます。

Re:コンパイル時に暗号!?

Posted: 2010年5月18日(火) 15:21
by しん
なるほど。
そうだったんですか・・・

私が言ったソースとは
アセンブラコードもそうですが
たまにprintfので出力する文字列が
そのまま逆アセンブルで表示されることが
あるので、そういうのをなくしたかったです。

逆を言えばどんなソフトでも
アセンブラを理解していれば
Cのソースはバレてしまうということですね。

ありがとうございました。

Re:コンパイル時に暗号!?

Posted: 2010年5月18日(火) 15:21
by しん
なるほど。
そうだったんですか・・・

私が言ったソースとは
アセンブラコードもそうですが
たまにprintfので出力する文字列が
そのまま逆アセンブルで表示されることが
あるので、そういうのをなくしたかったです。

逆を言えばどんなソフトでも
アセンブラを理解していれば
Cのソースはバレてしまうということですね。

ありがとうございました。

Re:コンパイル時に暗号!?

Posted: 2010年5月18日(火) 18:03
by Dixq (管理人)
文字列を発見されないようにするだけなら文字コードをあるキーで排他的論理和をとった数値とキーで表示するなどしてみたらどうでしょう?
もっと簡単にいえば、文字コード+1しただけでパッと見はわからくなると思います。