├── obfusgator.zig └── README.md /obfusgator.zig: -------------------------------------------------------------------------------- 1 | // zig run obfusgator.zig 2 | // zig run obfusgator.zig -- myprog.zig 3 | 4 | const zd = [ _ ] u8 { 5 | 120 , 156 , 237 , 211 , 203 6 | , 13 , 131 , 48 , 16 , 69 , 7 | 209 , 172 , 93 , 69 , 74 , 8 | 64 , 40 , 160 , 148 , 9 | 65 , 255 , 10 | 205 , 144 , 29 11 | , 66 , 254 , 12 | 105 , 226 , 13 | 121 , 248 , 14 | 243 , 60 , 15 | 119 , 69 , 64 16 | , 25 , 124 , 17 | 12 , 28 , 18 | 187 , 251 , 46 , 19 | 239 , 207 , 226 , 214 , 109 , 20 | 115 , 47 , 75 , 214 , 9 , 170 21 | , 181 , 195 , 15 , 229 , 50 , 102 , 87 , 77 22 | , 226 , 229 , 19 , 229 , 99 , 117 , 133 , 113 , 63 , 199 , 23 | 48 , 243 , 82 , 50 , 175 , 204 , 203 , 234 , 21 , 74 , 205 , 59 , 24 | 104 , 147 , 48 , 175 , 40 , 189 , 25 , 72 , 91 , 47 , 246 , 190 , 18 , 25 | 136 , 121 , 43 , 236 , 128 , 112 , 172 , 102 , 109 , 247 , 131 , 26 | 251 , 165 , 178 , 153 , 209 , 91 , 104 , 118 , 62 , 58 , 7 , 27 | 178 , 54 , 111 , 44 , 106 , 38 , 36 , 148 , 215 , 155 , 28 | 208 , 173 , 23 , 21 , 189 , 215 , 179 , 232 , 191 , 29 | 172 , 174 , 10 , 23 , 159 , 1 , 142 , 232 , 205 , 30 | 188 , 159 , 255 , 214 , 22 , 34 , 140 , 222 , 171 31 | , 17 , 153 , 119 , 56 , 111 , 234 , 60 , 153 , 58 , 32 | 44 , 197 , 143 , 254 , 60 , 211 , 251 , 83 , 123 , 221 , 33 | 165 , 205 , 230 , 85 , 102 , 94 , 202 , 102 , 123 , 159 , 34 | 139 , 191 , 226 , 212 , 31 , 171 , 13 , 196 , 134 , 218 , 183 , 231 , 6 , 62 35 | , 212 , 108 , 112 , 243 , 114 , 120 , 127 , 61 , 197 , 101 , 198 } ; const z 36 | = @import ( "std" ) ; const Ti = z . zig . Tokenizer ; const T = z . zig 37 | . Token ; const a = z . heap . page_allocator ; const io = z . Io ; const 38 | mem = z . mem ; 39 | const fmt = z . fmt ; const u = 40 | undefined ; const sz = 41 | 99999 ; const t = true ; var B 42 | : [ 512 ] u8 = u ; var wB = z 43 | 44 | . fs . File . stdout ( 45 | ) . writer ( & B ) ; const w 46 | = & wB . interface ; pub 47 | const P = struct { d : [ 2 ] 48 | u32 , p : [ ] u1 , 49 | pub fn from ( 50 | ls : [ ] const 51 | u8 ) ! P { var 52 | ln : u32 = 0 53 | ; var p : P 54 | = u ; var r 55 | = io . Reader 56 | . fixed ( ls ) 57 | ; while ( t 58 | ) { const l = 59 | try r . 60 | 61 | 62 | takeDelimiterExclusive ( '\n' ) ; if ( l . len > 0 ) r . 63 | toss ( l . len - 1 ) ; switch ( ln ) { 1 => { var it = mem . 64 | splitAny ( u8 , l , " " ) ; for ( 0 .. 2 ) | i | p . d [ i ] = try fmt 65 | . parseInt ( u32 , it . next ( ) . ? , 10 ) ; } , 3 => { const l2 = 66 | ls [ 13 .. ] ; p . p = try a . alloc ( u1 , p . d [ 0 ] * p . 67 | d [ 1 ] ) ; for ( 0 .. p . d [ 0 ] * p . d [ 1 ] ) | i | 68 | { if ( l2 [ i * 3 ] > 0 or l2 [ i * 3 + 1 ] > 0 or l2 [ 69 | i * 3 + 2 ] > 0 ) { p . p [ i ] = 1 ; } } break ; 70 | } , else => { } , } ln += 1 ; } return p ; } } ; 71 | fn pt ( src : [ ] const u8 , ts : [ ] const T , ti : 72 | * u32 , ncf : u32 , pws : * bool ) ! void { var nc = ncf 73 | ; while ( t ) { if ( ti .* >= ts . len ) { return ; } 74 | const tok = ts [ ti .* ] ; if ( mem . containsAtLeast ( u8 , @tagName ( tok 75 | . tag ) , 1 , "comment" ) ) { ti .* += 1 ; continue ; } var tl : u32 = 76 | @intCast ( ( tok . loc . end - tok . loc . start ) + 1 ) ; if ( ! pws .* 77 | ) tl += 1 ; if ( tl <= nc ) { if ( ! pws .* ) _ = try w . write ( " " ) ; 78 | try w . print ( 79 | "{s} " , . { src [ tok . loc 80 | . start .. tok . loc . end ] } 81 | ) ; pws .* = t ; nc -= tl ; ti 82 | .* += 1 ; } else { for ( 0 83 | 84 | .. nc ) | _ | _ = try w 85 | . write ( " " ) ; return ; } 86 | } } pub fn main ( ) ! void { 87 | _ = try w . write ( "// zig" 88 | ++ " run" ++ 89 | " obfusg" ++ 90 | "ator.zig" ++ 91 | "\n// zig" ++ 92 | " run obfus" 93 | ++ 94 | "gator.zig" 95 | ++ " -- m" ++ 96 | "yprog" ++ 97 | ".zig\n" ) 98 | ; const args = 99 | try z . process . argsAlloc 100 | ( a ) ; var src : [ : 0 ] const 101 | u8 = @embedFile ( "obfusgator.zig" ) ; 102 | if ( args . len > 1 ) { const d = try z . fs . cwd ( ) . 103 | readFileAlloc ( a , args [ 1 ] , sz * sz ) ; src = try a . 104 | dupeZ ( u8 , d ) ; } var reader : io . Reader = . fixed ( & zd ) ; var 105 | db : [ z . compress . flate . max_window_len ] u8 = u ; var dc : z 106 | . compress . flate . Decompress = . init ( & reader , . 107 | zlib , & db ) ; var o : [ sz ] u8 = u ; const rn = try 108 | dc . reader . readSliceShort ( & o ) ; const p = try P . 109 | from ( o [ 0 .. rn ] ) ; var e : bool = ! t ; var 110 | elen : u32 = 0 ; var ts = z . array_list . 111 | Managed ( T ) . init ( a ) ; var tki = Ti . init ( 112 | src ) ; while ( t ) { const tk = tki . next ( ) ; try ts . 113 | append ( tk ) ; if ( tk . tag == . eof ) break ; } var ti : 114 | u32 = 0 ; var pws = t ; var n : u32 = 0 ; while ( ti < ts . items . len ) { 115 | for ( 0 .. p . d [ 1 ] ) | y | { for ( 0 .. p . d [ 0 ] ) | x | { var nx = x 116 | ; if ( n % 2 > 0 ) { nx = ( p . d [ 0 ] - 1 ) - x ; } if ( p . p [ y * p 117 | . d [ 0 ] + nx ] > 0 ) { if ( ! e ) { e = t ; elen = 1 ; } else { elen += 118 | 1 ; } } else { if 119 | ( e ) { e = ! t ; try pt ( src 120 | , ts . items , & ti , elen , & 121 | pws ) ; } _ = try w . write ( 122 | " " ) ; } } if ( e ) { e = ! t 123 | 124 | ; try pt ( src , ts . 125 | items , & ti , elen , & pws 126 | ) ; } try w . print ( "\n" , 127 | . { } ) ; if ( ti >= ts . 128 | items . len ) break ; 129 | } n += 1 ; } 130 | try w . flush ( 131 | ) ; } 132 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # obfusgator.zig 2 | 3 | A zig program obfusgator 4 | 5 | For zig 0.15.2 6 | 7 | To self obfusgator: 8 | 9 | ```bash 10 | zig run obfusgator.zig 11 | ``` 12 | 13 | To obfusgator another program: 14 | 15 | ```bash 16 | zig run obfusgator.zig -- myprog.zig 17 | ``` 18 | 19 | ```zig 20 | // zig run obfusgator.zig 21 | // zig run obfusgator.zig -- myprog.zig 22 | 23 | const zd = [ _ ] u8 { 24 | 120 , 156 , 237 , 211 , 203 25 | , 13 , 131 , 48 , 16 , 69 , 26 | 209 , 172 , 93 , 69 , 74 , 27 | 64 , 40 , 160 , 148 , 28 | 65 , 255 , 29 | 205 , 144 , 29 30 | , 66 , 254 , 31 | 105 , 226 , 32 | 121 , 248 , 33 | 243 , 60 , 34 | 119 , 69 , 64 35 | , 25 , 124 , 36 | 12 , 28 , 37 | 187 , 251 , 46 , 38 | 239 , 207 , 226 , 214 , 109 , 39 | 115 , 47 , 75 , 214 , 9 , 170 40 | , 181 , 195 , 15 , 229 , 50 , 102 , 87 , 77 41 | , 226 , 229 , 19 , 229 , 99 , 117 , 133 , 113 , 63 , 199 , 42 | 48 , 243 , 82 , 50 , 175 , 204 , 203 , 234 , 21 , 74 , 205 , 59 , 43 | 104 , 147 , 48 , 175 , 40 , 189 , 25 , 72 , 91 , 47 , 246 , 190 , 18 , 44 | 136 , 121 , 43 , 236 , 128 , 112 , 172 , 102 , 109 , 247 , 131 , 45 | 251 , 165 , 178 , 153 , 209 , 91 , 104 , 118 , 62 , 58 , 7 , 46 | 178 , 54 , 111 , 44 , 106 , 38 , 36 , 148 , 215 , 155 , 47 | 208 , 173 , 23 , 21 , 189 , 215 , 179 , 232 , 191 , 48 | 172 , 174 , 10 , 23 , 159 , 1 , 142 , 232 , 205 , 49 | 188 , 159 , 255 , 214 , 22 , 34 , 140 , 222 , 171 50 | , 17 , 153 , 119 , 56 , 111 , 234 , 60 , 153 , 58 , 51 | 44 , 197 , 143 , 254 , 60 , 211 , 251 , 83 , 123 , 221 , 52 | 165 , 205 , 230 , 85 , 102 , 94 , 202 , 102 , 123 , 159 , 53 | 139 , 191 , 226 , 212 , 31 , 171 , 13 , 196 , 134 , 218 , 183 , 231 , 6 , 62 54 | , 212 , 108 , 112 , 243 , 114 , 120 , 127 , 61 , 197 , 101 , 198 } ; const z 55 | = @import ( "std" ) ; const Ti = z . zig . Tokenizer ; const T = z . zig 56 | . Token ; const a = z . heap . page_allocator ; const io = z . Io ; const 57 | mem = z . mem ; 58 | const fmt = z . fmt ; const u = 59 | undefined ; const sz = 60 | 99999 ; const t = true ; var B 61 | : [ 512 ] u8 = u ; var wB = z 62 | 63 | . fs . File . stdout ( 64 | ) . writer ( & B ) ; const w 65 | = & wB . interface ; pub 66 | const P = struct { d : [ 2 ] 67 | u32 , p : [ ] u1 , 68 | pub fn from ( 69 | ls : [ ] const 70 | u8 ) ! P { var 71 | ln : u32 = 0 72 | ; var p : P 73 | = u ; var r 74 | = io . Reader 75 | . fixed ( ls ) 76 | ; while ( t 77 | ) { const l = 78 | try r . 79 | 80 | 81 | takeDelimiterExclusive ( '\n' ) ; if ( l . len > 0 ) r . 82 | toss ( l . len - 1 ) ; switch ( ln ) { 1 => { var it = mem . 83 | splitAny ( u8 , l , " " ) ; for ( 0 .. 2 ) | i | p . d [ i ] = try fmt 84 | . parseInt ( u32 , it . next ( ) . ? , 10 ) ; } , 3 => { const l2 = 85 | ls [ 13 .. ] ; p . p = try a . alloc ( u1 , p . d [ 0 ] * p . 86 | d [ 1 ] ) ; for ( 0 .. p . d [ 0 ] * p . d [ 1 ] ) | i | 87 | { if ( l2 [ i * 3 ] > 0 or l2 [ i * 3 + 1 ] > 0 or l2 [ 88 | i * 3 + 2 ] > 0 ) { p . p [ i ] = 1 ; } } break ; 89 | } , else => { } , } ln += 1 ; } return p ; } } ; 90 | fn pt ( src : [ ] const u8 , ts : [ ] const T , ti : 91 | * u32 , ncf : u32 , pws : * bool ) ! void { var nc = ncf 92 | ; while ( t ) { if ( ti .* >= ts . len ) { return ; } 93 | const tok = ts [ ti .* ] ; if ( mem . containsAtLeast ( u8 , @tagName ( tok 94 | . tag ) , 1 , "comment" ) ) { ti .* += 1 ; continue ; } var tl : u32 = 95 | @intCast ( ( tok . loc . end - tok . loc . start ) + 1 ) ; if ( ! pws .* 96 | ) tl += 1 ; if ( tl <= nc ) { if ( ! pws .* ) _ = try w . write ( " " ) ; 97 | try w . print ( 98 | "{s} " , . { src [ tok . loc 99 | . start .. tok . loc . end ] } 100 | ) ; pws .* = t ; nc -= tl ; ti 101 | .* += 1 ; } else { for ( 0 102 | 103 | .. nc ) | _ | _ = try w 104 | . write ( " " ) ; return ; } 105 | } } pub fn main ( ) ! void { 106 | _ = try w . write ( "// zig" 107 | ++ " run" ++ 108 | " obfusg" ++ 109 | "ator.zig" ++ 110 | "\n// zig" ++ 111 | " run obfus" 112 | ++ 113 | "gator.zig" 114 | ++ " -- m" ++ 115 | "yprog" ++ 116 | ".zig\n" ) 117 | ; const args = 118 | try z . process . argsAlloc 119 | ( a ) ; var src : [ : 0 ] const 120 | u8 = @embedFile ( "obfusgator.zig" ) ; 121 | if ( args . len > 1 ) { const d = try z . fs . cwd ( ) . 122 | readFileAlloc ( a , args [ 1 ] , sz * sz ) ; src = try a . 123 | dupeZ ( u8 , d ) ; } var reader : io . Reader = . fixed ( & zd ) ; var 124 | db : [ z . compress . flate . max_window_len ] u8 = u ; var dc : z 125 | . compress . flate . Decompress = . init ( & reader , . 126 | zlib , & db ) ; var o : [ sz ] u8 = u ; const rn = try 127 | dc . reader . readSliceShort ( & o ) ; const p = try P . 128 | from ( o [ 0 .. rn ] ) ; var e : bool = ! t ; var 129 | elen : u32 = 0 ; var ts = z . array_list . 130 | Managed ( T ) . init ( a ) ; var tki = Ti . init ( 131 | src ) ; while ( t ) { const tk = tki . next ( ) ; try ts . 132 | append ( tk ) ; if ( tk . tag == . eof ) break ; } var ti : 133 | u32 = 0 ; var pws = t ; var n : u32 = 0 ; while ( ti < ts . items . len ) { 134 | for ( 0 .. p . d [ 1 ] ) | y | { for ( 0 .. p . d [ 0 ] ) | x | { var nx = x 135 | ; if ( n % 2 > 0 ) { nx = ( p . d [ 0 ] - 1 ) - x ; } if ( p . p [ y * p 136 | . d [ 0 ] + nx ] > 0 ) { if ( ! e ) { e = t ; elen = 1 ; } else { elen += 137 | 1 ; } } else { if 138 | ( e ) { e = ! t ; try pt ( src 139 | , ts . items , & ti , elen , & 140 | pws ) ; } _ = try w . write ( 141 | " " ) ; } } if ( e ) { e = ! t 142 | 143 | ; try pt ( src , ts . 144 | items , & ti , elen , & pws 145 | ) ; } try w . print ( "\n" , 146 | . { } ) ; if ( ti >= ts . 147 | items . len ) break ; 148 | } n += 1 ; } 149 | try w . flush ( 150 | ) ; } 151 | ``` 152 | --------------------------------------------------------------------------------