1

最近、この記事を読みました AndroidでのDalvik Bytecode Obfuscation

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
4

1 に答える 1

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

payloadlenこの行は、char 配列のオフセット 14 に unsigned int として書き込みますobfuscator。たとえば、値が負の場合、範囲外になります。負の値を許可する必要がある場合は、signed int の意味に変更'I'します。'i'

モジュールのドキュメントも参照してくださいstruct

于 2012-10-29T07:36:27.807 に答える