⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vm.cpp

📁 Ollydbg环境下的一款插件源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
        break;

    case MC_SHR:
        lVal_dest >>= lVal_src;
        break;

    case MC_CMP:
        m_Cpu.eflags.cf = lVal_dest < lVal_src;
        m_Cpu.eflags.zf = (0 == (lVal_dest - lVal_src));
        goto Exit1;

    default:
        goto Exit0;
    }

    m_Cpu.reg[*rt_dest] = lVal_dest;

Exit1:
    nRetCode = SetODReg(rt_dest, lVal_dest);
    OM_PROCESS_ERROR(nRetCode);
    nRetResult = 1;
Exit0:
    return nRetResult;
}

int CVM::SetODReg(
    /* [in] */  const REGISTERTYPE *rt_dest,
    /* [in] */  const long lVal_dest
)
{
    ASSERT(rt_dest);

    int nRetResult = 0;

    t_thread* pt = Findthread(Getcputhreadid());
    OM_PROCESS_ERROR(pt);

    switch (*rt_dest)
    {
    case OD_REG_EAX:
        pt->reg.r[0] = lVal_dest;
        break;
    case OD_REG_ECX:
        pt->reg.r[1] = lVal_dest;
        break;
    case OD_REG_EDX:
        pt->reg.r[2] = lVal_dest;
        break;
    case OD_REG_EBX:
        pt->reg.r[3] = lVal_dest;
        break;
    case OD_REG_ESP:
        pt->reg.r[4] = lVal_dest;
        break;
    case OD_REG_EBP:
        pt->reg.r[5] = lVal_dest;
        break;
    case OD_REG_ESI:
        pt->reg.r[6] = lVal_dest;
        break;
    case OD_REG_EDI:
        pt->reg.r[7] = lVal_dest;
        break;
    case OD_REG_EIP:
        pt->reg.ip = lVal_dest;
        break;
    case OD_REG_EFLAGS_CF:
        pt->reg.flags &= ~(1 << 0);
        pt->reg.flags |= (!!lVal_dest) << 0;
        break;
    case OD_REG_EFLAGS_PF:
        pt->reg.flags &= ~(1 << 2);
        pt->reg.flags |= (!!lVal_dest) << 2;
        break;
    case OD_REG_EFLAGS_AF:
        pt->reg.flags &= ~(1 << 4);
        pt->reg.flags |= (!!lVal_dest) << 4;
        break;
    case OD_REG_EFLAGS_ZF:
        pt->reg.flags &= ~(1 << 6);
        pt->reg.flags |= (!!lVal_dest) << 6;
        break;
    case OD_REG_EFLAGS_SF:
        pt->reg.flags &= ~(1 << 7);
        pt->reg.flags |= (!!lVal_dest) << 7;
        break;
    case OD_REG_EFLAGS_DF:
        pt->reg.flags &= ~(1 << 10);
        pt->reg.flags |= (!!lVal_dest) << 10;
        break;
    case OD_REG_EFLAGS_OF:
        pt->reg.flags &= ~(1 << 11);
        pt->reg.flags |= (!!lVal_dest) << 11;
        break;
    }

    Broadcast(WM_USER_CHREG, 0, 0);

    nRetResult = 1;
Exit0:
    return nRetResult;
}

int CVM::IRR(
    /* [in] */  const long eip,
    /* [in] */  const MNEMONICTYPE MneType
)
{
    int nRetCode;

    REGISTERTYPE rt_dest;
    REGISTERTYPE rt_src;
    long lVal_dest;
    long lVal_src;

    nRetCode = GetODReg();
    if (0 == nRetCode)
        return 0;

    rt_dest = (REGISTERTYPE)*(long *)&m_Code[eip + 2];
    rt_src = (REGISTERTYPE)*(long *)&m_Code[eip + 6];
    lVal_dest = m_Cpu.reg[rt_dest];
    lVal_src = m_Cpu.reg[rt_src];

    return SetReg(&rt_dest, &rt_src, lVal_dest, lVal_src, MneType);
}

