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