Проблема с capstone.Cs.disasm

Есть такой код:

from capstone import *

with open('file.so', "rb") as f:
    file = f.read()
    md = Cs(CS_ARCH_ARM64, CS_MODE_ARM)
    b = md.disasm(file, 0x0)
    for i in b:
        ....

file.so (60мб) - Андроид ELF arm64(arm64-v8) библиотека, ссылка: https://yadi.sk/d/f8DsmsF1CDTiZw

Проблема в том что код не заходит в цикл. Я попробовал много разных вариантов, но ничего не выходит. Есть ли способ это как-то исправить?


Ответы (1 шт):

Автор решения: CrazyElf

Перебрал все возможные типы и режимы с помощью такого кода. Один тип пришлось исключить - на нём переполнялась память и Google Colab падал, видимо, левота какая-то совсем дизассемблировалась.

#!pip install capstone

from capstone import *

filename = 'file.so'

arch_list = [cs for cs in dir() if cs.startswith('CS_ARCH') and cs != 'CS_ARCH_M680X']
mode_list = [cs for cs in dir() if cs.startswith('CS_MODE')]

with open(filename, "rb") as f:
    file = f.read()
    for arch in arch_list:
        for mode in mode_list:
            #print(arch, mode)
            a = globals()[arch]
            m = globals()[mode]
            try:
                md = Cs(a, m)
                b = md.disasm(file, 0x0)
                for j,i in enumerate(b):
                    if j == 0:
                        print(arch, mode)
                    print("0x%x:\t%s\t%s" %(i.address, i.mnemonic, i.op_str))
                    if j > 1:
                        print()
                        break
            except:
                pass

print('That"s all')

Из ARM вариантов загрузились только такие (тип, режим и три строки дизассемблированного кода):

CS_ARCH_ARM CS_MODE_BIG_ENDIAN
0x0:    svcvc   #0x454c46
0x4:    andeq   r0, r1, #0, #2
0x8:    andeq   r0, r0, r0

CS_ARCH_ARM CS_MODE_M680X_6801
0x0:    cmp r7, pc
0x2:    mov r4, sb
0x4:    lsls    r2, r0, #4

CS_ARCH_ARM CS_MODE_M68K_030
0x0:    cmp r7, pc
0x2:    mov r4, sb
0x4:    lsls    r2, r0, #4

CS_ARCH_ARM CS_MODE_MICRO
0x0:    cmp r7, pc
0x2:    mov r4, sb
0x4:    lsls    r2, r0, #4

CS_ARCH_ARM CS_MODE_QPX
0x0:    cmp r7, pc
0x2:    mov r4, sb
0x4:    lsls    r2, r0, #4

CS_ARCH_ARM CS_MODE_THUMB
0x0:    cmp r7, pc
0x2:    mov r4, sb
0x4:    lsls    r2, r0, #4

CS_ARCH_ARM CS_MODE_V9
0x0:    cmp r7, pc
0x2:    mov r4, sb
0x4:    lsls    r2, r0, #4

C CS_ARCH_ARM64 ни в одном режиме загрузить этот файл не удалось.

На всякий всё же приведу ещё часть вариантов, вдруг они тоже на что-то похожи. По остальным вариантам дальше одной строки дизассемблер не пошёл:

CS_ARCH_X86 CS_MODE_16
0x0:    jg  0x47
0x2:    dec sp
0x3:    inc si

CS_ARCH_X86 CS_MODE_32
0x0:    jg  0x47
0x2:    dec esp
0x3:    inc esi

CS_ARCH_X86 CS_MODE_64
0x0:    jg  0x47
0x2:    add r8b, byte ptr [rcx]
0x6:    add dword ptr [rax], eax

CS_ARCH_X86 CS_MODE_ARM
0x0:    jg  0x47
0x2:    add r8b, byte ptr [rcx]
0x6:    add dword ptr [rax], eax

CS_ARCH_X86 CS_MODE_LITTLE_ENDIAN
0x0:    jg  0x47
0x2:    add r8b, byte ptr [rcx]
0x6:    add dword ptr [rax], eax

CS_ARCH_X86 CS_MODE_M680X_6301
0x0:    jg  0x47
0x2:    dec sp
0x3:    inc si

CS_ARCH_X86 CS_MODE_M680X_6309
0x0:    jg  0x47
0x2:    dec esp
0x3:    inc esi

CS_ARCH_X86 CS_MODE_M680X_6800
0x0:    jg  0x47
0x2:    add r8b, byte ptr [rcx]
0x6:    add dword ptr [rax], eax

CS_ARCH_X86 CS_MODE_M68K_000
0x0:    jg  0x47
0x2:    dec sp
0x3:    inc si

CS_ARCH_X86 CS_MODE_M68K_010
0x0:    jg  0x47
0x2:    dec esp
0x3:    inc esi

CS_ARCH_X86 CS_MODE_M68K_020
0x0:    jg  0x47
0x2:    add r8b, byte ptr [rcx]
0x6:    add dword ptr [rax], eax

CS_ARCH_X86 CS_MODE_MIPS32
0x0:    jg  0x47
0x2:    dec esp
0x3:    inc esi

CS_ARCH_X86 CS_MODE_MIPS64
0x0:    jg  0x47
0x2:    add r8b, byte ptr [rcx]
0x6:    add dword ptr [rax], eax

CS_ARCH_XCORE CS_MODE_ARM
0x0:    or  r3, r7, r11
0x2:    or  r4, r11, r8
0x4:    stw r4, r4[2]

CS_ARCH_XCORE CS_MODE_BIG_ENDIAN
0x0:    or  r3, r7, r11
0x2:    or  r4, r11, r8
0x4:    stw r4, r4[2]

CS_ARCH_XCORE CS_MODE_LITTLE_ENDIAN
0x0:    or  r3, r7, r11
0x2:    or  r4, r11, r8
0x4:    stw r4, r4[2]

Перебрал потом ещё отдельно для CS_ARCH_ARM64 все моды и точки входа от 0 до 0x10000 - и ничего так и не загрузилось.

→ Ссылка