版权和利益保护
C++
初始编码保护 C++
保护固件和软件免受分析和逆向工程的影响
避免算法受到动态和静态分析的影响
Starforce C++ Obfuscator确保竞争对手无法分析您的技术
使二进制代码无法解析
防止攻击者打开源代码
通过密集测试和安全技术测试吸引更多投资者
Starforce C++Obfuscator的应用
智能测量装置
支付系统
无人驾驶汽车
分布式控制系统,DCS
人工智能
物联网
游戏
DRM
可编程逻辑控制器,PLC
工业PC的固件和软件
自动化控制系统,CAPCS
工业智能装备及设备
芯片和微控制器
登录/认证算法
特殊算法技术
附件C++
机器人技术
Android NDK
优势
使二进制代码无法解析和重组
使用30多种混淆和源代码保护方法。
五个级别的自定义保护
010
二进制级别的源代码混淆级别
反人机分析和逆向设计
每个混淆都给出了二进制的新版本
针对不同代码段的各种保护选项
不需要互联网的独立应用程序
OS
Windows, Android, iOS, Mac, Linux
StarForce C++ Obfuscator示例
来源
#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; }