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

📄 unasmarmdlg.cpp

📁 VC写的一个可以对ARM进行反汇编的工具的原代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
                    dump_float (fd_src, fd_tar, addr, addr1, addr2);
                    break;
                }
            }
            continue;
        }
    }
    fclose (fd_src);
    fclose (fd_ref);
    fclose (fd_tar);
    AfxMessageBox ("Successful");
}

long CUnasmARMDlg::GetHex (char * str)
{
    int  i;
    long v;
    char ch;

    for (i = 0, v = 0; str[i]; i++)
    {
        ch = toupper (str[i]);
        if ( (ch >= '0') && (ch <= '9') )
        {
            v = v * 16 + ch - '0';
            continue;
        }
        if ( (ch >= 'A') && (ch <= 'F') )
        {
            v = v * 16 + ch - 'A' + 10;
            continue;
        }
        break;
    }
    return v;
}

int CUnasmARMDlg::dump_byte (FILE *fd_src, FILE *fd_tar, long addr, long addr1, long addr2)
{
    int  i, loc_str;
    long bytes;
    char src_buffer[16384];
    char string[32];

    string[0] = ' ';

    i = fseek (fd_src, addr1, SEEK_SET);
    bytes = addr2 - addr1 + 1;
    while (bytes)
    {
        int loc, times_16, remains_16;
        int bytes1 = (bytes <= 16384) ? bytes : 16384;
        char str[128];
        int  k, l;

        if (addr1 & 15)
        {
            if ( (16 - (addr1 & 15) ) < bytes1)
                bytes1 = 16 - (addr1 & 15);
        }
        bytes -= bytes1;
        i = fread ( src_buffer, 1, bytes1, fd_src);
        if (i > 0)
        {
            bytes1 = i;                          // Bytes actually
            times_16 = bytes1 >> 4;
            remains_16 = bytes1 & 0x0f;
            l = 0;

            while (times_16)
            {
                loc_str = 1;
                sprintf (str, "%08x  ", addr + addr1);
                for (k = 0; k < 16; k++, l++)
                {
                    loc = strlen (str);
                    sprintf (&str[loc], "%02X ", 0xff & src_buffer[l]);
                    string[loc_str++] = (src_buffer[l] >= ' ') ? src_buffer[l] : '.';
                }
                string[loc_str] = '\0';
                strcat (str, string);
                str[33] = '-';
                loc = strlen (str);
                str[loc++] = '\n';
                str[loc] = '\0';
                fwrite (str, 1, loc, fd_tar);
                times_16--;
                addr1 += 16;
            }

            if (remains_16)
            {
                memset (str, ' ', 128);
                loc_str = 1;
                sprintf (str, "%08x  ", addr + addr1);
                for (k = 0; k < remains_16; k++, l++)
                {
                    loc = strlen (str);
                    sprintf (&str[loc], "%02X ", 0xff & src_buffer[l]);
                    string[loc_str++] = (src_buffer[l] >= ' ') ? src_buffer[l] : '.';
                }
                string[loc_str] = '\0';
                loc = strlen (str);
                str[loc] = ' ';
                str[58] = '\0';
                strcat (str, string);
                if (remains_16 > 8)
                    str[33] = '-';
                loc = strlen (str);
                str[loc++] = '\n';
                str[loc] = '\0';
                fwrite (str, 1, loc, fd_tar);
                addr1 += remains_16;
            }
        }
    }
    fwrite ("\n", 1, 1, fd_tar);
    return 0;

}

