吾爱破解 - LCG - LSG |安卓破解|病毒分析|破解软件|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

领取今日签到奖励
查看: 3136|回复: 15

[Android 原创] Android逆向进阶-ELF文件分析(2)(c解析ELF head)

[复制链接]
发表于 2018-3-4 19:35

本文章首发于i春秋。

0x00 前言

这里是无价之宝
之前的Android逆向进阶-ELF文件分析(1)已经有了一定的分析,这次我们接着进行分析。

说明:

这里写图片描述
我们在分析ELF文件的时候必然要先明白这样的知识。

什么是文件的静态解析?

文件的静态解析就是,在winhex打开文件的时候,对其各个字段进行分析的过程就是文件的静态解析。那么现在就应该知道我们之前做的其实都是文件的静态解析。

什么是文件的动态解析?

文件在执行的时候,内存也要对文件进行解析,那么这个解析就是动态解析。

文件的执行流程是什么?

打开——加载——解析——运行

内容:

1.前置知识补充
2.c语言实现ELF文件的静态分析

0x01 前置知识补充

这里写图片描述

1.ELF中常用数据格式

先来看看这个
//  Name           Size Alignment   Purpose
//  ====           ==== =========   =======
//  Elf32_Addr       4       4       Unsigned program address
//  Elf32_Half        2       2       Unsigned medium integer
//  Elf32_Off         4       4       Unsigned file offset
//  Elf32_Sword    4       4       Signed large integer
//  Elf32_Word     4       4       Unsigned large integer
//  unsigned char  1       1       Unsigned small integer

这个是elf.h文件中的内容。

我们还是来看看这个,这个相对来说是比较清晰的。

这里写图片描述

2.目标文件格式

静态解析:链接视图
动态解析:执行视图
这里写图片描述

3.ELF文件重点理解

ELF文件其实段和节从本质上来说是一样的,段是由节而组成。
而节则是我们需要重点来看的。
如果ELF文件不进行运行的话,那么就没有必要研究段,但是文件只有在运行的时候才有意义,所以研究段和研究节都是必不可少的。

0x02 c语言实现ELF文件的静态分析

这里写图片描述
python写多了,感觉c都有点写不来了。有一个elf.h的头文件,但是我不想用,还是自己来写吧,自己来写的顺手一点。我们主要是为了熟悉elf文件,不是为了工具而工具。

内容:

  1. 命令行格式
  2. ELF Header 解析(010 Editor 同步对比)

    1.命令行格式

(1)基本代码

int main(int argc, char *argv[])
{
    // 判断输入的内容是否为3个
        if (argc != 3)
        {
            // 用户输入了-h命令
            if (strcmp(argv[1], "-h") == 0)
            {
                printf("-head elf is head Analiyses!\n");
                exit(1);
            }
            p();
            printf("please enter -h");
            exit(1);
        }
        //判断输入的指令是否为“-head”
        if (strcmp(argv[1],"-head")==0)
        {

        }

        return 0;
}

(2)运行测试

非-h测试
这里写图片描述

-h测试
这里写图片描述

2.ELF Header 解析

原本是找了半天的如何输出一个十六进制的内容,现在终于找到了。而且还是东拼西凑才找到的。恩,还是使用最原始的方法进行分析吧。

突然发现python写多了,写c的时候成强迫症了。。。

首先是前16个字节的内容:

这里写图片描述

成功解析。

我们来看看代码。

printf("Magic:");
    for (i = 0; i < head[0]; i++){
        c = fgetc(fp);
        j = c;
        hex_str = inttohex(j);
        h1[i] = j;
        if (j < 9){
            printf("0%s ", hex_str);
        }
        else
        {
            printf("%s ", hex_str);
        }
    }
    printf("\n");
    if (h1[0] == 127 && h1[1] == 69 && h1[2] == 76 && h1[3] == 70)
    {
    }
    else
    {
        printf("This is not a ELF file.——for HAI_ help\n");
        exit(1);
    }

