<C++反汇编与逆向分析>和<程序员的自我修养>都是以VC6的代码作为例子讲解的.这里是在vs2017下,CRT代码有些区别,但整体流程上都是初始化环境,设置参数,最后转到用户main函数. class COne { public: COne() { printf("COne \r\n"); } ~COne() { printf("~COne \r\n"); } }; COne g_One; int main() { printf("…
C++反汇编-继承和多重继承   学无止尽,积土成山,积水成渊-<C++反汇编与逆向分析技术揭秘> 读书笔记 一.单类继承 在父类中声明为私有的成员,子类对象无法直接访问,但是在子类对象的内存结构中,父类私有的成员数据依然存在.C++语法规定的访问限制仅限于编译层面,在编译过程中进行语法检查,因此访问控制不会影响对象的内存结构. 子类未提供构造函数或析构函数,而父类却需要构造函数与析构函数时,编译器会为子类提供默认的构造函数与析构函数.但是子类有构造函数,而父类不存在构造函数,且没有虚函数,则…
一.加法 1.Debug下: 14: int nVarOne0 = 1 + 5 - 3 * 6;//编译时计算得到结果 00C0550E C7 45 F8 F4 FF FF FF mov dword ptr [nVarOne0],0FFFFFFF4h 15: cout << nVarOne0 << endl; 00C05515 68 9D 4A BF 00 push offset std::endl<char,std::char_traits<char> >…
对象生成时会自动调用构造函数.只要找到了定义对象的地方,就找到了构造函数调用的时机.不同作用域的对象的生命周期不同,如局部对象.全局对象.静态对象等的生命周期各不相同,只要知道了对象的生命周期,便可以推断出构造函数的调用时机. 局部对象 反汇编: 获取对象首地址并调用构造函数: 对象的地址为: 进入构造函数,先是push一堆寄存器: 还原ecx寄存器,并初始化: 构造函数属于成员函数,在调用时要用到this指针. 如何识别?1.构造函数时这个对象在作用域内调用的第一个成员函数,根据this指针可…
---恢复内容开始--- 加法: 示例: 常量相加,则在编译期间就计算出两个常量相加后的结果,直接将这个结果参与运算,减少了运行期的计算.当有变量参与运算时,会先取出内存中的数据,放入通用寄存器中,再通过加法指令来完成计算过程得到结果. 如果开启O2选项,则是考虑效率优先,编译出来的汇编代码会有很大的变化: 如果使用Release版本开启O2选项后,再查看反汇编,则略过很多无用的步骤,直接给printf压入一个常量作为参数: 如果我们稍加修改: 用命令行参数的个数argc去初始化两个变量,那么由…
---恢复内容开始--- 基本的浮点数指令 示例代码: Visual Studio 2013的反汇编代码是: 对于movss,表示移动标量单精度浮点值 将标量单精度浮点值从源操作数(第二个操作数)移到目标操作数(第一个操作数).源操作数与目标操作数可以是 XMM 寄存器或 32 位内存位置.此指令可用于将单精度浮点值移入/移出 32 位内存位置与 XMM 寄存器的低位双字,或是用于在两个 XMM 寄存器的低位双字之间移动单精度浮点值.此指令不能用于在内存位置之间传输数据. 对于cvtsi2ss指…
各种调用方式的考察 示例: cdecl方式是调用者清空堆栈: 如果执行的是fastcall: 借助两个寄存器传递参数: 参数1和2借助局部变量来存储: 返回值 如果返回值是结构体: 返回值存放在eax和edx两个寄存器中: 返回之后再存放eax和edx到对应的局部变量中: 如果这个结构体中存放的值太多: 调用函数时压入了一个结构体的地址: 子函数中设置完对应的成员的值之后,再返回这个地址:…
if...else...语句 示例: if构成多分支语句 switch 有序线性的switch: 3E82D8位置存放了一个表,标明了要跳转到的地址: 这里的每四字节都标明的是每个case块的首地址: 除了表中的第四个位置,因为没有case 4 所以,第四个位置直接标明的是退出的地址: 非线性索引: 126883C是一张索引表.比如case x,那么这个表中的x位置就存放了一个数字,这个数字表明是第几个case.然后再到case地址表中去查找case块的地址: 然后根据得到的数字,再去case表…
识别类和类之间的关系 在父类中声明为私有的成员,虽然子类对象无法直接访问,但是在子类对象的内存结构中,父类私有的成员数据依然存在. 在没有提供构造函数的时候,系统会尝试提供默认的构造函数: 当子类中没有构造函数或析构函数,而它的父类却需要构造函数与析构函数是,编译器会为这个子类提供默认的构造函数与析构函数.这是为了帮助父类对象完成初始化.同理,如果是子类对象的成员对象需要构造函数,那么系统也会为这个子类对象提供一个默认的构造函数. 如果子类中存在构造函数,而父类中不存在构造函数.那么,如果父类中…
虚函数的机制 当类中定义有虚函数时,编译器会将该类中所有虚函数的首地址保存在一张地址表中,这张表被称为虚函数地址表.编译器还会在类中添加一个虚表指针. 举例: CVirtual类的构造函数中没有进行任何操作,但是我们来看构造函数内部,还是有一个赋初值的操作: 这个地址指向的是一个数组: 这些数组中的内容就是虚函数的指针: 值得注意的是,如果没有虚指针的存在,那么CVirtual大小就是4字节.有了这个指针存在就是8字节. 本例子中,使用了一个空的构造函数,但是编译器自己擅自插入了代码,实现了对虚…
局部对象 当对象所在作用域结束之后,销毁栈空间,此时析构函数被调用. 举例: 函数返回时自动调用析构函数: 堆对象 调用析构代理函数来处理析构函数: 为什么使用析构代理函数来调用析构函数?考虑到如果delete的对象是一个对象数组,可以使用析构代理函数依次析构所有的对象.举例: 调用了构造代理函数: vector deleting destructor函数中先对标志位进行判断: 如果没有跳转,表明delete的是一个数组,则会调用调用析构代理函数对对象进行逐一的析构.如果进行了跳转,则只进行一次…
  浮点数类型 IEEE标准从逻辑上采用一个三元组{S, E, M}来表示一个数N,它规定基数为2,符号位S用0和1分别表示正和负,尾数M用原码表示,阶码E用移码表示.根据浮点数的规格化方法,尾数域的最高有效位总是1,由此,该标准约定这一位不予存储,而是认为隐藏在小数点的左边,因此,尾数域所表示的值是1.M(实际存储的是M),这样可使尾数的表示范围比实际存储多一位.为了表示指数的正负,阶码E通常采用移码方式来表示,将数据的指数e 加上一个固定的偏移量后作为该数的阶码,这样做既可避免出现正负指数,…
C++反汇编第三讲,反汇编中识别虚表指针,以及指向的虚函数地址 讲解之前,了解下什么是虚函数,什么是虚表指针,了解下语法,(也算复习了) 开发知识为了不码字了,找了一篇介绍比较好的,这里我扣过来了,当然也可以看原博客链接: http://blog.csdn.net/hackbuteer1/article/details/7558868 一丶虚函数讲解(复习开发,熟悉内存模型) 1.复习开发知识 首先:强调一个概念定义一个函数为虚函数,不代表函数为不被实现的函数. 定义他为虚函数是为了允许用基类的…
第一章  熟悉工作环境和相关工具 1.1 熟悉OllyDBG  操作技巧 1.2 反汇编静态分析工具 IDA(最专业的逆向工具)     快捷键    功能     Enter     跟进函数实现     Esc       返回跟进处     A         解释光标处的地址为一个字符串的首地址     B         十六进制数与二进制数转换     C         解释光标处的地址为一条指令     D         解释光标处的地址为数据,没按一次将会转换这个地址的数据长…
白杨 http://baiy.cn “在正确的场合使用恰当的特性” 对称职的C++程序员来说是一个基本标准.想要做到这点,首先要了解语言中每个特性的实现方式及其开销.本文主要讨论相对于传统 C 而言,对效率有影响的几个C++新特性: 编译时开销 运行时开销 相关文档: C++编码规范与指导 C++异常机制的实现方式和开销分析 多处理器环境和线程同步的高级话题 C++0x(C++11)新特性点评 相对于传统的 C 语言,C++ 引入的额外开销体现在以下两个方面: 编译时开销 模板.类层次结构.强类…
讲解之前,了解下什么是虚函数,什么是虚表指针,了解下语法,(也算复习了) 开发知识为了不码字了,找了一篇介绍比较好的,这里我扣过来了,当然也可以看原博客链接: http://blog.csdn.net/hackbuteer1/article/details/7558868 一丶虚函数讲解(复习开发,熟悉内存模型) 1.复习开发知识 首先:强调一个概念 定义一个函数为虚函数,不代表函数为不被实现的函数. 定义他为虚函数是为了允许用基类的指针来调用子类的这个函数. 定义一个函数为纯虚函数,才代表函数…
多重继承 多重继承是指C++类同时继承两个类或两个以上的类. class Test { public: int num1; Test() { num1 = 1; } virtual void Proc1(); virtual void Proc2(); }; class Test1 { public: int num2; Test1() { num2 = 2; } virtual void Proc3(); virtual void Proc4(); }; class Test2:public…
学无止尽,积土成山,积水成渊-<C++反汇编与逆向分析技术揭秘> 读书笔记 在C++中,使用关键字virtual声明为虚函数. 虚函数地址表(虚表) 定义:当类中定义有虚函数时,编译器会把该类中所有虚函数的首地址保存在一张地址表中,即虚函数地址表. 虚表信息在编译后被链接到执行文件中,因此所获得的虚表地址是一个固定的地址. 虚表中虚函数的地址排列顺序依据虚函数在类中的声明顺序而定. 虚表指针 同时编译器还会在类的每个对象添加一个隐藏数据成员,称为虚表指针,保存着虚表的首地址,用于记录和查找虚函…
写在前面的话 理解恶意软件的真实代码对恶意软件分析人员来说是非常有优势的,因为这样才能够真正了解恶意软件所要做的事情.但不幸的是,我们并不总是能够得到“真实”的代码,有时恶意软件分析人员可能需要类似反汇编工具或调试器之类的东西才能“推测”出恶意软件的真实行为.不过,当恶意软件使用的是“解释型语言”开发的话,例如Java.JavaScript.VBS或.NET等等,我们就有很多种方法来查看它们真正的原始代码了. 不幸的是,攻击者同样知道这些分析技术,而且为了规避安全分析,他们还会采用很多混淆技术来…
20145307陈俊达_安卓逆向分析_Xposed的hook技术研究 引言 其实这份我早就想写了,xposed这个东西我在安卓SDK 4.4.4的时候就在玩了,root后安装架构,起初是为了实现一些屌丝功能,比如自动抢红包,微信阻止撤回,语音可转发等效果,现在步入了SDK 6.0时代,安上了黑域还有绿色守护真的省电,尤其你在装谷歌全家桶的时候,那个是真的费电啊!这篇文章,我想写一点xposed的工作原理.在不修改APK的情况下,影响其运行过程的服务框架.可以根据自己的需求编写模块,让模块控制目标…
经过一个阶段5次迭代之后,本逆向分析工具功能基本成形.工具的基本功能介绍请参看前面的posts. 现在就和hopper的逆向函数伪代码的功能对比一下效果.在这里并非定胜劣,因为差异可以拿来对比参照,通过比较发现有参考的东西. 下面是hopper的输出的伪代码: void _CABackingStoreUpdate_(int arg0, int arg1, int arg2, int arg3) { var_148 = r9; r12 = arg3; r13 = arg2; var_D8 = ar…
文章内容仅供技术交流,请勿模仿操作! 背景(作者) 每一次外出时, Elizabeth和我总是格外的小心,同时把我们身上的钱藏在特殊的皮带上面,这样还不够,我们还采取了“狡兔三窟”的方式来藏身上带的银行卡,但我们在外出时没有从ATM取款机取走100美元的时候,我们总是手挽手,连走路时候都很小心.期初我认为我也有些偏执症,但由于每一次去取钱还是要输入密码,我也很清楚这一切早晚都会发生的..... ATM Skimmer ATM Skimmers 即ATM分离器,Brian Krebs(1995 ~…
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/577e0acc896e9ebb6865f321 如果您有耐心看完这篇文章,您将懂得如何着手进行app的分析.追踪.注入等实用的破解技术,另外,通过“入侵”,将帮助您理解如何规避常见的安全漏洞,文章大纲: 简单介绍ios二进制文件结构与入侵的原理 介绍入侵常用的工具和方法,包括pc端和手机端 讲解黑客技术中的静态分析和动态分析法 通过一个简单的实例,来介绍如何综合运用砸壳.寻找注…
相关学习资料 http://hi.baidu.com/hucyuansheng/item/bf2bfddefd1ee70ad68ed04d http://en.wikipedia.org/wiki/Instant_Messaging_and_Presence_Protocol https://www.trillian.im/impp/ http://en.wap.wikipedia.org/wiki/Presence_and_Instant_Messaging http://zh.wikiped…
逆向分析基础 0x01-0x0C 本笔记使用汇编指令为x86架构下汇编指令,ARM架构汇编指令不做介绍 0x01. 关于RE 逆向工程(Reverse Engineering RE) 逆向分析方法: 静态分析法:观察代码文件的外部特征.获取文件的类型(EXE.DLI.DOC.ZIP等).大小.PE头信息.Import/Export API.内部字符串.是否运行时解压缩.注册信息.调试信息.数字证书等多种信息,使用反汇编查看内部代码 动态分析法:通过调试来分析代码流,获取内存状态,可以在观察文件.…
本文博客地址:http://blog.csdn.net/qq1084283172/article/details/70176583 下面的文章内容主要参考英文博客<Running Debian MIPS Linux in QEMU>,这篇博客发表的时间比较早,主要是讲述如何在QEMU虚拟机上运行Debian MIPS Linux系统:尽管很多的步骤已经过时了,但是还是比较有参考意义的.这里不会对原文进行生搬硬套的翻译,而是根据对原文的理解进行一次操作的实践和验证. 01.原文中在Ubuntu…
本文博客地址:http://blog.csdn.net/qq1084283172/article/details/69652258 在QEMU MIPS虚拟机上运行MIPS程序--SSH方式 有关在ubuntu系统上安装和使用QEMU虚拟机的内容,这里不会再描述了,在前面的博客中已经写的很清楚里.这里主要讨论的是怎么在QEMU-MIPS的虚拟机中运行MIPS程序.要在QEMU的系统模式下运行MIPS程序就必须让本地ubuntu主机和QEMU-MIPS虚拟机能够进行网络通讯才有机会. 01.获取安…
本文博客地址:http://blog.csdn.net/qq1084283172/article/details/69378333 MIPS系统网络的配置  使用QEMU 模拟正在运行的MIPS系统并配置MIPS系统网络,这样本地主机ubuntu系统就可以和QEMU虚拟机进行网络通讯和传输数据了.在进行MIPS程序的测试时是很有用处. 01.获取安装依赖文件,执行下面的命令: $ sudo apt-get install bridge-utils uml-utilities 02.修改 ubun…
[直播]APP全量混淆和瘦身技术揭秘 近些年来移动APP数量呈现爆炸式的增长,黑产也从原来的PC端转移到了移动端,通过逆向手段造成数据泄漏.源码被盗.APP被山寨.破解后注入病毒或广告现象让用户苦不堪言. 为了解决安卓APP容易被逆向的问题,除了对产品进行加固处理,代码混淆技术是对抗逆向攻击最有效的方式之一.本直播会分享阿里聚安全带来的APP全量混淆技术.此外越来越多的新特性正在啃蚀着大型APP的用户体验,APP瘦身减肥也成了亟待解决的问题,如何能在使用安全功能同时瘦身,也将是本期主题所带来的内…
[编者按]12306网站曾被认为是"全球最忙碌的网站",在应对高并发访问处理方面,曾备受网民诟病. 2015年铁路客票春运购票高峰期已过,并且12306网站今年没"瘫痪",也顺利过关.因此记者在第一时间联系到一位对12306改造非常关注的技术架构师,他从技术的角度,用科学论证的方式,指出原因所在,并根据他的经验进一步说明12306是如何实现高流量高并发的关键技术,与大家共享.以下为正文: 预告:2015年3月中旬左右,技术揭秘12306改造(二):如何实现 1230…