云涯历险记

热爱可抵万难

云涯历险记

热爱可抵万难

恶意代码技术理论

恶意代码技术理论:IDAPython应用实例

解决Findr混淆

findr混淆第一版

def patch_jcc32(addr):#addr是一个字节
PatchByte(addr, 0x90)
PatchByte(addr+1, 0xE9)
PatchWord(addr+6, 0x9090)
PatchDword(addr+8,0x90909090)
def is_jump_near_pair(addr):
jcc1 = Byte(addr+1)
jcc2 = Byte(addr+7)
if Byte(addr) != 0x0F or Byte(addr+6) != 0x0F:
return False

if (jcc1 & 0xF0 != 0x80) or (jcc2 & 0xF0 != 0x80):
return False

if abs(jcc1-jcc2) != 1:
return False

dst1 = Dword(addr+2)
dst2 = Dword(addr+8)

if dst1-dst2 != 6:
print 'err'
return False
return True

def patch_jcc8(addr):
PatchByte(addr, 0xEB)
PatchWord(addr+2, 0x9090)

def is_jcc8(b):
return b&0xF0 == 0x70
def is_jump_short_pair(addr):
jcc1 = Byte(addr)
jcc2 = Byte(addr+2)
if not is_jcc8(jcc1) or not is_jcc8(jcc2):
return False
if abs(jcc2 - jcc1) != 1:
return False
dst1 = Byte(addr+1)
dst2 = Byte(addr+3)
if dst1 - dst2 != 2:
return False
return True

near_addr = 0x0117CC55
short_addr = 0x0117CAE5
near = is_jump_near_pair(near_addr)
short = is_jump_short_pair(short_addr)
if near== True:
patch_jcc32(near_addr)
print 'near_yes'
else:
print 'near_no'

if short== True:
patch_jcc8(short_addr)
print 'short_yes'
else:
print 'short_no'

第二版

def patch_jcc32(addr):#addr是一个字节
PatchByte(addr, 0x90)
PatchByte(addr+1, 0xE9)
PatchWord(addr+6, 0x9090)
PatchDword(addr+8,0x90909090)
def is_jump_near_pair(addr):
jcc1 = Byte(addr+1)
jcc2 = Byte(addr+7)
if Byte(addr) != 0x0F or Byte(addr+6) != 0x0F:
return False

if (jcc1 & 0xF0 != 0x80) or (jcc2 & 0xF0 != 0x80):
return False

if abs(jcc1-jcc2) != 1:
return False

dst1 = Dword(addr+2)
dst2 = Dword(addr+8)

if dst1-dst2 != 6:
print 'err'
return False
return True

def patch_jcc8(addr):
PatchByte(addr, 0xEB)
PatchWord(addr+2, 0x9090)

def is_jcc8(b):
return b&0xF0 == 0x70
def is_jump_short_pair(addr):
jcc1 = Byte(addr)
jcc2 = Byte(addr+2)
if not is_jcc8(jcc1) or not is_jcc8(jcc2):
return False
if abs(jcc2 - jcc1) != 1:
return False
dst1 = Byte(addr+1)
dst2 = Byte(addr+3)
if dst1 - dst2 != 2:
return False
return True


import idc
start = 0x0117C773
end = 0x0117D241

addr = start
while addr <= end:
near = is_jump_near_pair(addr)
short = is_jump_short_pair(addr)
print hex(addr),near,short
if near == True:
patch_jcc32(addr)
print 'near_yes'
if short == True:
patch_jcc8(addr)
print 'short_yes'
addr = NextHead(addr,end)

 

混淆地方归零通用

import idaapi
start = here()
end = NextHead(start)
for ea in range(start,end):
PatchByte(ea,0x90)
Jump(end)
Refresh()

 

解密应用

参考链接:

https://unit42.paloaltonetworks.com/using-idapython-to-make-your-life-easier-part-1/

https://unit42.paloaltonetworks.com/using-idapython-to-make-your-life-easier-part-2/