int CVM::IRC(
    /* [in] */  const long eip,
    /* [in] */  const MNEMONICTYPE MneType
)
{
    int nRetCode;

    REGISTERTYPE rt_dest;
    long lVal_dest;
    long lVal_src;

    nRetCode = GetODReg();
    if (0 == nRetCode)
        return 0;

    rt_dest = (REGISTERTYPE)*(long *)&m_Code[eip + 2];
    lVal_src = *(long *)&m_Code[eip + 6];
    lVal_dest = m_Cpu.reg[rt_dest];

    return SetReg(&rt_dest, NULL, lVal_dest, lVal_src, MneType);
}

int CVM::DoArithmetic(
    /* [in] */  const long eip,
    /* [in] */  const MNEMONICTYPE MneType
)
{
    int nRetResult = 0;
    int nRetCode;

    m_Cpu.modrm = *(unsigned char *)&m_Code[eip + 1];

    switch (m_Cpu.modrm)
    {
    case MR_MEM:
        nRetCode = IRC(eip, MneType);
        OM_PROCESS_ERROR(nRetCode);
        break;
    case MR_REG:
        nRetCode = IRR(eip, MneType);
        OM_PROCESS_ERROR(nRetCode);
        break;
    default:
        goto Exit0;
    }

    nRetResult = 1;
Exit0:
    return nRetResult;
}

int CVM::DoInputText()
{
    int nRetResult = 0;
    int nRetCode;

    long lDataOffset;
    char szTitle[TEXTLEN];
    int nTitleLen;

    nRetCode = Pop(&lDataOffset);
    OM_PROCESS_ERROR(nRetCode);

    nRetCode = CheckDataAddrValid(lDataOffset);
    if (0 == nRetCode)
    {
        if (NULL != m_listMallocMemAddr.Find(lDataOffset))
        {
            nTitleLen = strlen((char *)lDataOffset);
            if (nTitleLen >= TEXTLEN)
                goto Exit0;
            strcpy(szTitle, (char *)lDataOffset);
        }
        else
            goto Exit0;
    }
    else
    {
        nTitleLen = strlen(&m_Data[lDataOffset]);
        if (nTitleLen >= TEXTLEN)
            goto Exit0;
        strcpy(szTitle, &m_Data[lDataOffset]);
    }

    nRetCode = Gettext(
        szTitle,
        m_FreeBuffer,
        0,  // init letter
        NM_COMMENT,
        FIXEDFONT
    );
    if (-1 == nRetCode) // user pressed CANCEL
    {
        nRetCode = SetFreeBuffer(0);
        OM_PROCESS_ERROR(nRetCode);
        SetRetVal(0);
    }
    else
    {
        nRetCode = SetFreeBuffer(nRetCode);
        OM_PROCESS_ERROR(nRetCode);
        SetRetVal(1);
    }

    nRetResult = 1;
Exit0:
    if (0 == nRetResult)
        SetRetVal(0);
    return nRetResult;
}

int CVM::DoInputHexLong()
{
    int nRetResult = 0;
    int nRetCode;

    long lDataOffset;
    long lValue;
    char szTitle[TEXTLEN];
    int nTitleLen;

    nRetCode = Pop(&lValue);
    OM_PROCESS_ERROR(nRetCode);

    nRetCode = Pop(&lDataOffset);
    OM_PROCESS_ERROR(nRetCode);

    nRetCode = CheckDataAddrValid(lDataOffset);
    if (0 == nRetCode)
    {
        if (NULL != m_listMallocMemAddr.Find(lDataOffset))
        {
            nTitleLen = strlen((char *)lDataOffset);
            if (nTitleLen >= TEXTLEN)
                goto Exit0;
            strcpy(szTitle, (char *)lDataOffset);
        }
        else
            goto Exit0;
    }
    else
    {
        nTitleLen = strlen(&m_Data[lDataOffset]);
        if (nTitleLen >= TEXTLEN)
            goto Exit0;
        strcpy(szTitle, &m_Data[lDataOffset]);
    }

    nRetCode = Getlong(
        szTitle,
        (unsigned long *)&lValue,
        4,  // datasize
        0,  // init letter
        DIA_HEXONLY
    );
    if (-1 == nRetCode) // fails or user pressed CANCEL
        goto Exit0;

    m_Cpu.reg[REG_00] = lValue;

    nRetResult = 1;
Exit0:
    return nRetResult;
}

