Я недавно прочитал эту статью Dalvik Bytecode Obfuscation на Android
Я также скачал исходный код по адресу https://github.com/thuxnder/dalvik-obfuscator/blob/master/injector.py
Я понимаю, что этот метод заключается в переборе всех методов, вставке ненужных байтов в блок кода и безусловном переходе перед блоком кода (чтобы гарантировать, что блок кода никогда не будет выполнен).
Однако я не знаком со скриптом Python, поэтому у меня возникли проблемы с пониманием блока кода со строки 204 по 212, который вызывает исключение:
def _obfuscator_arrayDataOverlayIf(self, method):
obfuscator = array.array('c', "\x32\x00\x09\x00\x26\x00\x03\x00\x00\x00\x00\x03\x01\x00\x00\x00\x00\x00")
size = method.getMethodSize()
if size == 0:
print "skip method @ 0x%x" % method._offset
return
payloadlen = size-len(obfuscator)
struct.pack_into('I', obfuscator, 14, payloadlen)
return method.obfuscate(obfuscator)
Я был бы признателен, если бы кто-нибудь объяснил мне, что делает этот блок кода, чтобы я мог уловить идею автора.
Изменить: обратная трассировка выглядит следующим образом:
Traceback (most recent call last):
File "C:\Apps\EclipsePortable\Data\workspace\DalvikObfuscator\DalvikObfuscator\injector.py", line 216, in <module>
inj.obfuscate()
File "C:\Apps\EclipsePortable\Data\workspace\DalvikObfuscator\DalvikObfuscator\injector.py", line 196, in obfuscate
if reduce(lambda op1,op2: op1 or op2, map(self._obfuscator_arrayDataOverlayIf, method), False):
File "C:\Apps\EclipsePortable\Data\workspace\DalvikObfuscator\DalvikObfuscator\injector.py", line 209, in _obfuscator_arrayDataOverlayIf
struct.pack_into('I', obfuscator, 14, payloadlen)
struct.error: integer out of range for 'I' format code