MapoEngine简单的自动化反汇编工具
0x00 指令解释关于handler分析在我另一篇文章(https://www.52pojie.cn/thread-773387-1-1.html)中已经非常详细的说明了,以下是handler特征码以及说明,如果以后有更新可以更改mapo.py中定义的特征码。
'VM_PushRealStackTop32':['mov eax, dword ptr ','sub ebp, 4','mov dword ptr , eax'] 压入esp指向的值到栈上
'VM_PopR32':['movsx eax, byte ptr ','mov edx, dword ptr ','add ebp, 4','mov dword ptr , edx'] 将32位的值弹到寄存器上
'VM_Add32':['mov eax, dword ptr ','add ebp, 4','add dword ptr , eax'] 将栈上的两个值相加
'VM_PushR16':['movsx eax, byte ptr ','mov ax, word ptr ','mov word ptr , ax'] 压入16位的寄存器值
'VM_ExecRealInst':['mov dword ptr , esi','push dword ptr ','popfd','ret'] 退出虚拟机,执行未虚拟化的代码
'VM_PopSp':['mov eax, dword ptr ','mov ebp, eax'] 设置vm_esp的值
'VM_PushStackTop32':['mov eax, dword ptr ','sub ebp, 4','mov dword ptr , eax']将栈上的值再次压入栈
'VM_PushI8':['mov al, byte ptr ','sub ebp, 1','mov byte ptr , al'] 压入8位立即数
'VM_Nop':[] 无操作
'VM_Popfd':['pushfd','pop dword ptr '] 将真实flag寄存器压入虚拟机的flag寄存器中
'VM_Extend16To32':['movzx eax, word ptr ','sub ebp, 2','mov dword ptr , eax']将16位值扩展成32位
'VM_PushI16':['mov ax, word ptr ','sub ebp, 2','mov word ptr , ax'] 压入16位立即数
'VM_Nor32':['mov edx, dword ptr ','not eax','not edx','add ebp, 4','and eax, edx','mov dword ptr , eax'] 将栈上两个值nor
'VM_PopRealfd':['push dword ptr ','popfd']将虚拟机的flag弹出到真实的寄存器
'VM_Retn':['push dword ptr ','popfd','ret'] 退出虚拟机
'VM_Shr32':['mov ecx, dword ptr ','mov eax, dword ptr ','shr eax, cl','add ebp, 4','mov dword ptr , eax'] 右移
'VM_PushI32':['mov eax, dword ptr ','sub ebp, 4','mov dword ptr , eax'] 压入32位的立即数
'VM_ShortJMP':['mov edx, dword ptr ','imul edx','add esi, edx'] 短跳转
'VM_ReadDs16':['mov eax, dword ptr ','mov ax, word ptr ','mov word ptr , ax'] 读16位内存值
'VM_CALL':['push dword ptr ','pop dword ptr ','lea esp, dword ptr ','push dword ptr ','ret'] 退出虚拟机,函数调用
'VM_ReadDs8':['mov eax, dword ptr ','mov al, byte ptr ','mov byte ptr , al'] 读8位内存值
'VM_Neg_':['mov eax, dword ptr ','neg eax','inc eax','mov dword ptr , eax'] 求补码后+1
'VM_Imul32':['mov eax, dword ptr ','mov edx, dword ptr ','imul edx','mov dword ptr , eax','mov dword ptr , edx'] 将栈上两个值mul
'VM_JMP':['movzx eax, byte ptr ','add ebp, 4','mov esi, dword ptr ','add ebp, 8'] 根据标志位进行跳转
'VM_PopR16':['mov dx, word ptr ','add ebp, 2','mov word ptr , dx'] 将16位的值弹到寄存器上
'VM_AddSp':['movzx eax, word ptr ','add ebp, eax'] 调整栈指针
'VM_Sub32':['mov eax, dword ptr ','add ebp, 4','sub dword ptr , eax']将栈上两个值sub
'VM_WriteDs32':['mov eax, dword ptr ','mov edx, dword ptr ','mov dword ptr , edx'] 写32位内存
'VM_WriteDs8':['mov eax, dword ptr ','mov dl, byte ptr ','mov byte ptr , dl'] 写8位内存
'VM_PushR32':['movsx eax, byte ptr ','mov eax, dword ptr ','sub ebp, 4','mov dword ptr , eax'] 压入32位的寄存器值
'VM_WriteDs16':['mov eax, dword ptr ','mov dx, word ptr ','mov word ptr , dx'] 写16位内存
'VM_PopR8':['mov dl, byte ptr ','add ebp, 1','mov byte ptr , dl'] 将8位的值弹到寄存器上
'VM_ReadDs32':['mov eax, dword ptr ','mov eax, dword ptr ','mov dword ptr , eax'] 读32位内存值
'VM_PushR8':['movsx eax, byte ptr ','add esi, 1','mov al, byte ptr ','sub ebp, 1','mov byte ptr , al'] 压入8位的寄存器值
'VM_GetAddESP':['movzx eax, byte ptr ','lea eax, dword ptr ','sub ebp, 4','mov dword ptr , eax'] 获取esp+某个立即数后的值
'VM_Neg':['mov eax, dword ptr ','neg eax','mov dword ptr , eax'] 求补码
'VM_Extend8To32':['movsx eax, byte ptr ','sub ebp, 3','mov dword ptr , eax'] 将8位值扩展成32位
0x01 工具功能
自动化识别handler
自动化反汇编(这里和反虚拟化有非常大的距离,只用于辅助分析)
效果图:
e语言 的oep:
反汇编如下:
0x02 补充
这个工具花了2到3天编写,有bug在所难免,不过代码是开源的,如果有需要可以自己修改,个人的精力终究有限。
提前祝大家新年快乐!!!{:301_988:} 这个好 收下了 本帖最后由 凉游浅笔深画眉 于 2018-12-31 17:53 编辑
支持一波晴天师傅{:301_977:} 感谢楼主分享 !膜拜 前排支持一波晴天dalao{:301_977:} 晴天师傅牛皮 卧槽 这么炸天 支持一波{:1_893:} 优秀软件安全工具和文档 支持一下 楼主很棒,支持一下 手动支持一波 感觉楼主好厉害!