def
GetVmp1BasicBlock():
EntryPoint
=
0x400000
+
0x0037E533
insn
=
ida_ua.insn_t()
qInsnAddr
=
queue.Queue()
qInsnAddr.put(EntryPoint)
while
(
not
qInsnAddr.empty()):
ea
=
start_ea
=
qInsnAddr.get()
if
(IsRedundant(ea)):
continue
while
(ea !
=
0x006FDE0C
):
InsnLen
=
ida_ua.decode_insn(insn, ea)
if
(
0
=
=
InsnLen):
print
(
"decode_insn(ea=0x%08x) failed!"
%
ea)
return
0
if
(insn.itype
in
g_callInsnList
and
insn.ops[
0
].
type
in
g_immOprand):
prevInsn
=
ida_ua.insn_t()
prevAddr
=
ea
-
5
prevLen
=
ida_ua.decode_insn(prevInsn, prevAddr)
if
(
0
=
=
prevLen):
print
(
"decode_insn(0x%08x) failed!"
%
prevAddr)
return
0
if
(ida_allins.NN_push
=
=
prevInsn.itype
and
ida_ua.o_imm
=
=
prevInsn.ops[
0
].
type
):
end_ea
=
ea
+
insn.size
vbb
=
VMPBasicBlock(start_ea, end_ea, insn.ea)
g_vmp1BlockList.append(vbb)
AdjustBlockByJccTarget(insn.ops[
0
].addr)
qInsnAddr.put(insn.ops[
0
].addr)
else
:
ea
=
ea
+
insn.size
continue
break
elif
(insn.itype
in
g_jccInsnList):
end_ea
=
ea
+
insn.size
vbb
=
VMPBasicBlock(start_ea, end_ea, insn.ea)
g_vmp1BlockList.append(vbb)
qInsnAddr.put(end_ea)
jccTarget
=
insn.ops[
0
].addr
AdjustBlockByJccTarget(jccTarget)
qInsnAddr.put(jccTarget)
break
elif
(insn.itype
in
g_jmpInsnList):
end_ea
=
ea
+
insn.size
vbb
=
VMPBasicBlock(start_ea, end_ea, insn.ea)
g_vmp1BlockList.append(vbb)
if
(insn.ops[
0
].
type
in
g_immOprand):
JmpTarget
=
insn.ops[
0
].addr
AdjustBlockByJccTarget(JmpTarget)
qInsnAddr.put(JmpTarget)
elif
(ida_ua.o_reg
=
=
insn.ops[
0
].
type
):
for
JmpTarget
in
g_jmpRegDict[ea]:
AdjustBlockByJccTarget(JmpTarget)
qInsnAddr.put(JmpTarget)
break
elif
(ida_allins.NN_retn
=
=
insn.itype):
end_ea
=
ea
+
insn.size
vbb
=
VMPBasicBlock(start_ea, end_ea, insn.ea)
g_vmp1BlockList.append(vbb)
if
(
None
=
=
g_RetAddrDict.get(insn.ea)):
print
(
"warning:cannot find ret target! address:0x%08x"
%
insn.ea)
break
for
JmpTarget
in
g_RetAddrDict[insn.ea]:
if
(JmpTarget <
0x63b000
or
JmpTarget >
0x820000
):
print
(
"ret from 0x%08x to 0x%08x"
%
(ea, JmpTarget))
continue
AdjustBlockByJccTarget(JmpTarget)
qInsnAddr.put(JmpTarget)
break
else
:
ea
=
ea
+
insn.size
if
(IsRedundant(ea)):
vbb
=
VMPBasicBlock(start_ea, ea, insn.ea)
g_vmp1BlockList.append(vbb)
break
return
1