如何分析未文档化的数据结构

1 前言:

这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的数值当作指针传入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

时间: 2025-01-01 20:52:26

如何分析未文档化的数据结构的相关文章

如何文档化你的PHP类

你已经阅读过关于:面向对象编程可以帮助你管理你的大型web项目,并且你已经开始使用PHP来进行面向对象编程了吗?如果你已经编写了几个类应用在网站上并且你是一个有条理的人的话,那么你应该已经编写了关于它们的一些文档.但是如果你是一个象我一样的不拘小节的人,你只是会在类的源代码中加一些注释而没有别的文档.没有文档就很难记住方法的名字和它们的使用方法(参数和含义).解决这种情况最典型的办法就是打开源代码文件,从成百上千的语句中查找. 类似Javadoc的文档 应该有一种好的方法----如果你曾经使用过

如何文档化你的PHP类(一)

如何文档化你的PHP类(一) 作者:stefano Locati 翻译:limodou   你已经阅读过关于:面向对象编程可以帮助你管理你的大型web项目,并且你已经开始使用PHP来进行面向对象编程了吗?如果你已经编写了几个类应用在网站上并且你是一个有条理的人的话,那么你应该已经编写了关于它们的一些文档.但是如果你是一个象我一样的不拘小节的人,你只是会在类的源代码中加一些注释而没有别的文档.没有文档就很难记住方法的名字和它们的使用方法(参数和含义).解决这种情况最典型的办法就是打开源代码文件,从

编写自文档化的代码

文所以载道也.  -- 宋·周敦颐<通书·文辞> 对于我们程序员来说,我们的工作也是写作--几乎每天都要写代码:而且还要载"道",不仅仅要满足客户的需求,还要让代码具有高度的可读性,这样其他的程序员可以更容易地对代码进行修改和扩展. 按这样的要求,我们需要为代码编写足够的文档,也就是将代码"文档化".常见的做法有两种,外部文档和注释. 外部文档 外部文档指的是在代码文件之外编写的附加文档,比如在Word文档中采用大量的篇幅(如UML图.表格)来设计或记录

艾伟_转载:编写自文档化的代码

文所以载道也.  -- 宋·周敦颐<通书·文辞> 对于我们程序员来说,我们的工作也是写作--几乎每天都要写代码:而且还要载"道",不仅仅要满足客户的需求,还要让代码具有高度的可读性,这样其他的程序员可以更容易地对代码进行修改和扩展. 按这样的要求,我们需要为代码编写足够的文档,也就是将代码"文档化".常见的做法有两种,外部文档和注释. 外部文档 外部文档指的是在代码文件之外编写的附加文档,比如在Word文档中采用大量的篇幅(如UML图.表格)来设计或记录

如何文档化你的PHP类(二)

如何文档化你的PHP类(二) [br]作者:stefano Locati 翻译:limodou   文档化函数或方法   成员函数或方法使用@function标记被文档化.   --------------------------------------------------------------------------------  /*! @function getItemingroup      @abstract gets a bagitem of a given group and

使用Rational Method Composer和Jazz实现开发过程的文档化和自动化(三)

自定义流程 简介 本系列的第 2 部分介绍了 Business Recovery Matters 领导团队如何快速配置其项目环境, 并在若干小时内而不是几天后启动.我们了解了团队如何利用经过验证的成功模式来创建计划和工作项,还查 看了每个工作项如何提供相关指南和基于上下文的指南的链接,使团队成员能够迅速掌握团队的流程. 本文介绍了一个更高级的场景,在这个场景中,Business Recovery Matters 开发团队需要在整个开 发生命周期中执行安全性测试.方法是自定义包含在 IBM Rat

如何使用IBM Rational Method Composer为IBM Rational Team Concert文档化您

如何使用IBM Rational Method Composer为IBM Rational Team Concert文档化您的团队过程 本篇教程指导您如何在 IBM Rational Team Concert 客户机中配置 IBM Rational Method Composer 使用同一个 Eclipse 实例(shell-sharing),并上载由 Rational Method Composer 为 Jazz Team Server 生成的过程模板. 在开始学习之前 思考您想从本文中学到什

科普|文本分析浅析——文档分类

序言自动文档分类是一个很好的例子,说明如何善用机器学习和自然语言处理,让机器更好地处理人类语言.自动分类目的,是给一个文档或一段文字指派一个或多个类别,以方便对文档进行归类和管理.特别是对于出版社.新闻网站.博客或其他需要处理大量文字内容的人和机构来说,人工对文档,并进行分组和分类是极其耗费人力和时间的工作. 大体上讲,有两类机器学习方式:监督学习和非监督学习.监督学习方法是在"以往的观察"之上建立模型,这种"以往的观察"被称为训练集.在做文档分类时,预先定义好文档

使用Rational Method Composer和Jazz实现开发过程的文档化和自动化(四)

创建新的流程资产 场景:创建新的流程资产 在本系列文章的第 2 和第 3 部分中,我们了解了 JKE 组织的 Business Recovery Matters (BRM) 团队如何迅速配置其项目环境,并在若干小时内而不是几天后启动.该团队利用经 过验证的成功模式来创建计划和工作项.每个工作项都提供了相关指南和基于上下文的指南的链接,使团队成 员能够迅速掌握团队的流程.本文将介绍 JKE 团队如何创建新的流程资产. JKE 正迅速扩展到新的业 务领域,不断招聘人才来填补职位空缺.该公司需要更强大