int CVM::DoPrintNum()
{
    int nRetResult = 0;
    int nRetCode;

    long lRadix;
    long lValue;
    char szValue[100];

    nRetCode = Pop(&lValue);
    OM_PROCESS_ERROR(nRetCode);

    nRetCode = Pop(&lRadix);
    OM_PROCESS_ERROR(nRetCode);

    ltoa(lValue, szValue, lRadix);
    ShowMsg(szValue);

    nRetResult = 1;
Exit0:
    return nRetResult;
}

int CVM::DoPrintBuf()
{
    int nRetResult = 0;
    int nRetCode;

    long lAddr;
    long lLen;
    long i;
    char ch;
    char dump[4];
    CString strBuf;

    nRetCode = Pop(&lAddr);
    OM_PROCESS_ERROR(nRetCode);

    nRetCode = Pop(&lLen);
    OM_PROCESS_ERROR(nRetCode);

    strBuf.Format(
        "Starting Address: 0x%08lX\nLength bytes: 0x%lX\n\n",
        lAddr,
        lLen
    );

    for (i = 0; i < lLen; ++i)
    {
        nRetCode = Readmemory(&ch, lAddr + i, 1, MM_SILENT);
        OM_PROCESS_ERROR(nRetCode);
        sprintf(dump, "%02X ", ch);
        strBuf += dump;
    }

    ShowMsg(strBuf);

    nRetResult = 1;
Exit0:
    return nRetResult;
}

int CVM::DoMsg()
{
    int nRetResult = 0;
    int nRetCode;

    long lDataOffset;

    nRetCode = Pop(&lDataOffset);
    OM_PROCESS_ERROR(nRetCode);

    nRetCode = CheckDataAddrValid(lDataOffset);
    if (0 == nRetCode)
    {
        if (NULL != m_listMallocMemAddr.Find(lDataOffset))
        {
            ShowMsg((char *)lDataOffset);
            goto Exit1;
        }
        goto Exit0;
    }

    ShowMsg(&m_Data[lDataOffset]);

Exit1:
    nRetResult = 1;
Exit0:
    return nRetResult;
}

int CVM::DoMsgYN()
{
    int nRetResult = 0;
    int nRetCode;

    long lDataOffset;

    nRetCode = Pop(&lDataOffset);
    OM_PROCESS_ERROR(nRetCode);

    nRetCode = CheckDataAddrValid(lDataOffset);
    if (0 == nRetCode)
    {
        if (NULL != m_listMallocMemAddr.Find(lDataOffset))
        {
            ShowQuestionMsg((char *)lDataOffset);
            SetRetVal((IDYES == nRetCode));
            goto Exit1;
        }
        goto Exit0;
    }

    nRetCode = ShowQuestionMsg(&m_Data[lDataOffset]);
    SetRetVal((IDYES == nRetCode));

Exit1:
    nRetResult = 1;
Exit0:
    return nRetResult;
}

int CVM::DoReadMemLong()
{
    int nRetResult = 0;
    int nRetCode;

    long lValue = 0;
    long lCount;
    long lAddr;

    nRetCode = Pop(&lAddr);
    OM_PROCESS_ERROR(nRetCode);

    nRetCode = Pop(&lCount);
    OM_PROCESS_ERROR(nRetCode);

    if (lCount < 1)
        lCount = 1;
    if (lCount > 4)
        lCount = 4;

    nRetCode = Readmemory(&lValue, lAddr, lCount, MM_SILENT);
    OM_PROCESS_ERROR(nRetCode);

    SetRetVal(lValue);

    nRetResult = 1;
Exit0:
    if (0 == nRetResult)
        SetRetVal(-1);
    return nRetResult;
}