这里为了更加方便利于我们的观察特此写了辅助版以及大神版。

2.1.1 e_ident 分析

这里采用10进制进行对比。可以看到这里的辅助内容还是写的很详细的。

这里写图片描述

这里贴出关键代码:

if (h1[0] == 127 && h1[1] == 69 && h1[2] == 76 && h1[3] == 70)
    {
        printf("Read the first four bytes\n");
        printf("characteristic value is :%c%c%c%c\n", h1[0], h1[1], h1[2], h1[3], h1[4]);
        printf("This is a ELF file.——for HAI_ help\n");
    }
    else
    {
        printf("This is not a ELF file.——for HAI_ help\n");
        exit(1);
    }

2.1.2EI_CLASS解析

上次说到EI_CLASS是标识文件的类别。

那么我们这里就进行一个简单的判断就可以了。
这里写图片描述

void EI_CLASS(int i)
{
    printf("EI_CLASS:");
    if (i == 0)
        printf("Illicit type.\n");
    else if (i==1)
    {
        printf("32 bits ELF file. \n");
    }
    else if (i == 2)
    {
        printf("64 bits ELF file. \n");
    }
}

2.1.3EI_DATA

含义:数据编码格式

来看下程序的辅助运行。

这里写图片描述

void EI_DATA(int i)
{
    printf("EI_DATA:");
    if (i == 0)
        printf("Illegal data coding.\n");
    else if (i == 1)
    {
        printf("MSB first. \n");
    }
    else if (i == 2)
    {
        printf("LSB first. \n");
    }

}

2.1.4EI_VERSION

版本号字段

这里写图片描述

这里直接输出即可。

void EI_VERSION(){
    printf("EI_VERSION:");
    printf("%d", h1[6]);
}

2.1.5 其他

其他位置就是补充的字段了。其余位置全部 00

2018年3月4日01:17:36,睡觉去了~明天继续,已经走上了正轨,技术方面没有问题了。

这里写图片描述

2018年3月4日13:14:21,陪女朋友出去,现在回来接着写。

在写代码的时候,我们顺便使用 010 Editor 进行对比。

这里写图片描述

2.2 e_type

该段表示为目标文件类型。

这里写图片描述

利用简单的读取以及ELF头文件的分析来进行解析。

printf("e_type:");
    for (i = 0; i < 2; i++)
    {
        c = fgetc(fp);
        j = c;
        hex_str = inttohex(j);
        h1[i] = j;
        if (j < 9){
            printf("0%s ", hex_str);
        }
        else
        {
            printf("%s ", hex_str);
        }
    }
    if (h1[0] == 3)
    {
        printf("(共享目标文件)\n");
    }
    else
    {
        printf("(其他文件类型)\n");
    }

010 Editor 对照。

这里写图片描述

2.3 e_machine

该段说明目标体系结构类型。

读取两个字节。

这里写图片描述

代码就不贴了,没什么技术难度。

010 editor对比:

这里写图片描述

2.4 e_version

目标文件版本

因为和之前的一样,这里就不再进行解析。

但是还是来看一下010 Editor吧。
这里写图片描述

2.5 e_entry

程序入口的虚拟地址。如果目标文件没有程序入口,可以为 0。

这里写图片描述

010 editor

这里写图片描述

2.6 e_phoff

程序头部表格(Program Header Table)的偏移量(按字节计算)。

这里写图片描述

关键代码展示:

printf("e_phoff:");
    for (i = 0; i < 4; i++)
    {
        c = fgetc(fp);
        j = c;
        hex_str = inttohex(j);
        h1[i] = j;
        if (j < 9){
            printf("0%s ", hex_str);
        }
        else
        {
            printf("%s ", hex_str);
        }
    }
    printf("(%dbits)",h1[0]);
    printf("\n");

010 editor进行对比
这里写图片描述

2.7 e_shoff

节区头部表格(Section Header Table)的偏移量(按字节计算)。如果文件
没有节区头部表格,可以为 0。

