Thread overview | ||||||
---|---|---|---|---|---|---|
|
April 07, 2007 compile time string manipulation | ||||
---|---|---|---|---|
| ||||
I'm trying to change a string at compile time to avoid static analysis. Example: T[] obfuscate(T)( T[] buf ) { return cast(char)(buf[0] ^ 0xCC) ~ obfuscate( buf[1..$] ); } char []unobfuscate( char []str ) { char []result = new char[str.length]; foreach ( idx, c; str ) { result[idx] = c ^ 0xCC; } return result; } in my code I have something like Stdout.formatln( "hello {0}", unobfuscate( obfuscate( "world!" ) ) ); What I'd like to happen, is for obfuscate to get evaluated at compile time so that instead of "world!" being visible in my executable's binary data, it would be something like 0x77 0x6F 0x72 0x6C 0x64 0x21. unobfuscate would get called at runtime and would transform the string back to it's original form. Any ideas? (Note: I'm aware that obfuscate will throw an ArrayOutOfBounds exception, it's just to explain what I'm trying to do). Thanks in advance! |
April 07, 2007 Re: compile time string manipulation | ||||
---|---|---|---|---|
| ||||
Posted in reply to akcom Attachments: | akcom schrieb am 2007-04-07: > I'm trying to change a string at compile time to avoid static analysis. Example: > > T[] obfuscate(T)( T[] buf ) > { > return cast(char)(buf[0] ^ 0xCC) ~ obfuscate( buf[1..$] ); > } > > char []unobfuscate( char []str ) > { > char []result = new char[str.length]; > foreach ( idx, c; str ) > { > result[idx] = c ^ 0xCC; > } > return result; > } > > in my code I have something like Stdout.formatln( "hello {0}", > unobfuscate( obfuscate( "world!" ) ) ); > What I'd like to happen, is for obfuscate to get evaluated at compile time > so that instead of "world!" being visible in my executable's binary data, it > would be something like 0x77 0x6F 0x72 0x6C 0x64 0x21. unobfuscate would > get called at runtime and would transform the string back to it's original > form. Any ideas? (Note: I'm aware that obfuscate will throw an > ArrayOutOfBounds exception, it's just to explain what I'm trying to do). # char[] obfuscate(char[] buf){ # char[] result; # foreach(c; buf){ # result ~= c ^ 0xCC; # } # return result; # } # # template compiletime(char[] m){ # const compiletime = m; # } # # import std.stdio; # # void main(){ # writefln("%s", cast(ubyte[]) compiletime!(obfuscate("hello!"))); # } Thomas |
April 07, 2007 Re: compile time string manipulation | ||||
---|---|---|---|---|
| ||||
Posted in reply to Thomas Kuehne | Unfortunately the string still shows up in plain text in my executable. Regards, Alex "Thomas Kuehne" <thomas-dloop@kuehne.cn> wrote in message news:slrnf1ekkm.cq2.thomas-dloop@birke.kuehne.cn... > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA1 > > akcom schrieb am 2007-04-07: >> I'm trying to change a string at compile time to avoid static analysis. Example: >> >> T[] obfuscate(T)( T[] buf ) >> { >> return cast(char)(buf[0] ^ 0xCC) ~ obfuscate( buf[1..$] ); >> } >> >> char []unobfuscate( char []str ) >> { >> char []result = new char[str.length]; >> foreach ( idx, c; str ) >> { >> result[idx] = c ^ 0xCC; >> } >> return result; >> } >> >> in my code I have something like Stdout.formatln( "hello {0}", >> unobfuscate( obfuscate( "world!" ) ) ); >> What I'd like to happen, is for obfuscate to get evaluated at compile >> time >> so that instead of "world!" being visible in my executable's binary data, >> it >> would be something like 0x77 0x6F 0x72 0x6C 0x64 0x21. unobfuscate would >> get called at runtime and would transform the string back to it's >> original >> form. Any ideas? (Note: I'm aware that obfuscate will throw an >> ArrayOutOfBounds exception, it's just to explain what I'm trying to do). > > # char[] obfuscate(char[] buf){ > # char[] result; > # foreach(c; buf){ > # result ~= c ^ 0xCC; > # } > # return result; > # } > # > # template compiletime(char[] m){ > # const compiletime = m; > # } > # > # import std.stdio; > # > # void main(){ > # writefln("%s", cast(ubyte[]) compiletime!(obfuscate("hello!"))); > # } > > Thomas > > > -----BEGIN PGP SIGNATURE----- > > iD8DBQFGF1KLLK5blCcjpWoRAlxyAJ45HvncahcYt7wsfxiJtkRw7Kfr3gCfc4bI > 6lXl/OqnVHLQPpCJlSNzs0o= > =eHGg > -----END PGP SIGNATURE----- |
April 07, 2007 Re: compile time string manipulation | ||||
---|---|---|---|---|
| ||||
Posted in reply to Thomas Kuehne | Nevermind, I made a stupid mistake. Thank you very much for your help :) "Thomas Kuehne" <thomas-dloop@kuehne.cn> wrote in message news:slrnf1ekkm.cq2.thomas-dloop@birke.kuehne.cn... > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA1 > > akcom schrieb am 2007-04-07: >> I'm trying to change a string at compile time to avoid static analysis. Example: >> >> T[] obfuscate(T)( T[] buf ) >> { >> return cast(char)(buf[0] ^ 0xCC) ~ obfuscate( buf[1..$] ); >> } >> >> char []unobfuscate( char []str ) >> { >> char []result = new char[str.length]; >> foreach ( idx, c; str ) >> { >> result[idx] = c ^ 0xCC; >> } >> return result; >> } >> >> in my code I have something like Stdout.formatln( "hello {0}", >> unobfuscate( obfuscate( "world!" ) ) ); >> What I'd like to happen, is for obfuscate to get evaluated at compile >> time >> so that instead of "world!" being visible in my executable's binary data, >> it >> would be something like 0x77 0x6F 0x72 0x6C 0x64 0x21. unobfuscate would >> get called at runtime and would transform the string back to it's >> original >> form. Any ideas? (Note: I'm aware that obfuscate will throw an >> ArrayOutOfBounds exception, it's just to explain what I'm trying to do). > > # char[] obfuscate(char[] buf){ > # char[] result; > # foreach(c; buf){ > # result ~= c ^ 0xCC; > # } > # return result; > # } > # > # template compiletime(char[] m){ > # const compiletime = m; > # } > # > # import std.stdio; > # > # void main(){ > # writefln("%s", cast(ubyte[]) compiletime!(obfuscate("hello!"))); > # } > > Thomas > > > -----BEGIN PGP SIGNATURE----- > > iD8DBQFGF1KLLK5blCcjpWoRAlxyAJ45HvncahcYt7wsfxiJtkRw7Kfr3gCfc4bI > 6lXl/OqnVHLQPpCJlSNzs0o= > =eHGg > -----END PGP SIGNATURE----- |
Copyright © 1999-2021 by the D Language Foundation