@ -20,6 +20,22 @@ func (shuffle) obfuscate(obfRand *mathrand.Rand, data []byte) *ast.BlockStmt {
key := make ( [ ] byte , len ( data ) )
obfRand . Read ( key )
const (
minIdxKeySize = 2
maxIdxKeySize = 16
)
idxKeySize := minIdxKeySize
if tmp := obfRand . Intn ( len ( data ) ) ; tmp > idxKeySize {
idxKeySize = tmp
}
if idxKeySize > maxIdxKeySize {
idxKeySize = maxIdxKeySize
}
idxKey := make ( [ ] byte , idxKeySize )
obfRand . Read ( idxKey )
fullData := make ( [ ] byte , len ( data ) + len ( key ) )
operators := make ( [ ] token . Token , len ( fullData ) )
for i := range operators {
@ -39,10 +55,13 @@ func (shuffle) obfuscate(obfRand *mathrand.Rand, data []byte) *ast.BlockStmt {
args := [ ] ast . Expr { ast . NewIdent ( "data" ) }
for i := range data {
keyIdx := obfRand . Intn ( idxKeySize )
k := int ( idxKey [ keyIdx ] )
args = append ( args , operatorToReversedBinaryExpr (
operators [ i ] ,
ah . IndexExpr ( "fullData" , ah . IntLit ( shuffledIdxs [ i ] ) ) ,
ah . IndexExpr ( "fullData" , ah . IntLit ( shuffledIdxs [ len ( data ) + i ] ) ) ,
ah . IndexExpr ( "fullData" , & ast . BinaryExpr { X : ah . IntLit ( shuffledIdxs [ i ] ^ k ) , Op : token . XOR , Y : ah . CallExprByName ( "int" , ah . IndexExpr ( "idxKey" , ah . IntLit ( keyIdx ) ) ) } ) ,
ah . IndexExpr ( "fullData" , & ast . BinaryExpr { X : ah . IntLit ( shuffledIdxs [ len ( data ) + i ] ^ k ) , Op : token . XOR , Y : ah . CallExprByName ( "int" , ah . IndexExpr ( "idxKey" , ah . IntLit ( keyIdx ) ) ) } ) ,
) )
}
@ -52,6 +71,11 @@ func (shuffle) obfuscate(obfRand *mathrand.Rand, data []byte) *ast.BlockStmt {
Tok : token . DEFINE ,
Rhs : [ ] ast . Expr { ah . DataToByteSlice ( shuffledFullData ) } ,
} ,
& ast . AssignStmt {
Lhs : [ ] ast . Expr { ast . NewIdent ( "idxKey" ) } ,
Tok : token . DEFINE ,
Rhs : [ ] ast . Expr { ah . DataToByteSlice ( idxKey ) } ,
} ,
& ast . AssignStmt {
Lhs : [ ] ast . Expr { ast . NewIdent ( "data" ) } ,
Tok : token . DEFINE ,