- 1、本文档共46页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
软件逆向_吴斌
* * 2010_年4月_16日 位段段 位段结构实质是方便对位做操作,上层避免作复杂的地址运算操作。 无名位段,占位置用 C下很多操作,只是为了操作方便,在汇编情况下是无法分辨原来的具体状况,就像位段操作、枚举、共用体、指针、数组、结构体,只要等价,怎么解释都可以,只是是否通俗易懂。 * * 2010_年4月_16日 识别构造及构造方式 1)第一个调用,完成的是初始化工作 2)传入ecx,ecx指向结构体的首地址,并且内部有使用 3)传出ecx又被传出,eax=ecx 满足上述三点则基本则构造函数的可能性就非常大了。 全局构造 : 在GetStartUpInfo前 或再调用main函数前的 _cinit() 在构造全局class之后,会掉atexit(虚构地址) New出来对象,主要特征表现在,new之后就判断是否成功,不成功跳走,ok则call,参数ecx等3个特征。 Ecx直接使用(参数传),且通过eax返回,里面一般做初始化。 对象保存在栈中是比较难识别的,方法仍然是上面的3条原则。This指针应该就是指向结构体(这里说类)的首地址。 * * 2010_年4月_16日 识别析构函数 全局析构 : 在main函数结束后 exit(mainret) 用户定义结束执行的函数也会添加数组中找到就执行 1)最后一个调用,完成的是释放资源工作 2)仍然有ecx传参, 再有析构函数时会存在析构代理的函数,处理析构函数中多继承的关系 3)this指针用来做析构时的标识,在有临时变量拷贝构造,会有传参,使用临时栈存信息,用析构在函数调用,函数外,栈会被释放,信息就没了,栈被破坏了。 ???? 在delete申请的对象时,会先调用析构函数再delete堆空间 Delete时先掉析构函数,再delte 对于在栈中的对象,释放时仍然有上述的迹象存在,只是不确定的信息也非常多,识别的难度就打多了。 * * 2010_年4月_16日 识别成员函数 想 识别成员变量 想 * * 2010_年4月_17日 虚函数构造(单继承) 虚函数的显著特点就是虚表, 多态性只有new的情况下才有,其他情况都是利用名称粉碎的方式来确定具体某个函数(编译期就决定的函数地址), 而new这是通过this获取vTable,调用其中的某项。 构造有虚表给值则是构造函数行为(除非手工做),在构造函数时, 先祖先、再成员对象,最后自己。如果有继承关系每个类中都维护一个虚表的首地址,自己改写的就修改虚表的内容,虚表的排列顺序是第一次定义的顺序。不是最顶层的都要保存虚表,防止下层还有继承,析构时没有保存就析构自己的,自己没有就析构其他人了. 构造时,call构造函数,然后虚表赋值。 在构造函数中,如有父类,先参数列表先初始化,call父类构造,最后初始化自己的构造内的初始化工作。 名称粉碎直接定位 edx = this指针 Eax = [this] = Vtabla(虚表) Call [eax] ;虚表的第一项 有父类则Call 父类构造,否则call自己, 并保存虚表 * * 2010_年4月_17日 虚函数析构函数(单继承) 析构也有对虚表的赋值操作(防止释放其他子类调用自购释放错资源),非new的对象直接调用析构函数,首先保存虚表地址,再调用析构函数,如果有继承则再掉上层的析构函数。在有new对象时,通过虚表调用函数,函数是个析构代理函数,同样先保存虚表,然后调用析构函数,返回是1则掉delete函数释放堆空间。 非new的对象析构时直接掉析构函数,有继承关系则依次调用,并保存当前的虚表信息 [edx+8]虚表地址开始偏移8字节的函数(这里就是析构) 这里多了析构代理负责调析构,最后在delete堆空间。 先保存虚表,再析构自身,如果有继承,再call父类。如果是根节点则直接调析构处理释放资源,就不要在有保存虚表的操作。 * * 2010_年4月_19日 组合情况在在有虚函数的情况下较好区分, 有虚表则继承的虚表永远在第一项(保存虚表地址), 组合操作用this+offset来定位组合对象的this指针。 在没有虚函数的情况下,组合或继承也没有区分的必要,当然也是很难区分。 虚函数 (带组合) 构造: 3父类构造,2个改虚表,1个有虚表未被修改,2继承,1组合,在在赋虚表赋值0偏移前是父类构造和初始化列表,后是自身构造 在有this指针转换时,会作非0判断,析构时按构造相反顺序进行析构。保存虚表-析构自己-按构造相反顺序依次析构。 This指针作偏移, 并取值操作,有
您可能关注的文档
- 车辆构造第一章第一节.ppt
- 车辆维修接待流程__ppt.ppt
- 趣味化学图与原理.ppt
- 车主自主维修的方法.ppt
- 车间管理请假制度和生产管理原则.ppt
- 车间事故案例分析.pptx
- 车险保费计算.ppt
- 车削刀具专题培训.ppt
- 车间电池工艺.ppt
- 车险承保基础.ppt
- 职业技术学院2024级工业机器人技术(安装与维护)专业人才培养方案.docx
- 职业技术学院2024级应用化工技术专业人才培养方案.pdf
- 职业技术学院2024级软件技术(前端开发)专业人才培养方案.pdf
- 职业技术学院2024软件技术专业人才培养方案.docx
- 职业技术学院2024级信息安全技术应用(安全运维)专业人才培养方案.docx
- 职业技术学院2024级新能源汽车检测与维修技术(车辆鉴定与评估)专业人才培养方案.pdf
- 职业技术学院2024级石油炼制技术专业人才培养方案.pdf
- 职业技术学院2024级环境监测技术专业人才培养方案.docx
- 职业技术学院2024级汽车制造与试验技术专业人才培养方案.pdf
- 职业技术学院2024级信息安全技术应用专业人才培养方案.pdf
文档评论(0)