这里写图片描述

核心代码

printf("e_phoff:");
    for (i = 0; i < 4; i++)
    {
        c = fgetc(fp);
        j = c;
        hex_str = inttohex(j);
        h1[i] = j;
        if (j < 9){
            printf("0%s ", hex_str);
        }
        else
        {
            printf("%s ", hex_str);
        }
    }
    printf("(%d bits)", h1[0]+h1[1]*16*16+h1[2]*16*16*16*16+h1[3]*16*16*16*16*16*16);
    printf("\n");

010 editor对比
这里写图片描述

2.8 e_flags

保存与文件相关的,特定于处理器的标志。
这里写图片描述
010 editor对比
这里写图片描述

2.9 e_ehsize

ELF 头部的大小

这里写图片描述

010 Editor
这里写图片描述

2.10 e_phentsize

程序头部表格的表项大小。

这里写图片描述

010 editor
这里写图片描述

2.11 e_phnum

程序头部表格的表项数目。

这里写图片描述

这里就不截010 editor的图了。有软件自己看看吧。

2.12 e_shentsize

节区头部表格的表项大小。

这里写图片描述

2.13 e_shnum

节区头部表格的表项数目。可以为 0。

这里写图片描述

2.14 e_shstrndx

节区头部表格中与节区名称字符串表相关的表项的索引。

这里写图片描述

3.测试。

测试 demo 1.so

自己的程序(有一个小错误已经更改)

这里写图片描述
readelf

这里写图片描述

看起来还是人家的美观一点,我没有调整对齐。还有显示等。当然我们的重点是理解格式,以及分析内容的准确性。

测试 demo 2.so

这里写图片描述

这里写图片描述

4. 总结

总的来说c语言写工具其实也并没有想象中那么难,其实和脚本语言挺相似的,只是处理的方式不同,写程序会让你对大小,以及字节,还有内容进行一个更深层次的了解。

那么我们的elf head 部分就彻底写完了。

代码部分,还有其他的东西都会打包起来进行上传。

0x03 结束语

之后还有一波对Program Headers的分析,恩,有点啰嗦了不要介意。

免费评分

参与人数 3吾爱币 +14 热心值 +3 收起 理由
qtfreet00 + 12 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
莫问刀 + 1 + 1 开始看不懂了,怎么办
真爱贤 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

本帖被以下淘专辑推荐:

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

 楼主| 发表于 2018-11-2 20:11
JmNkS 发表于 2018-10-29 20:28
不知道什么原因,楼主的一些图片在论坛里经常随机加载失败,得“在新标签中打开图片”才能正常显示

唉,当时没有钱,用的免费图床,然后现在懒得重新写了。。。。
 楼主| 发表于 2018-11-12 10:14
TopGreat 发表于 2018-11-4 05:17
elf.h里有 Elf32_Ehdr 的定义,直接读取就行, 不用这么麻烦。

嗯嗯嗯嗯,010还是很好用的
发表于 2018-3-4 19:53
发表于 2018-3-5 07:37
为你点赞,很详细的教程
发表于 2018-3-5 09:17
想知道附件在哪里??
发表于 2018-3-5 09:39
部分图挂了
 楼主| 发表于 2018-3-5 10:49

我这边图片都是存在的,是不是因为网络原因?
 楼主| 发表于 2018-3-5 10:51
Andy0214 发表于 2018-3-5 09:17
想知道附件在哪里??

附件上传了,原谅我不知道怎么弄进去
发表于 2018-3-5 11:31 来自手机
先收藏,然后慢慢看
发表于 2018-3-5 23:32
很详细,思路清晰
发表于 2018-3-5 23:43
谢楼主,学到了不少新知识
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则


免责声明:
吾爱破解所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:Service@52PoJie.Cn

快速回复 收藏帖子 返回列表 搜索

RSS订阅|手机版|小黑屋|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2019-3-25 13:54

Powered by Discuz!

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表