首页
社区
课程
招聘
[原创]教你如何分析未文档化的数据结构
发表于: 2005-8-21 12:23 11929

[原创]教你如何分析未文档化的数据结构

2005-8-21 12:23
11929

[标题] 教你如何分析未文档化的数据结构

[作者] hsly110 或者 猪头三

[个人网站] http://www.x86asm.com 80x86汇编小站

[Email] pliceman_110@163.com PS:本文如果有错漏请来信指出

[范围] 逆向工程

[目的] 分享逆向技术心德

[目标API] 未文档化的RtlInitializeGenericTable

[参考文献] Secrets of Reverse Engineering

[备注] 欢迎转载该文章,只要保留完整内容即可

2005-08-20 撰写
2005-08-21 修正
2005-08-23 修正
------------------------------------------------------

一 前言:
这2天看了Secrets of Reverse Engineering一书,对分析未文档化的API的技术比较有心得,希望各位看了下面的教程,能抛砖引玉灵活的应用在逆向工程和破解技术上,方法是死的,但是人的思维是活,最重要是灵活应用。

二 实践:
用OllyDbg对NTDLL.DLL进行反汇编,前提你要加入NTDLL.DLL的符号表,这样你才能更好的对未文档化的API进行反汇编,你们到微软官方网站获取相应版本Windows系统的系统符号表。
下面是RtlInitializeGenericTable函数的反汇编代码:

01 MOV EDI, EDI ;

//压入堆栈,保存EBP的数值
02 PUSH EBP ;                           

03 MOV EBP, ESP ;

// 获取[ESP+8]的数值传入EAX
// 此处指令我们可以翻译为:
// MOV EAX, DWORD PTR SS:[ESP+8]
// 含义: 把当前堆栈顶向下偏移8h处的值赋给EAX,也就是该函数的第1个参数
// 声明:我喜欢用ESP指针来想象堆栈。但是CPU处理的话,是用EBP来进行偏移处理
04 MOV EAX, DWORD PTR SS:[EBP+8] ;

05 XOR EDX, EDX ;

// EAX+4的数值当作指针传入ECX
06 LEA ECX, DWORD PTR DS:[EAX+4] ;

// EDX的数值传入[EAX],说明EAX的值是某个结构的指针
// 假设pUnknowStruct的地址为 EAX的数值
// 07的汇编指令对应的C语言: pUnknowStruct->member1 = 0 ;
07 MOV DWROD PTR DS:[EAX], EDX ;

// 此处指令我们可以翻译为:
// MOV DWORD PTR DS:[EAX+8], EAX+4 ;
// 备注: [EAX] 为某结构的第1个变量
// [EAX+4]为某结构的第2个变量
// [EAX+8]为某结构的第3个变量
// 含义:该结构的第3个成员变量被赋于指向该结构的第2个成员变量的指针数值
// 08的汇编指令对应的C语言: pUnknowStruct->member3 = &pUnknowStruct->member2
08 MOV DWORD PTR DS:[ECX+4], ECX ;

// 此处指令我们可以翻译为:
// MOV DWORD PTR DS:[EAX+4], EAX+4 ;
// 09的汇编指令对应的C语言: pUnknowStruct->member2 = &pUnknowStruct->member2
09 MOV DWORD PTR DS:[ECX], ECX ;

// 此处指令我们可以翻译为:
// MOV DWORD PTR DS:[EAX+C], EAX+4 ;
// 10的汇编指令对应的C语言: pUnknowStruct->member4 = &pUnknowStruct->member2
10 MOV DWORD PTR DS:[EAX+C], ECX ;

// 此处指令我们可以翻译为:
// MOV ECX, DWORD PTR SS:[ESP+C]
// 含义: 把当前堆栈顶向下偏移Ch处的值赋给ECX,也就是该函数的第2个参数
11 MOV ECX, DWORD PTR SS:[EBP+C] ;

// 含义: 把第2个参数传送给某结构的第7个成员变量
// 12的汇编指令对应的C语言为: pUnknowStruct->member7 = Param2
12 MOV DWORD PTR DS:[EAX+18], ECX ;

// 此处指令我们可以翻译为:
// MOV ECX, DWORD PTR SS:[ESP+10]
// 含义: 把当前堆栈顶向下偏移10h处的值赋给ECX,也就是该函数的第3个参数
13 MOV ECX, DWORD PTR SS:[EBP+10] ;

// 含义:把参数3传给某结构的第8个成员变量
// 14的汇编指令对应的C语言为: pUnknowStruct->member8 = Param3
14 MOV DWORD PTR DS:[EAX+1C], ECX ;

// 此处指令我们可以翻译为:
// MOV ECX, DWORD PTR SS:[ESP+14]
// 含义: 把当前堆栈顶向下偏移14h处的值赋给ECX,也就是该函数的第4个参数
15 MOV ECX, DWORD PTR SS:[EBP+14] ;

// 含义:把参数3传给某结构的第9个成员变量
// 16的汇编指令对应的C语言为: pUnknowStruct->member9 = Param4
16 MOV DWORD PTR DS:[EAX+20], ECX ;