int CUnasmARMDlg::dump_halfword (FILE * fd_src, FILE * fd_tar, long addr, long addr1, long addr2)
{
    int  i, loc_str;
    long bytes;
    char src_buffer[16384];

    i = fseek (fd_src, addr1, SEEK_SET);
    bytes = addr2 - addr1 + 1;
    while (bytes)
    {
        int loc, times_16, remains_16;
        int bytes1 = (bytes <= 16384) ? bytes : 16384;
        char str[128];
        int  k, l;

        if (addr1 & 15)
        {
            if ( (16 - (addr1 & 15) ) < bytes1)
                bytes1 = 16 - (addr1 & 15);
        }
        bytes -= bytes1;
        i = fread ( src_buffer, 1, bytes1, fd_src);
        if (i > 0)
        {
            bytes1 = i;                          // Bytes actually
            times_16 = bytes1 >> 4;
            remains_16 = (bytes1 & 0x0f) >> 1;
            l = 0;

            while (times_16)
            {
                loc_str = 1;
                sprintf (str, "%08x  ", addr + addr1);
                for (k = 0; k < 8; k++, l += 2)
                {
                    loc = strlen (str);
                    if (m_Radio1)
                    {
                        sprintf (&str[loc], "%02X%02X ",
                                 0xff & src_buffer[l],
                                 0xff & src_buffer[l+1]);
                    }
                    else
                    {
                        sprintf (&str[loc], "%02X%02X ",
                                 0xff & src_buffer[l+1],
                                 0xff & src_buffer[l]);
                    }
                }
                loc = strlen (str);
                str[loc-1] = '\n';
                fwrite (str, 1, loc, fd_tar);
                times_16--;
                addr1 += 16;
            }

            if (remains_16)
            {
                loc_str = 1;
                sprintf (str, "%08x  ", addr + addr1);
                for (k = 0; k < remains_16; k++, l += 2)
                {
                    loc = strlen (str);
                    if (m_Radio1)
                    {
                        sprintf (&str[loc], "%02X%02X ",
                                 0xff & src_buffer[l],
                                 0xff & src_buffer[l+1]);
                    }
                    else
                    {
                        sprintf (&str[loc], "%02X%02X ",
                                 0xff & src_buffer[l+1],
                                 0xff & src_buffer[l]);
                    }
                }
                loc = strlen (str);
                str[loc-1] = '\n';
                fwrite (str, 1, loc, fd_tar);
                addr1 += (remains_16 << 1);
            }
        }
    }
    fwrite ("\n", 1, 1, fd_tar);
    return 0;
}

int CUnasmARMDlg::dump_word (FILE * fd_src, FILE * fd_tar, long addr, long addr1, long addr2)
{
    int  i, loc_str;
    long bytes;
    char src_buffer[16384];

    i = fseek (fd_src, addr1, SEEK_SET);
    bytes = addr2 - addr1 + 1;
    while (bytes)
    {
        int loc, times_16, remains_16;
        int bytes1 = (bytes <= 16384) ? bytes : 16384;
        char str[128];
        int  k, l;

        if (addr1 & 15)
        {
            if ( (16 - (addr1 & 15) ) < bytes1)
                bytes1 = 16 - (addr1 & 15);
        }
        bytes -= bytes1;
        i = fread ( src_buffer, 1, bytes1, fd_src);
        if (i > 0)
        {
            bytes1 = i;                          // Bytes actually
            times_16 = bytes1 >> 4;
            remains_16 = (bytes1 & 0x0f) >> 2;
            l = 0;

            while (times_16)
            {
                loc_str = 1;
                sprintf (str, "%08x  ", addr + addr1);
                for (k = 0; k < 4; k++, l += 4)
                {
                    loc = strlen (str);
                    if (m_Radio1)
                    {
                        sprintf (&str[loc], "%02X%02X%02X%02X ",
                                 0xff & src_buffer[l],
                                 0xff & src_buffer[l+1],
                                 0xff & src_buffer[l+2],
                                 0xff & src_buffer[l+3]);
                    }
                    else
                    {
                        sprintf (&str[loc], "%02X%02X%02X%02X ",
                                 0xff & src_buffer[l+3],
                                 0xff & src_buffer[l+2],
                                 0xff & src_buffer[l+1],
                                 0xff & src_buffer[l]);
                    }
                }
                loc = strlen (str);
                str[loc-1] = '\n';
                fwrite (str, 1, loc, fd_tar);
                times_16--;
                addr1 += 16;
            }

            if (remains_16)
            {
                loc_str = 1;
                sprintf (str, "%08x  ", addr + addr1);
                for (k = 0; k < remains_16; k++, l += 4)
                {
                    loc = strlen (str);
                    if (m_Radio1)
                    {
                        sprintf (&str[loc], "%02X%02X%02X%02X ",
                                 0xff & src_buffer[l],
                                 0xff & src_buffer[l+1],
                                 0xff & src_buffer[l+2],
                                 0xff & src_buffer[l+3]);
                    }
                    else
                    {
                        sprintf (&str[loc], "%02X%02X%02X%02X ",
                                 0xff & src_buffer[l+3],
                                 0xff & src_buffer[l+2],
                                 0xff & src_buffer[l+1],
                                 0xff & src_buffer[l]);
                    }
                }
                loc = strlen (str);
                str[loc-1] = '\n';
                fwrite (str, 1, loc, fd_tar);
                addr1 += (remains_16 << 2);
            }
        }
    }
    fwrite ("\n", 1, 1, fd_tar);
    return 0;

}

