如何分析未文档化的数据结构
2009-02-16 09:36:58 来源:WEB开发网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
3 逆出伪代码:
说明: 反汇编分析出如下关键指令
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 ;
4: 图片分析流程
获取参数流程图
结构赋值流程图
5:总结
经过反汇编分析,虽然只有22行代码,但是完成了这个结构的初始化工作,该结构的指针存放在EAX寄存器,赋值时,就是对EAX存放的地址进行偏移处理。大家可以查看流程图来思考一下。
6:遗憾
由于时间有限,未能写出下一篇: 教你如何分析结构成员变量的类型
我尽量吧~~~~~~~工作太忙了!
更多精彩
赞助商链接