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

📄 assembler.cpp

📁 Ollydbg环境下的一款插件源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
                    break;
                case MC_DUMPMEM:
                    I(&fii, MC_DUMPMEM);
                    break;
                case MC_DUMPMEMAPPEND:
                    I(&fii, MC_DUMPMEMAPPEND);
                    break;
                case MC_DUMPASPE:
                    I(&fii, MC_DUMPASPE);
                    break;
                case MC_GETPREVOPADDR:
                    I(&fii, MC_GETPREVOPADDR);
                    break;
                case MC_GETNEXTOPADDR:
                    I(&fii, MC_GETNEXTOPADDR);
                    break;
                case MC_GETPROCADDRESS:
                    I(&fii, MC_GETPROCADDRESS);
                    break;
                case MC_RUNTORETURN:
                    I(&fii, MC_RUNTORETURN);
                    break;
                case MC_RUNTOUSERCODE:
                    I(&fii, MC_RUNTOUSERCODE);
                    break;
                case MC_RUN:
                    I(&fii, MC_RUN);
                    break;
                case MC_ANIMATEINTO:
                    I(&fii, MC_ANIMATEINTO);
                    break;
                case MC_ANIMATEOVER:
                    I(&fii, MC_ANIMATEOVER);
                    break;
                case MC_STEPINTO:
                    I(&fii, MC_STEPINTO);
                    break;
                case MC_STEPOVER:
                    I(&fii, MC_STEPOVER);
                    break;
                case MC_ESTI:
                    I(&fii, MC_ESTI);
                    break;
                case MC_ESTO:
                    I(&fii, MC_ESTO);
                    break;
                case MC_GO:
                    I(&fii, MC_GO);
                    break;
                case MC_TRACEINTO:
                    I(&fii, MC_TRACEINTO);
                    break;
                case MC_TRACEOVER:
                    I(&fii, MC_TRACEOVER);
                    break;
                case MC_TRACEINTOCOND:
                    I(&fii, MC_TRACEINTOCOND);
                    break;
                case MC_TRACEOVERCOND:
                    I(&fii, MC_TRACEOVERCOND);
                    break;
                case MC_ASM:
                    I(&fii, MC_ASM);
                    break;
                case MC_ANALYSE:
                    I(&fii, MC_ANALYSE);
                    break;
                case MC_COMMENT:
                    I(&fii, MC_COMMENT);
                    break;
                case MC_LOGTEXT:
                    I(&fii, MC_LOGTEXT);
                    break;
                case MC_LOGLONG:
                    I(&fii, MC_LOGLONG);
                    break;
                case MC_BP:
                    I(&fii, MC_BP);
                    break;
                case MC_BC:
                    I(&fii, MC_BC);
                    break;
                case MC_BPCND:
                    I(&fii, MC_BPCND);
                    break;
                case MC_BPL:
                    I(&fii, MC_BPL);
                    break;
                case MC_BPLCND:
                    I(&fii, MC_BPLCND);
                    break;
                case MC_BPRM:
                    I(&fii, MC_BPRM);
                    break;
                case MC_BPWM:
                    I(&fii, MC_BPWM);
                    break;
                case MC_BPMC:
                    I(&fii, MC_BPMC);
                    break;
                case MC_BPHWS:
                    I(&fii, MC_BPHWS);
                    break;
                case MC_BPHWC:
                    I(&fii, MC_BPHWC);
                    break;
                case MC_EOB:
                    IL(&fii, MC_EOB);
                    break;
                case MC_EOBINT3:
                    IL(&fii, MC_EOBINT3);
                    break;
                case MC_EOBHW:
                    IL(&fii, MC_EOBHW);
                    break;
                case MC_EOBMEM:
                    IL(&fii, MC_EOBMEM);
                    break;
                case MC_EOE:
                    IL(&fii, MC_EOE);
                    break;
                case MC_COB:
                    I(&fii, MC_COB);
                    break;
                case MC_COE:
                    I(&fii, MC_COE);
                    break;
                case MC_GMI:
                    I(&fii, MC_GMI);
                    break;
                case MC_SETLBL:
                    I(&fii, MC_SETLBL);
                    break;
                case MC_PAUSE:
                    I(&fii, MC_PAUSE);
                    break;
                case MC_HIDEOD:
                    I(&fii, MC_HIDEOD);
                    break;
                case MC_UNHIDEOD:
                    I(&fii, MC_UNHIDEOD);
                    break;
                case MC_FIND:
                    I(&fii, MC_FIND);
                    break;
                case MC_MALLOC:
                    I(&fii, MC_MALLOC);
                    break;
                case MC_FREE:
                    I(&fii, MC_FREE);
                    break;
                case MC_STRCPY:
                    I(&fii, MC_STRCPY);
                    break;
                case MC_STRCAT:
                    I(&fii, MC_STRCAT);
                    break;
                case MC_STRLEN:
                    I(&fii, MC_STRLEN);
                    break;
                case MC_LTOA:
                    I(&fii, MC_LTOA);
                    break;
                case MC_MEMCPY:
                    I(&fii, MC_MEMCPY);
                    break;
                case MC_PRINTBUFTODUMP:
                    I(&fii, MC_PRINTBUFTODUMP);
                    break;
                case MC_PRINTBUFTONEWDUMP:
                    I(&fii, MC_PRINTBUFTONEWDUMP);
                    break;
                case MC_STEPINTOS:
                    I(&fii, MC_STEPINTOS);
                    break;
                case MC_STEPOVERS:
                    I(&fii, MC_STEPOVERS);
                    break;
                case MC_SEARCH:
                    I(&fii, MC_SEARCH);
                    break;
                case MC_FINDPROCBEGIN:
                    I(&fii, MC_FINDPROCBEGIN);
                    break;
                case MC_FINDPROCEND:
                    I(&fii, MC_FINDPROCEND);
                    break;
                case MC_FINDPREVPROC:
                    I(&fii, MC_FINDPREVPROC);
                    break;
                case MC_FINDNEXTPROC:
                    I(&fii, MC_FINDNEXTPROC);
                    break;
                case MC_FOLLOWCALL:
                    I(&fii, MC_FOLLOWCALL);
                    break;
                case MC_EMBEDDEDASM:
                    ProcessEmbeddedAsm(&fii, PT_PASS2);
                    break;
                case MC_ISWINNTKERNEL:
                    I(&fii, MC_ISWINNTKERNEL);
                    break;
                case MC_GOTOCPUADDR:
                    I(&fii, MC_GOTOCPUADDR);
                    break;
                case MC_GOTODUMPADDR:
                    I(&fii, MC_GOTODUMPADDR);
                    break;
                case MC_REVERSEFIND:
                    I(&fii, MC_REVERSEFIND);
                    break;
                case MC_REVERSESEARCH:
                    I(&fii, MC_REVERSESEARCH);
                    break;
                case MC_COPYBYTESTO:
                    I(&fii, MC_COPYBYTESTO);
                    break;
                case MC_REPLACEBYTESEX:
                    I(&fii, MC_REPLACEBYTESEX);
                    break;
                case MC_UPDATEDUMPBUF:
                    I(&fii, MC_UPDATEDUMPBUF);
                    break;
                case MC_WRITEMEMHEXES:
                    I(&fii, MC_WRITEMEMHEXES);
                    break;
                case MC_READFILEINTOMEM:
                    I(&fii, MC_READFILEINTOMEM);
                    break;
                case MC_VIRTUALALLOCEX:
                    I(&fii, MC_VIRTUALALLOCEX);
                    break;
                case MC_VIRTUALFREEEX:
                    I(&fii, MC_VIRTUALFREEEX);
                    break;
                }
                break;  // terminate TOK_TOKEN to skip the steps follow
            }
            nRetCode = FindLabelName(
                strTokenName.GetLength() + 1,
                strTokenName
            );
            if (0 == nRetCode)
                Error(ERR_NOID, strTokenName, fii.FileName, fii.LineNum);
            break;  // TOK_TOKEN
        case TOK_LABEL:
            break;
        case TOK_ERR:
            Error(ERR_NOID, strTokenName, fii.FileName, fii.LineNum);
            FatalError();
            goto Exit0;
        case TOK_EOF:
            // if it is the first appeared file,
            // and the last byte of opcode is not "halt",
            // then add 'halt' to the end of code.
            if (
                (1 == m_nFileListCount) &&
                (m_VM->opcode(MC_HALT) != m_Code[m_unCodeLen - 1])
            )
            {
                AddOpcode(MC_HALT);
            }
            goto Exit1;
        }
    }

