首页
社区
课程
招聘
[求助]请教各位大侠关于C语言结构识别的问题
发表于: 2009-3-14 18:49 5209

[求助]请教各位大侠关于C语言结构识别的问题

2009-3-14 18:49
5209
各位大侠好,小弟在分析一些bin的时候,经常遇到一些自定义结构。
例如:
struct 
{
      int a;
      char *msg;
      char word[1024];
      struct XXX X1;
      ........
      ........
      ........
      int buffer[512];
}

在ida中,如果不对程序进行比较透彻的分析,对这类结构的识别就很难办到。
我在识别结构的时候,是这样进行的:
首先根据汇编代码的初步理解,确定结构体的首地址和尾地址,这样就确定了结构体的大小,
然后在根据汇编代码的分析,逐个的确定结构体中的元素。
在理想的情况下,如在汇编代码中能较明显的分析出结构体的大小,结构体中的每个元素都在
源程序中进行了较规则的访问,这样分析出一个结构体是可行的,但是多数代码可能不理想,
如:
1。声明结构体之后,只访问了其中的某些元素,而有些元素却没有访问(这在多个程序文件
使用一个结构的情况下是很可能的),这样的话,对结构的识别就不是很好办了,例如不能完
全的确定结构的大小,继而对结构的分析出现错误。
2。对结构体的访问过于分散(例如分散在不同的函数中),不能直观的确定各个元素的关系,
从而不能确定出这个是不是一个结构体。

这种情况下,可以等同于是多个分散的变量(如在汇编代码中没有反应出通过指针+偏移的方式
访问各个元素或者结构体传参数结构体指针等等情况吧)。
但是对于重建源代码的逻辑思想或者理解源程序就存在比较大的问题,这个时候,通常的方法是
通过对程序的理解去分析出结构体,但是没有结构体可能会影响对程序的理解,在一些含有数学
运算或者驱动程序中经常见到这种情况。所以就出现了一个悖论。

这个问题困扰我有几周了,期间想过很多方法来识别,但是始终都没有找到一个好的方法,

请问各位大侠平时是怎么解决这些问题的?有没有什么好的方法或者指导性的理论?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 142
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
我顶上去。。。
2009-3-14 23:32
0
雪    币: 142
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
经常顶。。。。。。。。。。
2009-3-15 11:48
0
雪    币: 142
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我继续顶啊顶、、、、
2009-3-15 13:35
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
你就当是纯的C语言的结构体
2009-3-15 13:56
0
雪    币: 142
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我说的就是纯c语言的结构体的识别,如果是系统的,倒感觉有下手的地方。
纯c的结构体在编译后就和普通变量区别不大了,多数甚至是没区别
2009-3-15 15:35
0
雪    币: 142
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
顶,再次顶。。
2009-3-16 10:54
0
雪    币: 142
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
顶,再次顶。。
2009-3-16 16:15
0
雪    币: 193
活跃值: (1439)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
9
买本The IDA Book看看:)
2009-3-16 17:31
0
雪    币: 142
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
我说的是,在程序中,怎么识别出这些结构和成员,看了一些ida的介绍,里面有对结构操作(就是怎么样在ida里面定义一个结构体),没有对结构的识别。
ida book里面有类似的资料吗?
2009-3-16 17:45
0
雪    币: 193
活跃值: (1439)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
11
全局变量跟定义的全局的结构体解析出来应该是一样的
还是应该要对程序的理解进行逆向吧
当然如果是数组的话可能,IDA得到的结果还是比较明显的
The IDA Book 第8章,不知道翻译区,翻译了这个章节没有
2009-3-16 22:40
0
雪    币: 142
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
再次顶!!期待其他大牛给出指点,谢谢poppig大牛
2009-3-17 17:52
0
雪    币: 83
活跃值: (11)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
13
就我的经验:
[1]如果是系统的,正如楼主所言,一般情况下有msdn,pdb等文件来帮助理解结构体.
而且可以在IDA的Structure Windows下使用Insert插入已经知道的结构体的项.然后在程序逆向的过程再慢慢增加结构体的项(使用Edit->Struct).
这里使用symbol typer viewer产生的结构体也能够帮助理解结构体.
[2]如果不是系统的,我没有多少经验.但是我觉得楼主不必要上升的理论高度.按照经验(多多逆向)和实践(慢慢逆向慢慢测试慢慢修改)即可.
写到这里感觉有点废话之嫌,正如楼主所讲,我认为没有对程序透彻的理解,不可能完整的理解程序的结构体.
2009-3-17 19:27
0
游客
登录 | 注册 方可回帖
返回
//