int CVM::DoWriteMemLong()
{
    int nRetResult = 0;
    int nRetCode;

    long lValue;
    long lAddr;
    long lCount;

    nRetCode = Pop(&lAddr);
    OM_PROCESS_ERROR(nRetCode);

    nRetCode = Pop(&lValue);
    OM_PROCESS_ERROR(nRetCode);

    nRetCode = Pop(&lCount);
    OM_PROCESS_ERROR(nRetCode);

    if (lCount < 1)
        lCount = 1;
    if (lCount > 4)
        lCount = 4;

    nRetCode = Writememory(&lValue, lAddr, lCount, MM_DELANAL | MM_SILENT);
    OM_PROCESS_ERROR(nRetCode);

    nRetResult = 1;
Exit0:
    SetRetVal(nRetResult);
    return nRetResult;
}

int CVM::DoWriteMemHexes()
{
    int nRetResult = 0;
    int nRetCode;

    long lAddr;
    long lHexOffset;
    int nHexLen;
    int i;
    char *szHex = NULL;
    char szTemp[3];
    long lHex;

    nRetCode = Pop(&lAddr);
    OM_PROCESS_ERROR(nRetCode);

    nRetCode = Pop(&lHexOffset);
    OM_PROCESS_ERROR(nRetCode);

    nRetCode = CheckDataAddrValid(lHexOffset);
    if (0 == nRetCode)
    {
        if (NULL != m_listMallocMemAddr.Find(lHexOffset))
        {
            nHexLen = strlen((char *)lHexOffset);
            if (nHexLen % 2)
                goto Exit0;
            szHex = (char *)malloc(nHexLen);
            OM_PROCESS_ERROR(szHex);
            memcpy(szHex, (char *)lHexOffset, nHexLen);
        }
        else
            goto Exit0;
    }
    else
    {
        nHexLen = strlen(&m_Data[lHexOffset]);
        if (nHexLen % 2)
            goto Exit0;
        szHex = (char *)malloc(nHexLen);
        OM_PROCESS_ERROR(szHex);
        memcpy(szHex, &m_Data[lHexOffset], nHexLen);
    }

    szTemp[2] = '\0';
    for (i = 0; i < nHexLen; i += 2)
    {
        szTemp[0] = szHex[i];
        szTemp[1] = szHex[i + 1];
        lHex = strtol(szTemp, NULL, 16);
        nRetCode = Writememory(&lHex, lAddr + i / 2, 1, MM_DELANAL | MM_SILENT);
        OM_PROCESS_ERROR(nRetCode);
    }

    nRetResult = 1;
Exit0:
    if (szHex)
    {
        free(szHex);
        szHex = NULL;
    }
    SetRetVal(nRetResult);
    return nRetResult;
}

int CVM::DoFill()
{
    int nRetResult = 0;
    int nRetCode;

    long lValue;
    long lLen;
    long lAddr;
    long i;

    nRetCode = Pop(&lAddr);
    OM_PROCESS_ERROR(nRetCode);

    nRetCode = Pop(&lLen);
    OM_PROCESS_ERROR(nRetCode);

    nRetCode = Pop(&lValue);
    OM_PROCESS_ERROR(nRetCode);

    // get byte
    lValue = lValue & 0xFF;

    for (i = 0; i < lLen; ++i)
    {
        nRetCode = Writememory(&lValue, lAddr + i, 1, MM_DELANAL | MM_SILENT);
        OM_PROCESS_ERROR(nRetCode);
    }

    nRetResult = 1;
Exit0:
    SetRetVal(nRetResult);
    return nRetResult;
}

inline int CVM::GetOpcodeSize(
    /* [in] */  const long lOpcode
)
{
    int nRetCode;

    nRetCode = lOpcode & 0x00ff0000;
    if (nRetCode)
        return 3;
    nRetCode = lOpcode & 0x00ffff00;
    if (nRetCode)
        return 2;
    nRetCode = lOpcode & 0x00ffffff;
    if (nRetCode)
        return 1;

    return 0;
}

inline int CVM::GetLongSize(
    /* [in] */  const long lValue
)
{
    int nRetCode;

    nRetCode = lValue & 0xff000000;
    if (nRetCode)
        return 4;
    nRetCode = lValue & 0x00ff0000;
    if (nRetCode)
        return 3;
    nRetCode = lValue & 0x00ffff00;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -