2016-12-09 2 views
0

私はより良い方法がある場合はそれを修正してくださいすること自由に感じなさい、どのフレーズ質問をするかわからない: 通常、コードは次のようにした.hと.cppのファイル間で分割される。...hまたは.hppファイルのコードに基づいて、あなたのアプリについて誰が何を知ることができますか?

クラス宣言、関数プロトタイプ、および列挙型のようなもの は通常、ヘッダファイルに入っています。言い換えれば、 "定義"。

コードファイル(.cpp)は、 の実装を1つのファイルでのみ知る必要があるように設計されています。一般に、 関数本体と、他のモジュールによってアクセスされるべきでない/決して である内部変数は、.cppファイルに属するものです。言い換えれば、 「実装」。

iOSやAndroidのアプリストアに送信されたネイティブコード(C++)を使用しているアプリに関しては、パッケージの内容を調べることで外部ユーザーはどのような情報を知ることができますか?たとえば、クラス定義や関数名を発見できると聞きましたか?これは、通常、.hファイルにあるものが原因であると考えています。しかし、関数本体が.hファイルに含まれていれば、それらも表示されますか?誰かが私のアプリケーションを調べている場合、.hと.cppファイルの間でコードを分ける方法は、誰かが発見できるものに影響しますか?

編集:私が解決しようとしている問題はありません。私はちょうど人々が私の.hファイルにあるコードに基づいて見ることができるものを学ぼうとしています。

+5

解決したい*実際の問題は何ですか?コードを「隠す」方法とにかくそれは決してうまくいかない。誰かがあなたのアプリケーションの内部動作を学びたいなら、それを止めるための何もできません。ゲームやプログラムのハックやクラックはどうやって作成されたと思いますか?非常に多くのセキュリティホールが見つかって虐待されていることは言うまでもありませんか? –

+0

これは3つの異なる概念と3つの異なる言語です。たとえば、APKからクラス定義を抽出することは、「簡単な」方法はJavaコードを意味します。あなたのC++パートの構造にかかわらず、 "攻撃者"は、エクスポートされたネイティブ関数の名前だけを見つけることができます。それは、Javaで同様の名前の関数で表現されるためです。これはC++に関するものですか? –

+0

よく書かれたプログラムの場合、読者は決して '.cpp'を読む必要はありません。絶対にヘッダーからしか理解できないはずです。 – alexeykuzmin0

答えて

2

免責事項:これは、プロジェクトのC++部分とそのコンパイルオプション(質問のタグに従って)に集中しており、他の言語ではありません。

ネイティブライブラリのコンパイル後、ヘッダーとソースファイルに違いはありません。それらはプリプロセッサ(#includeが文字通りそれぞれの場所に挿入されている)によって単一の "translation unit"に結合され、その点からはどのファイルからどのラインが来たかに違いはありません。

と表示されますはエクスポートされた機能の名前です。これを変更することはできません。攻撃者の名前を不明確にすることで、攻撃者の生活を少し悪化させることができます。また、エクスポートされた関数は共通言語なので、C++やObjective-Cのプロジェクト共有のJava部分をスラッシュする必要があります。インターフェイスがなくても、ネイティブライブラリには何もアクセスできません。

あなたの攻撃者が本当に悪いことを望むなら、プログラマーのDudeが言ったように、になるでしょう。 GCCやClangのようなデバッグシンボルでコンパイルしない限り、C++のコマンドは直接的には回復できません。そのため、難読化のレベルですが、マシンコードはreverse engineeringから完全に免除されていません。それ以外の場合は、プロセッサーは、それに続く手順を最終的に理解する必要があります。プロセッサーを単純にシミュレーションすることができます。

TLDR:Javaでコンパイルされたコードは「読み込み」が容易で、C++でコンパイルされたコードは、.cpp/.hに関係なくコンパイルされていません。

関連する問題