【逆向知识】动态调试技巧-C++代码逆向
1、C++类代码的特点
寄存器ECX传参时一般用作this指针(对象地址)或是计数器。
有ecx传参的call,是成员函数,构造函数,析构函数
能访问成员变量的函数都会有ecx传参
静态函数、全局函数无ecx(this指针)
返回值
寄存器eax一般用作返回值
识别构造函数的OD反汇编代码
特点:
(1) 代码特点:没有返回值、用于初始化
(2)反汇编特点:有返回值,而且是this指针
根据反汇编可以看出成员变量的顺序,因为在内存数据中的排布顺序是由代码中成员变量定义顺序决定的。

识别构造函数的办法:
(1)构造函数调用时,会使用ECX用于this指针
(2)构造函数在反汇编层有返回值,是eax存放this指针
(3)构造函数用于初始化,一般内存如果是未初始化的比如CCCCCCC,经过构造函数会完成初始化。
(4)如果一个函数有对前4字节初始化为一个指针地址,那么可能是在初始化虚函数表指针。
如果一个类有虚函数,那么对象的内存数据里会有虚函数指针的定义。构造函数会初始化虚函数表指针,而类中定义多少个虚函数也只有一个虚函数表指针。

识别成员函数的OD反汇编代码
特点:
(1)ECX传递this指针,调用成员函数
(2)成员函数中会访问exc所指向的内存空间
成员函数与虚函数本身没有什么区别,所以反汇编出来的代码都差不多。

识别成员函数:
(1)如果找到了构造函数,那么下面调用的应该都是成员函数
(2)成员函数有this指针
(3)成员函数会访问成员变量,即this指针指向的内存空间
识别析构函数的OD反汇编代码
特点与识别:
(1)有ECX
(2)用于释放资源,可能有delete,free等
(3)一般是在函数返回时,编译器生成的调用。

全局构造与析构函数
初始化全局对象的构造函数,是在main函数之前,C运行库初始化的代码中_initterm函数
操作:
在return下断点,main函数执行完毕后F11继续执行,继续F11return会返回到上一个调用函数。


exit(xxx) 调用析构函数

有虚函数的派生类
派生类对象的构造初始化
大致流程:
派生类的构造函数
{
基类的构造函数(函数中会初始化虚函数表指针)
初始化虚函数表指针
初始化数据
}
虚函数表创建
虚函数表是在程序编译时就生成了,而且存储在程序的只读区段中
程序中如果创建了多个对象,只会有一个虚函数表,共用一个虚函数表。
C++中的多态实现
//多态的实现
A* pObj = &obj;
pObj->printfD();
模拟反汇编的调用流程
A* pObj = &obj;