int CUnasmARMDlg::dis_arm (FILE * fd_src, FILE * fd_tar, long addr, long addr1, long addr2)
{
    long bytes;
    int  i, bytes1;
    char src_buffer[16384];
    int  op_type;
    long cur_addr = addr + addr1;

    CrLf = 0;
    i = fseek (fd_src, addr1, SEEK_SET);
    bytes = (addr2 - addr1 + 1) & (~3);

    while (bytes > 0)
    {
        bytes1 = (bytes <= 16384) ? bytes : 16384;
        bytes -= bytes1;
        i = fread ( src_buffer, 1, bytes1, fd_src);
        if (i > 0)
        {
            //Dis-asm from src_buffer[0] , bytes1 bytes
            for (i = 0; i < bytes1; i += 4)
            {
                if (m_Radio1)
                {
                    op_type = dis_arm_one ( (unsigned char ) src_buffer[i],
                                            (unsigned char ) src_buffer[i+1],
                                            (unsigned char ) src_buffer[i+2],
                                            (unsigned char ) src_buffer[i+3]);
                    do_dis_arm (fd_src, fd_tar, cur_addr, addr, op_type,
                                (unsigned char) src_buffer[i],
                                (unsigned char) src_buffer[i+1],
                                (unsigned char) src_buffer[i+2],
                                (unsigned char) src_buffer[i+3]);
                }
                else
                {
                    op_type = dis_arm_one ( (unsigned char ) src_buffer[i+3],
                                            (unsigned char ) src_buffer[i+2],
                                            (unsigned char ) src_buffer[i+1],
                                            (unsigned char ) src_buffer[i]);
                    do_dis_arm (fd_src, fd_tar, cur_addr, addr, op_type,
                                (unsigned char) src_buffer[i+3],
                                (unsigned char) src_buffer[i+2],
                                (unsigned char) src_buffer[i+1],
                                (unsigned char) src_buffer[i]);
                }
                cur_addr += 4;
            }
        }
    }
    if (CrLf)
        CrLf = 0;
    else
        fwrite ("\n", 1, 1, fd_tar);
    return 0;
}

int CUnasmARMDlg::dis_thumb (FILE * fd_src, FILE * fd_tar, long addr, long addr1, long addr2)
{
    int  i, j, i_delta;
    long bytes;
    int  bytes1;
    int  remains;
    char temp, src_buffer[16384];
    int  op_type;
    long cur_addr = addr + addr1;

    CrLf = 0;
    i = fseek (fd_src, addr1, SEEK_SET);
    bytes = (addr2 - addr1 + 1) & (~1);
    remains = 0;

    while (bytes > 0)
    {
        bytes1 = (bytes <= 16384) ? bytes : 16384;
        if (remains && (bytes1 > 16382) )
            bytes1 -= remains;
        bytes -= bytes1;
        i = fread ( &src_buffer[remains], 1, bytes1, fd_src);
        if (i > 0)
        {
            if (!m_Radio1)
            {
                for (j = 0; j < bytes1; j += 2)
                {
                    temp = src_buffer[j];
                    src_buffer[j] = src_buffer[j+1];
                    src_buffer[j+1] = temp;
                }
            }
            //Dis-asm from src_buffer[0] , (bytes1+remains) bytes
            for (i = 0; i < bytes1 + remains; i += i_delta)
            {
                op_type = dis_thumb_one ( (unsigned char *) & src_buffer[i]);
                if (op_type != 19)
                {
                    i_delta = 2;
                    do_dis_thumb (fd_src, fd_tar, cur_addr,
                                  addr, op_type,
                                  (unsigned char) src_buffer[i],
                                  (unsigned char) src_buffer[i+1]);
                    cur_addr += 2;
                }
                else
                {
                    i_delta = 4;
                    if ( (bytes1 + remains - i) < 4)
                    {
                        remains = 2;
                        src_buffer[0] = src_buffer[i];
                        src_buffer[1] = src_buffer[i+1];
                        break;
                    }
                    else
                    {

⌨️ 快捷键说明

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