diff options
author | Wladimir J. van der Laan <laanwj@gmail.com> | 2013-09-25 09:59:31 +0200 |
---|---|---|
committer | Wladimir J. van der Laan <laanwj@gmail.com> | 2013-09-25 10:01:16 +0200 |
commit | 27f5349326d4e432a71edd5d00372dd11d32a06d (patch) | |
tree | bc898138ab4647f24c963fdf838ad042927e19dc /tools | |
parent | a2c4be45d43425fdfb34ae91e6695f61cf1df549 (diff) |
tools: add deobfuscator for v4-uapi
Diffstat (limited to 'tools')
-rw-r--r-- | tools/deobfuscate-simple2-vivante.pl | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/tools/deobfuscate-simple2-vivante.pl b/tools/deobfuscate-simple2-vivante.pl new file mode 100644 index 0000000..03973ab --- /dev/null +++ b/tools/deobfuscate-simple2-vivante.pl @@ -0,0 +1,31 @@ +# deobfuscation for alternative gcmXXX macros +# - Make u32 type configurable (for uapi) +# - Modify macros to take a bit field instead of register name and field +# - Add gcmGETFIELD +$bitfield = '\d+:\d+|[A-Z_a-z]+'; +$id = '[^()]+|[^()]*(?:(\((?:[^()]++|(?-1))*+\))[^()]*)*'; +$hex = '0x[0-9a-fA-F]+'; +# 32-bit type +$u32 = 'u32'; +#$u32 = 'gctUINT32'; + +$sub = ""; +$name = ""; +undef $prev; + +while (<>) { + s/\(0 ?\? ?($bitfield)\)/__gcmSTART(\1)/g; + s/\(1 ?\? ?($bitfield)\)/__gcmEND(\1)/g; + s/\(__gcmEND\(($bitfield)\) ?- ?__gcmSTART\(\1\) ?\+ ?1\)/__gcmGETSIZE(\1)/g; + s/\(\($u32\) ?\(\(__gcmGETSIZE\(($bitfield)\) ?== ?32\) ?\? ?~0 ?: ?\(~\(~0 ?\<\< ?__gcmGETSIZE\((?-1)\)\)\)\)\)/__gcmMASK(\1)/g; + s/\(\(\($u32\) ?\(($id)\)\) ?\<\< ?__gcmSTART\((?<field>$bitfield)\)\)/__gcmALIGN(\1, $+{field})/g; + s/\( ?__gcmALIGN\(__gcmMASK\((?<field>$bitfield)\), ?(?-1)\) ?\)/gcmFIELDMASK($+{field})/g; + s/\( ?\(\(\($u32\) ?\((?<data>$id)\)\) ?& ?~__gcmALIGN\(__gcmMASK\((?<field>$bitfield)\), ?\g{field}\)\) ?\| ?__gcmALIGN\(\($u32\) ?\((?<value>$id)\) ?& ?__gcmMASK\(\g{field}\), ?\g{field}\) ?\)/gcmSETFIELD($+{data}, $+{field}, $+{value})/g; + # SETFIELD without u32 cast?! + s/\( ?\(\(\($u32\) ?\((?<data>$id)\)\) ?& ?~__gcmALIGN\(__gcmMASK\((?<field>$bitfield)\), ?\g{field}\)\) ?\| ?__gcmALIGN\((?<value>$id) ?& ?__gcmMASK\(\g{field}\), ?\g{field}\) ?\)/gcmSETFIELD($+{data}, $+{field}, $+{value})/g; + s/\( ?\(\(\($u32\) ?\((?<data>$id)\)\) ?\>\> ?__gcmSTART\((?<field>$bitfield)\) ?& ?__gcmMASK\(\g{field}\)\) ?== ?\((?<value>$id) ?& ?__gcmMASK\(\g{field}\) ?\) ?\)/gcmVERIFYFIELDVALUE($+{data}, $+{field}, $+{value})/g; + + s/\( ?\(\(\(\(u32\) ?\((?<data>$id)\)\) ?>> ?__gcmSTART\((?<field>$bitfield)\)\) ?& ?__gcmMASK\(\g{field}\)\) ?\)/gcmGETFIELD($+{data}, $+{field})/g; + + print; +} |