Проблема с 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 шт):
Перебрал все возможные типы и режимы с помощью такого кода. Один тип пришлось исключить - на нём переполнялась память и 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 - и ничего так и не загрузилось.