// 此处指令我们可以翻译为:
// MOV ECX, DWORD PTR SS:[ESP+18]
// 含义: 把当前堆栈顶向下偏移18h处的值赋给ECX,也就是该函数的第5个参数
17 MOV ECX, DWORD PTR SS:[EBP+18] ;

// 含义:把EDX的数值赋给某结构的第6个成员变量
// 18的汇编指令对应的C语言为: pUnknowStruct->member6 = 0
18 MOV DWORD PTR DS:[EAX+14], EDX ;

// 含义:把EDX的数值赋给某结构的第6个成员变量
// 19的汇编指令对应的C语言为: pUnknowStruct->member5 = 0
19 MOV DWORD PTR DS:[EAX+10], EDX ;

// 含义:把参数5传给某结构的第10个成员变量
// 29的汇编指令对应的C语言为: pUnknowStruct->member10 = Param5
20 MOV DWORD PTR DS:[EAX+24], ECX ;

21 POP EBP

22 RET 14

三 逆出伪代码:

说明: 反汇编分析出如下关键指令
04 MOV EAX, DWORD PTR SS:[EBP+8] ;
11 MOV ECX, DWORD PTR SS:[EBP+C] ;
13 MOV ECX, DWORD PTR SS:[EBP+10] ;
15 MOV ECX, DWORD PTR SS:[EBP+14] ;
17 MOV ECX, DWORD PTR SS:[EBP+18] ;
可以看得出,该函数使用了5个参数,可以假设为: Param1...5 ;

struct UnknowStruct
{
    UNKNOWN Member1 ;
   UNKNOWN_PTR Member2 ;
   UNKNOWN_PTR Member3 ;
   UNKNOWN_PTR Member4 ;
   UNKNOWN Member5 ;
   UNKNOWN Member6 ;
   UNKNOWN Member7 ;
   UNKNOWN Member8 ;
   UNKNOWN Member9 ;
   UNKNOWN Member10 ;
} ;

struct UnknowStruct *pUnknowStruct ;

pUnknowStruct = Param1 ;

pUnknowStruct->Member1 = 0 ;
pUnknowStruct->Member3 = &pUnknowStruct->Member2 ;
pUnknowStruct->Member2 = &pUnknowStruct->Member2 ;
pUnknowStruct->Member4 = &pUnknowStruct->Member2 ;
pUnknowStrcut->Member7 = Param2 ;
pUnknowStruct->Member8 = Param3 ;
pUnknowStruct->Member9 = Param4 ;
pUnknowStruct->Member6 = 0
pUnknowStruct->Member5 = 0
pUnknowStruct->Member10 = Param5 ;

四: 图片分析流程

获取参数流程图


结构赋值流程图


五:总结
经过反汇编分析,虽然只有22行代码,但是完成了这个结构的初始化工作,该结构的指针存放在EAX寄存器,赋值时,就是对EAX存放的地址进行偏移处理。大家可以查看流程图来思考一下。

六:遗憾
由于时间有限,未能写出下一篇: 教你如何分析结构成员变量的类型
我尽量吧~~~~~~~工作太忙了!


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

收藏
免费 7
支持
分享
最新回复 (19)
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
2
不错。
2005-8-21 13:11
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
3
有好东西,牛哥总是第一个报到

好东西,很受启发!
期待更多。。。
2005-8-21 13:23
0
雪    币: 234
活跃值: (370)
能力值: ( LV9,RANK:530 )
在线值:
发帖
回帖
粉丝
4
看不懂也顶!
2005-8-21 13:39
0
雪    币: 288
活跃值: (415)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
5
不错的东西~
2005-8-21 13:41
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
收藏。。。。
2005-8-21 15:13
0
雪    币: 61
活跃值: (160)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
7
2005-8-21 16:51
0
雪    币: 133
活跃值: (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
不错啊
2005-8-21 17:01
0
雪    币: 603
活跃值: (617)
能力值: ( LV12,RANK:660 )
在线值:
发帖
回帖
粉丝
9
精彩!期待下一篇!!!
2005-8-21 17:58
0
雪    币: 50
活跃值: (145)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
10
辛苦,学习啦
2005-8-21 21:52
0
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
11
丰富多彩,学习
2005-8-21 22:03
0
雪    币: 214
活跃值: (15)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
不知楼主的流程图是怎么制作出来的?
2005-8-21 22:27
0
雪    币: 229
活跃值: (70)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
13
第一篇就精华,高~~~~~
2005-8-22 02:24
0
雪    币: 194
活跃值: (25)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
14
最初由 ljy3282393 发布
不知楼主的流程图是怎么制作出来的?

Microsoft Office Visio
2005-8-22 12:49
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
very good
2005-8-22 15:23
0
雪    币: 222
活跃值: (145)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
Secrets of Reverse Engineering 电子版

http://www.itpub.net/393295.html
2005-8-22 21:22
0
雪    币: 1266
活跃值: (622)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
楼主。那个弯是怎么转的。我用好多次。指示线的转折没有楼主的好看。
2005-8-22 21:25
0
雪    币: 332
活跃值: (479)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
18
可以作为经典的汇编命令应用学习教材!
2005-8-23 11:47
0
雪    币: 419
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
very good
2005-8-23 19:39
0
雪    币: 419
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
gooooooooooooood
2005-8-23 19:39
0
游客
登录 | 注册 方可回帖
返回
//