著作権および利益の保護
C++
入力コードの保護 C++
ファームウェアおよびソフトウェアの解析やリバースエンジニアリングからの保護
動的および静的解析からのアルゴリズムの保護
スターフォースC ++ 難読化はライバルによるあなたのテクノロジーの解析を不可能にします
解析不可能なバイナリコードにし
ハッカーのソースコードの開示を禁止し
あなたの保護されたテクノロジーの強度の実験およびテストによってより多くの投資家を引き付けましょう
スターフォースC++ 難読化の適用
知的測量器
支払いシステム
自動運転の自動車
制御を分散するシステム、DCS(分散制御システム)
人工知能
モノのインターネット
ゲーム
DRM
シーケンサ、PLC(プログラマブルロジックコントローラ)
産業用PC(パーソナルコンピュータ)のためのファームウェアおよびソフトウェア
自動制御システム、ACS TP(自動テクノロジープロセス制御システム)
産業用知的装置および設備
チップとマイクロコントローラー
システムへ入るアルゴリズム/認証による
アルゴリズムにおける唯一のテクノロジー
アプリC++
ロボット工学
Android NDK
特長
バイナリコードが解析や再リバースエンジニアリングを不可能にします
ソースコードの難読化および保護の方法を30以上使っています
調節の五段階にわたる保護
010
ソースコードの難読化レベルはバイナリコードのレベルです
人間およびコンピュータによるリバースエンジニアリングからの保護
難読化のそれぞれが新しいバイナリファイルのバージョンを出します
コードのさまざまなセグメントの多種にわたる保護
ポータブルアプリケーションはインターネットを必要としません
OS
ウインドウズ、アンドロイド、iOS、マック、リナックス
スターフォースC++難読化の動作の例
ソース
#include <stdio.h> // Euclidian algorithm for calculating greatest common divisor (before obfuscation) int gcd( int n, int m ) { if( n < 1 || m < 1 ) return -1; while( n != m ) { if( n > m ) n -= m; else m -= n; } return n; } // Tests in triplets { n, m, expected_gcd( n, m ) } int tests[][ 3 ] = { { 1, 2, 1 }, { 3, 3, 3 }, { 42, 56, 14 }, { 249084, 261183, 111 }, }; // Perform tests int main( int, char*[] ) { printf( "Performing tests of gcd function:\n" ); bool passed = true; for( int i = 0; i < sizeof( tests ) / sizeof( tests[ 0 ] ); i++ ) { int n = tests[ i ][ 0 ]; int m = tests[ i ][ 1 ]; int expected_gcd = tests[ i ][ 2 ]; int calculated_gcd = gcd( n, m ); printf( " %d. gcd( %d, %d ) = %d, ", i + 1, n, m, calculated_gcd ); if( calculated_gcd == expected_gcd ) { printf( "OK.\n" ); } else { printf( "error.\n" ); passed = false; } } printf( "Tests %s.\n", passed ? "passed" : "failed" ); return passed ? 0 : 1; }
難読化後
#include <stdio.h> // Euclidian algorithm for calculating greatest common divisor (after obfuscation) int gcd( int n_0, int m_1 ) { bool temp_12; unsigned int temp_13; unsigned int temp_14; unsigned int temp_15; unsigned int temp_17; int temp_26; int temp_35; bool temp_36; unsigned int temp_37; bool temp_38; int temp_39; int temp_40; int temp_41; int temp_42; bool state0_43; bool state1_44; bool state2_45; bool state3_46; bool state4_47; bool state5_48; bool state6_49; bool state7_50; L1: L0: state0_43 = (bool)1; state1_44 = (bool)state0_43; state2_45 = (bool)state1_44; state3_46 = (bool)state2_45; goto L126; L6: temp_37 = ( unsigned int )(temp_17); temp_38 = ( bool )( temp_36 == 0 ); if (state0_43) goto L158; else goto L40; L14: temp_41 = ( int )(temp_17); temp_38 = ( bool )( temp_36 == 0 ); if (state0_43) goto L160; else goto L128; L22: temp_26 = ( int )(temp_41); if (state4_47) goto L70; else goto L72; L24: temp_41 = (int)state6_49; temp_42 = temp_41 - temp_40; temp_26 = (int)temp_42; temp_35 = temp_39 + temp_42; temp_39 = (int)temp_35; if (state1_44) goto L30; else goto L26; L26: temp_42 = ( int )( state0_43 == 0 ); temp_26 = temp_42 - temp_39; temp_41 = (int)temp_26; temp_35 = temp_40 + temp_26; temp_40 = (int)temp_35; goto L30; L30: temp_36 = temp_39 != temp_40; if (temp_36) goto L22; else goto L82; L38: state1_44 = ( bool )( state5_48 == 0 ); temp_26 = temp_39 + temp_35; temp_42 = ( int )( state5_48 == 0 ); temp_42 = temp_42 - temp_35; temp_40 = temp_26 + temp_42; temp_41 = (int)1495809726u; // The next string is really just an assignment on 32bit platform temp_41 = ( int )( ( size_t )( temp_41 ) + ( ( ( size_t )( temp_41 ) << 31 ) << 1 ) + ( ( ( ( size_t )( temp_41 ) << 31 ) << 1 ) >> 15 ) ); goto L44; L40: goto L128; L42: if (state3_46) goto L82; else goto L84; L44: temp_35 = temp_40 ^ temp_41; temp_42 = (int)1495809726u; if (state1_44) goto L6; else goto L100; L46: temp_41 = ( int )( state4_47 == 0 ); if (state3_46) goto L22; else goto L98; L48: // The next string is really just an assignment on 32bit platform temp_41 = ( int )( ( size_t )( temp_41 ) + ( ( ( size_t )( temp_41 ) << 31 ) << 1 ) + ( ( ( ( size_t )( temp_41 ) << 31 ) << 1 ) >> 15 ) ); if (state7_50) goto L66; else goto L96; L52: temp_35 = temp_41 + temp_42; if (state2_45) goto L76; else goto L94; L54: // The next string is really just an assignment on 32bit platform temp_26 = ( int )( ( size_t )( temp_26 ) + ( ( ( size_t )( temp_26 ) << 31 ) << 1 ) + ( ( ( ( size_t )( temp_26 ) << 31 ) << 1 ) >> 15 ) ); if (state2_45) goto L14; else goto L102; L56: temp_36 = temp_39 <= temp_41; temp_26 = ( int )(temp_17); if (state5_48) goto L80; else goto L92; L58: temp_37 = (unsigned int)state6_49; temp_42 = ( int )(temp_38); if (state2_45) goto L48; else goto L90; L60: state2_45 = ( bool )( state6_49 == 0 ); temp_38 = (bool)0u; if (temp_36) goto L74; else goto L146; L62: temp_35 = (int)0; if (state3_46) goto L26; else goto L104; L64: temp_41 = ( int )(temp_17); state3_46 = ( bool )( state6_49 == 0 ); state4_47 = ( bool )( state6_49 == 0 ); temp_35 = (int)state6_49; temp_36 = temp_40 <= temp_35; if (state0_43) goto L162; else goto L154; L66: state7_50 = (bool)state6_49; state5_48 = (bool)state2_45; temp_39 = (int)-1; temp_40 = (int)1495809726u; if (state6_49) goto L22; else goto L42; L68: temp_39 = (int)-1; if (state7_50) goto L88; else goto L86; L70: temp_36 = temp_39 > temp_40; temp_17 = ( unsigned int )(temp_36); if (temp_36) goto L24; else goto L62; L72: temp_42 = temp_35 | temp_26; temp_41 = temp_35 & temp_26; temp_17 = ( unsigned int )(temp_42); temp_37 = ( unsigned int )(temp_41); temp_38 = temp_17 < temp_37; if (temp_38) goto L154; else goto L148; L74: temp_35 = temp_39 - temp_40; if (state3_46) goto L106; else goto L14; L76: temp_41 = ( int )( state0_43 == 0 ); temp_26 = temp_41 - temp_39; temp_35 = temp_40 + temp_26; temp_40 = (int)temp_35; temp_36 = temp_39 != temp_40; if (state2_45) goto L154; else goto L40; L80: temp_42 = temp_39 + temp_35; temp_26 = (int)temp_42; temp_40 = temp_42 - temp_35; temp_13 = ( unsigned int )(state7_50); temp_14 = (unsigned int)131u; temp_13 = temp_13 * temp_14; temp_14 = (unsigned int)1495809857u; temp_13 = temp_14 - temp_13; temp_41 = ( int )( ( ptrdiff_t )( ( temp_13 ) & 0xFFFFFFFF ) ); // The next string is really just an assignment on 32bit platform temp_41 = ( int )( ( size_t )( temp_41 ) + ( ( ( size_t )( temp_41 ) << 31 ) << 1 ) + ( ( ( ( size_t )( temp_41 ) << 31 ) << 1 ) >> 15 ) ); if (state3_46) goto L164; else goto L152; L82: temp_17 = ( unsigned int )(temp_42); // The next string is really just an assignment on 32bit platform temp_40 = ( int )( ( size_t )( temp_40 ) + ( ( ( size_t )( temp_40 ) << 31 ) << 1 ) + ( ( ( ( size_t )( temp_40 ) << 31 ) << 1 ) >> 15 ) ); temp_35 = temp_39 ^ temp_40; if (state7_50) goto L38; else goto L108; L84: // The next string is really just an assignment on 32bit platform temp_40 = ( int )( ( size_t )( temp_40 ) + ( ( ( size_t )( temp_40 ) << 31 ) << 1 ) + ( ( ( ( size_t )( temp_40 ) << 31 ) << 1 ) >> 15 ) ); temp_35 = temp_39 ^ temp_40; temp_41 = (int)1495809726u; if (state5_48) goto L68; else goto L64; L86: // The next string is really just an assignment on 32bit platform temp_41 = ( int )( ( size_t )( temp_41 ) + ( ( ( size_t )( temp_41 ) << 31 ) << 1 ) + ( ( ( ( size_t )( temp_41 ) << 31 ) << 1 ) >> 15 ) ); temp_17 = ( unsigned int )(temp_42); if (state7_50) goto L68; else goto L110; L88: state7_50 = ( bool )( state0_43 == 0 ); temp_40 = (int)1495809726u; state5_48 = ( bool )( state6_49 == 0 ); goto L42; L90: temp_38 = (bool)state2_45; temp_17 = ( unsigned int )(temp_37); goto L150; L92: state2_45 = (bool)state5_48; temp_37 = (unsigned int)0u; temp_17 = (unsigned int)0u; state4_47 = ( bool )( state7_50 == 0 ); temp_26 = ( int )(temp_39); goto L58; L94: temp_26 = (int)836078487u; goto L156; L96: temp_39 = temp_35 ^ temp_41; temp_17 = ( unsigned int )(temp_36); return temp_39; L98: state2_45 = (bool)state6_49; temp_42 = (int)836078487u; // The next string is really just an assignment on 32bit platform temp_42 = ( int )( ( size_t )( temp_42 ) + ( ( ( size_t )( temp_42 ) << 31 ) << 1 ) + ( ( ( ( size_t )( temp_42 ) << 31 ) << 1 ) >> 15 ) ); goto L52; L100: temp_36 = ( bool )(temp_39); // The next string is really just an assignment on 32bit platform temp_42 = ( int )( ( size_t )( temp_42 ) + ( ( ( size_t )( temp_42 ) << 31 ) << 1 ) + ( ( ( ( size_t )( temp_42 ) << 31 ) << 1 ) >> 15 ) ); state6_49 = (bool)state2_45; temp_39 = temp_35 ^ temp_42; return temp_39; L102: temp_41 = temp_35 - temp_26; state2_45 = ( bool )( state3_46 == 0 ); state5_48 = ( bool )( state7_50 == 0 ); goto L56; L104: temp_42 = ( int )(temp_17); state3_46 = (bool)state2_45; temp_36 = temp_40 <= temp_35; state4_47 = (bool)state0_43; state5_48 = ( bool )( state6_49 == 0 ); if (temp_36) goto L54; else goto L30; L106: temp_17 = ( unsigned int )(temp_40); temp_41 = temp_35 + temp_26; goto L152; L108: temp_41 = (int)1495809726u; goto L148; L110: temp_39 = temp_35 ^ temp_41; return temp_39; L122: temp_39 = temp_41 - temp_26; goto L30; L126: state4_47 = (bool)state3_46; state5_48 = (bool)state4_47; state6_49 = ( bool )( state5_48 == 0 ); state7_50 = ( bool )( state6_49 == 0 ); goto L40; L128: state3_46 = ( bool )( state7_50 == 0 ); temp_40 = (int)m_1; temp_39 = (int)n_0; goto L46; L144: temp_36 = temp_39 > temp_40; if (temp_36) goto L146; else goto L52; L146: temp_36 = ( bool )(temp_37); temp_42 = ( int )(temp_17); temp_41 = ( int )(temp_39); temp_17 = ( unsigned int )(temp_40); if (state3_46) goto L74; else goto L44; L148: if (state7_50) goto L144; else goto L58; L150: if (state2_45) goto L44; else goto L60; L152: temp_38 = ( bool )(temp_17); temp_37 = ( unsigned int )(temp_41); temp_36 = ( bool )(temp_38); if (state4_47) goto L122; else goto L62; L154: temp_17 = ( unsigned int )(temp_36); if (temp_36) goto L156; else goto L56; L156: if (state2_45) goto L46; else goto L54; L158: if (temp_38) goto L152; else goto L64; L160: if (temp_38) goto L48; else goto L86; L162: state5_48 = ( bool )( state6_49 == 0 ); if (temp_36) goto L14; else goto L30; L164: state1_44 = ( bool )( state3_46 == 0 ); goto L150; } // Tests in triplets { n, m, expected_gcd( n, m ) } int tests[][ 3 ] = { { 1, 2, 1 }, { 3, 3, 3 }, { 42, 56, 14 }, { 249084, 261183, 111 }, }; // Perform tests int main( int, char*[] ) { printf( "Performing tests of gcd function:\n" ); bool passed = true; for( int i = 0; i < sizeof( tests ) / sizeof( tests[ 0 ] ); i++ ) { int n = tests[ i ][ 0 ]; int m = tests[ i ][ 1 ]; int expected_gcd = tests[ i ][ 2 ]; int calculated_gcd = gcd( n, m ); printf( " %d. gcd( %d, %d ) = %d, ", i + 1, n, m, calculated_gcd ); if( calculated_gcd == expected_gcd ) { printf( "OK.\n" ); } else { printf( "error.\n" ); passed = false; } } printf( "Tests %s.\n", passed ? "passed" : "failed" ); return passed ? 0 : 1; }