IDA
代码
将函数传入的参数指针,取值后Xor3计算的结果,作为返回值的重命名参数:
汇编
取“push offset [地址]”中地址保存的值,Xor 3:
IDA Python
文件:544A6B033668548D57574702DD13E3BE
import idc
import idaapi
import easygui
def GetAdd_StrXored3(addr):
# prev_head:获取上一行汇编
addr = prev_head(addr)
# print_insn_mnem:获取操作符
# print_operand:获取操作数
if print_insn_mnem(addr) == "push" and "offset" in print_operand(addr,0):
#get_operand_value:获取操作值
return get_operand_value(addr,0)
else:
return 0
def GetStr_Xored3(addr):
outChar = ""
while(True):
byte = idaapi.get_byte(addr)
if byte != 0:
outChar += chr(byte)
else:
break
addr += 1
return outChar
def GetStr_Decoded(str):
#加密Key值
key = 3
i = 0
outChar = ""
length = len(str)
while i < length:
outChar += chr(ord(str[i]) ^ key)
i += 1
return outChar
if __name__ == '__main__':
strFunction = easygui.enterbox("请输入解密函数地址:\r\n*544A6B033668548D57574702DD13E3BE样本为402901")
addFunction = int(strFunction, 16)
print("解密函数地址:", hex(addFunction).upper()[2:])
for x in XrefsTo(addFunction, flags = 0):
addStrXored3 = GetAdd_StrXored3(x.frm)
if addStrXored3 != 0:
strXored3 = GetStr_Xored3(addStrXored3)
strDecoded = GetStr_Decoded(strXored3)
print("加密 | 解密:", strXored3, " | ", strDecoded)
set_cmt(prev_head(x.frm), strDecoded, 0)
else:
continue
print("结束")
运行
打印
找BUG
个数不对,总共35处调用,打印结果是18个。
打印出交叉引用的函数地址和参数地址,发现有多个参数地址为0值:
汇编代码不同
即使是同一个函数,但是传输传递的方式有可能不同,该样本传递的参数有两种传参方式。
解决方案
对操作符为mov的上一行汇编,再取上一行地址。