Exit1:
    nRetResult = 1;
Exit0:
    --m_nFileListCount;
    if (fp_in)
    {
        fclose(fp_in);
        fp_in = NULL;
    }
    return nRetResult;
}

int CAssembler::MakeSymbolTable(
    /* [size_is][in] */ const UINT unFileNameSize,
    /* [in] */          const char *szFileName
)
{
    ASSERT(szFileName);

    int nRetResult = 0;
    int nRetCode;

    FILE *fp_in = NULL;
    CString strTokenName;
    FILEINFO fii;
    TOKENTYPE tt;
    MNEMONICTYPE mt;

    OM_PROCESS_ERROR((strlen(szFileName) + 1) == unFileNameSize);

    fp_in = fopen(szFileName, "rt");    // do NOT use "rb" here!
    OM_PROCESS_ERROR(fp_in);

    strcpy(fii.FileName, szFileName);
    fii.fp = fp_in;
    fii.LineNum = 1;
    ++m_nFileListCount;

    while (!m_nStopFlag)
    {
        tt = NextToken(&fii, &strTokenName);
        switch (tt)
        {
        case TOK_TOKEN:
            nRetCode = IsMnemonic(
                strTokenName.GetLength() + 1,
                (LPCTSTR)strTokenName,
                &mt
            );
            if (0 != nRetCode)      // it is a mnemonic
            {
                switch (mt)
                {
                case MC_INCLUDE:
                    nRetCode = ProcessInclude(&fii, PT_PASS1);
                    OM_PROCESS_ERROR(nRetCode);
                    break;
                case MC_INVOKE:
                    nRetCode = ProcessInvoke(&fii, PT_PASS1);
                    OM_PROCESS_ERROR(nRetCode);
                    break;
                case MC_EMBEDDEDASM:
                    nRetCode = ProcessEmbeddedAsm(&fii, PT_PASS1);
                    OM_PROCESS_ERROR(nRetCode);
                    break;
                default:
                    nRetCode = m_VM->GetMnemonicLen(mt);
                    AddCodeLen(nRetCode);
                    break;
                }
                break;  // terminate TOK_TOKEN to skip the steps follow
            }
            break;  // TOK_TOKEN
        case TOK_LABEL:
            DeclareLabel(&fii, strTokenName.GetLength() + 1, strTokenName);
            break;
        case TOK_ERR:
            Error(ERR_NOID, strTokenName, fii.FileName, fii.LineNum);
            FatalError();
            goto Exit0;
        case TOK_EOF:
            goto Exit1;
            break;
        }
    }

Exit1:
    nRetResult = 1;
Exit0:
    --m_nFileListCount;
    if (fp_in)
    {
        fclose(fp_in);
        fp_in = NULL;
    }
    return nRetResult;
}

