四种大整数结构from idc import get_bytes
def origin_data2bignum(data):# 标准 MIRACL 表示
bignum = 0
for i in range(len(data)):
r = data[i] & 0x3FFFFFFF
bignum |= r << (30 * i)
return bignum
def bignumat(addr): # 结构体里内联存放 digit 版本
digtsLen = int.from_bytes(get_bytes(addr, 4), 'little')
if digtsLen >= 0x1000:
return 0
digtsAddr = addr + 4
data = []
for i in range(digtsLen):
data.append(int.from_bytes(get_bytes(digtsAddr + i * 4, 4), 'little'))
return origin_data2bignum(data)
def bignum1at(addr): # 指针型结构(动态分配 digit 数组)
digitsAddr = int.from_bytes(get_bytes(addr, 4), 'little')
digitsLen = int.from_bytes(get_bytes(addr + 4, 4), 'little')
data = get_bytes(digitsAddr, digitsLen * 4)
return int.from_bytes(data, 'little')
def bignum3at(addr): #
digtsLen = int.from_bytes(get_bytes(addr, 4), 'little')
digtsAddr = int.from_bytes(get_bytes(addr + 0xc, 4), 'little')
data = []
for i in range(digtsLen):
data.append(int.from_bytes(get_bytes(digtsAddr + i * 4, 4), 'little'))
return origin_data2bignum(data)