首页 / 软件开发 / 汇编语言 / 如何分析未文档化的数据结构
如何分析未文档化的数据结构2009-02-16 x86asm.com hsly1101 前言:这2天看了Secrets of Reverse Engineering一书,对分析未文档化的API的技术比较有心得,希望各位看了下面的教程,能抛砖引玉灵活的应用在逆向工程和破解技术上,方法是死的,但是人的思维是活,最重要是灵活应用。2 实践:用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的数值当作指针传入ECX06 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->member208 MOV DWORD PTR DS:[ECX+4], ECX ;// 此处指令我们可以翻译为:// MOV DWORD PTR DS:[EAX+4], EAX+4 ;// 09的汇编指令对应的C语言: pUnknowStruct->member2 = &pUnknowStruct->member209 MOV DWORD PTR DS:[ECX], ECX ;// 此处指令我们可以翻译为:// MOV DWORD PTR DS:[EAX+C], EAX+4 ;// 10的汇编指令对应的C语言: pUnknowStruct->member4 = &pUnknowStruct->member210 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 = Param212 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 = Param314 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 = Param416 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