int CAssembler::IsRegister(
    /* [size_is][in] */ const UINT unTokenNameSize,
    /* [in] */          const char *szTokenName,
    /* [out] */         REGISTERTYPE *RegType
)
{
    ASSERT(szTokenName);

    int i;

    if ((strlen(szTokenName) + 1) != unTokenNameSize)
        return 0;

    for (i = 0; i < REGISTER_COUNTS; ++i)
    {
        if (0 == strcomp(szTokenName, m_VM->GetRegisterName(i)))
        {
            if (RegType)
                *RegType = (REGISTERTYPE)i;
            return 1;
        }
    }

    return 0;
}

int CAssembler::IsMnemonic(
    /* [size_is][in] */ const UINT unTokenNameSize,
    /* [in] */          const char *szTokenName,
    /* [out] */         MNEMONICTYPE *MnemonicType
) const
{
    ASSERT(szTokenName);

    int i;

    if ((strlen(szTokenName) + 1) != unTokenNameSize)
        return 0;

    for (i = 0; i < MNEMONIC_COUNTS; ++i)
    {
        if (0 == strcomp(szTokenName, m_VM->GetMnemonicName(i)))
        {
            if (MnemonicType)
                *MnemonicType = (MNEMONICTYPE)i;
            return 1;
        }
    }

    return 0;
}

void CAssembler::Error(
    /* [in] */          const ERRTYPE ErrType,
    /* [in] */          const char *szTokenName,
    /* [in] */          const char *szFileName,
    /* [in] */          const int nLineNum
)
{
    // DO NOT ASSERT(strTokenName) here!!!
    ASSERT(szFileName);

    ERRINFO newei;
    int nErrCount;
    char szFullPathName[MAX_PATH];

    nErrCount = m_pErrList->GetCount();
    if (nErrCount > 10)
        FatalError();

    newei.ErrType = ErrType;
    if (NULL == szTokenName)
        newei.TokenName.Empty();
    else
        newei.TokenName = szTokenName;

    GetFullPathName(szFileName, MAX_PATH, szFullPathName, NULL);
    strcpy(newei.FileName, szFullPathName);
    newei.LineNum = nLineNum;

    m_pErrList->AddTail(newei);
}

void CAssembler::Warning(
    /* [in] */          const WARNTYPE WarnType,
    /* [in] */          const char *szTokenName,
    /* [in] */          const char *szFileName,
    /* [in] */          const int nLineNum
)
{
    // DO NOT ASSERT(strTokenName) here!!!
    ASSERT(szFileName);

    WARNINFO newwi;
    char szFullPathName[MAX_PATH];

    newwi.WarnType = WarnType;
    if (NULL == szTokenName)
        newwi.TokenName.Empty();
    else
        newwi.TokenName = szTokenName;

    GetFullPathName(szFileName, MAX_PATH, szFullPathName, NULL);
    strcpy(newwi.FileName, szFullPathName);
    newwi.LineNum = nLineNum;

    m_pWarnList->AddTail(newwi);
}

int CAssembler::GetString(
    /* [in][out] */     FILEINFO *fii,
    /* [out] */         CString *strString
)
{
    ASSERT(fii);

⌨️ 快捷键说明

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