测试代码
#include "stdafx.h"
class A
{
public:
A::A() {
c = 3;
m = 1;
n = 2;
};
virtual void printA() { printf(" A::A\n "); };
virtual void printB() { printf(" A::B\n "); };
virtual void printC() { printf(" A::C\n "); };
void printfD() {
printf("(%d,%d)\n",m,n);
printf("hahahahaah");
};
A::~A() {
printf(" A::~A\n ");
};
protected:
private:
int n;
int c;
int m;
};
int main()
{
A obj;
obj.printA();
obj.printfD();
printf(" %d\n ",sizeof(obj));
printf(" 3333333333333333333333333\n ");
return 0;
}
【逆向知识】动态调试技巧-C++代码逆向的更多相关文章
- [转]Android逆向之动态调试总结
一.在SO中关键函数上下断点 刚学逆向调试时.大多都满足于在SO中某关键函数上下断点.然后通过操作应用程序,去触发这个断点,然后进行调试 详细的步骤可以参见非虫大大的<Android软件安全与逆 ...
- apk逆向 - smali动态调试
author: Dlive date: 2016/10/6 0x00 前言 之前有人问过smali的动态调试方法,其实网上已经有很多文章讲这些内容,但是为了方便大家学习,我还是写一下让大家少走点坑 ...
- iOS逆向系列-动态调试
Xcode调试App原理 Mac安装了Xcode Xcode的安装包中包含了debugserver 可执行类型的Mach-O文件,iPhone第一次连接Xcode调试会将Xcode中的debugser ...
- 【Android 逆向】动态调试AliCrackme_1
1 试玩 apk # 安装APK到真机 adb install AliCrackme_1.apk 打开apk,投石问路,输入123试一下 2 将apk 拖入androidKiller,得到反编译的sm ...
- 【逆向知识】GitHub:Awesome-Hacking(黑客技能列表-逆向)
0 初衷 GitHub这一份黑客技能列表很不错,包含了多个方向的安全.但目前我关注只有逆向工程与恶意代码,所以其他的被暂时略过. 虽然很感谢作者的辛勤付出,但并不打算复制粘贴全套转载.逐条整理是为了从 ...
- 【逆向怎么玩】 动态调试一款牛逼C++ IDE实录
声明 本篇只从逆向兴趣出发,研究其程序运行原理. CLion程序版权为jetBrains所有. 注册码授权为jetBrains及其付费用户所有. 不会释出任何完整的源代码. 涉及能直接推算出注册码的地 ...
- 【转】安卓逆向实践5——IDA动态调试so源码
之前的安卓逆向都是在Java层上面的,但是当前大多数App,为了安全或者效率问题,会把一些重要功能放到native层,所以这里通过例子记录一下使用IDA对so文件进行调试的过程并对要点进行总结. 一. ...
- Anroid逆向学习从编写so到静动态调试分析arm的一次总结
Anroid逆向学习从编写so到静动态调试分析arm的一次总结 一.前言 最近跟着教我兄弟学逆向这篇教程学习Android逆向,在第七课后作业反复折腾了好几天,正好在折腾的时候对前面的学习总结一波,动 ...
- 逆向分析-IDA动态调试WanaCrypt0r的wcry.exe程序
0x00 前言 2017年5月12日全球爆发大规模蠕虫勒索软件WanaCrypt0r感染事件,各大厂商对该软件做了深入分析,但针对初学者的分析教程还比较少,复现过程需要解决的问题有很多,而且没有文章具 ...
随机推荐
- BZOJ 3526: [Poi2014]Card
3526: [Poi2014]Card Time Limit: 25 Sec Memory Limit: 64 MBSubmit: 267 Solved: 191[Submit][Status][ ...
- 【转】在单片机中,C语言的一些误用和总结!
在学习单片机的时候才真正知道C语言是什么,它是来干什么的~但是C语言用到嵌入式只是它小小的一部分应用,还有很多地方呢. 我们是不是在写程序的时候,错误很多就算编译通过了也达不到我们预期的结果,完了自己 ...
- 教程] 《开源框架-Afinal》之FinalHttp 01一步一脚
1.FinalHttp是什么 :FinalHttp 对 HttpClient再次封装,最简洁的就是增加了许多回调的方法,对Get 和 Post 请求进行了简化.另外一点就是FinalHttp加入线程池 ...
- windows下用bat启动jar包,修改cmd标题(title)
新建start.bat,输入以下内容即可. @echo off title myprogress-%date%-%time%-%cd% java -jar myprogress.jar
- 【洛谷P1248】加工生产调度
题目大意:某工厂收到了n个产品的订单,这n个产品分别在A.B两个车间加工,并且必须先在A车间加工后才可以到B车间加工.某个产品i在A.B两车间加工的时间分别为Ai.Bi.怎样安排这n个产品的加工顺序, ...
- word宏(macro) 之 注意事项,常见语法和学习地方
宏:计算机科学里的宏(Macro),是一种批量处理的称谓.一般说来,宏是一种规则或模式,或称语法替换 ,用于说明某一特定输入(通常是字符串)如何根据预定义的规则转换成对应的输出(通常也是字符串).这种 ...
- java和javaScript创建方式
Java创建对象的几种方式:http://blog.csdn.net/u013230804/article/details/25828339 javascript三种创建对象的方式:https://w ...
- java代码示例(6-3)
创建AdministratorTest.java /** * 需求分析:创建管理员对象 * @author chenyanlong * 日期:2017/10/15 */ package com.hp. ...
- Python协程笔记 - yield
生成器(yield)作为协程 yield实际上是生成器,在python 2.5中,为生成器增加了.send(value)方法.这样调用者可以使用send方法对生成器发送数据,发送的数据在生成器中会赋值 ...
- 在windows环境下实现开机延迟启动tomcat
如果说我们的服务器断电了 开机之后还需要手动开下服务 还需要远程连接上 然后一个一个开启 是不是很麻烦 我们可以写一个bat脚本 然后设置开机5分钟之后启动tomcat 首先配置环境变量: ...