Обфускация байт-кода Dalvik на Android

Я недавно прочитал эту статью 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

person Krypton    schedule 29.10.2012    source источник
comment
Какое исключение вы получаете? Пожалуйста, опубликуйте трассировку.   -  person Janne Karila    schedule 29.10.2012
comment
Трассировка находится в части редактирования   -  person Krypton    schedule 29.10.2012


Ответы (1)


struct.pack_into('I', obfuscator, 14, payloadlen)

Эта строка записывает payloadlen как целое число без знака по смещению 14 в массиве символов obfuscator. Например, если значение отрицательное, оно будет вне допустимого диапазона. Если должны быть разрешены отрицательные значения, измените 'I' на 'i', что означает целое число со знаком.

См. также struct документацию по модулю.

person Janne Karila    schedule 29.10.2012
comment
Я хочу чего-то большего, автор не предоставляет подробной документации по своему исходному коду. Мне нужно понять, что делает блок кода выше - person Krypton; 29.10.2012