为了能到远方,脚下的每一步都不能少.|

园龄:粉丝:关注:

随笔分类 -  c++反汇编与逆向分析技术揭秘

std::function逆向还原
摘要:std::function的内存结构 本文案例地址:https://wwmf.lanzout.com/b029diasb 密码:areg std::function为lamda函数时 本文的代码都是32位为例 vftable 首先我们可以从Func_impl_no_alloc_V_lambda得知这
155
0
0
记录第一次使用c++和汇编联合编译
摘要:32位 从Ida把目标函数扣出来 toUapper proc near arg_0 = dword ptr 4 push esi mov esi, [esp+4+arg_0] push edi mov edi, esi or ecx, 0FFFFFFFFh xor eax, eax repne sc
99
0
0
使用ida查看这个函数调用了哪些api
摘要:用ida查看一个函数,如这个叫getDiskInformAndSend的函数,想快速查看这个函数调用了哪些api,怎么做呢? 右键点击函数名称,在选项里选择Xrefs graph from(Xrefs graph from 表示查看有哪些函数是从这个函数调用的 Xrefs graph to 表示查看
610
0
0
c++ 类(结构体)内存的对齐方式
摘要:c++ 内存对齐方式其实只要遵守两条定律就行了 当前对齐值 在为结构体或类的数据成员分配内存时,当前的数据成员类型长度为M,指定的对齐值是N,那么当前对齐值就是min(M,N),当前地址要被当前对齐值整除 总体对齐值 如果结构体的数据成员类型的最大值为M,指定的对齐值为N,那么实际的对齐值就是min
202
0
0
复制构造函数被自动调用的时机
摘要:对象参数传参时 ​ 示例代码 #include <stdio.h> #include <string.h> class Person { public: Person() { name = NULL;//无参构造函数,初始化指针 } Person(const Person& obj) { // 注:
79
0
0
c++ 多重继承
摘要:代码案例 #include <stdio.h> class Sofa { public: Sofa() { color = 2; } virtual ~Sofa() { // 沙发类虚析构函数 printf("virtual ~Sofa()\n"); } virtual int getColor()
54
0
0
c++命名粉碎及快速还原
摘要:name mangling跟函数重载紧密相关。mangling就是将参数、命名空间、返回值、调用方式等信息加入函数名中,目的就是为了给重载的函数不同的签名,因此调用函数的时候才好确认。 但是有个问题,vs和gcc使用了不同的命名粉碎规则,我们不可能花大量精力在学习粉碎规则,如何快速还原,其实编译器早
652
0
0
2的幂取模优化
摘要:第一种2的幂取模优化 若被除数是正数,只需取低k位的值即可。 eg. 若k取3,则除数为8,被除数为9,则模数为9的低3位,001(2) 可以这样做的原因是第k+1位的值等于2k,也就是说大于等于k+1位的值都大于2k,他们的取值不影响余数 余数的取值范围为 [0,2k1] 若被除
344
0
0
除法优化识别以及还原方法
摘要:除数为无符号2的幂 快速识别 ​ x >> n(无符号右移) 快速还原 ​ x2n\(n=4,\)x16 除数为无符号非2的幂 快速识别 xc=xM>>n,且使用无符号乘法时 快速还原 \(c = \frac
155
0
0
有符号费非负2的幂的第一种除法优化
摘要:感觉这一种比较简单,就是xc=x2nc12n的除法优化而已,只不过魔术M是负数而已 但是gcc编译的优化方式略有不同 请看下图 当c<0时,\(\frac{x}{c} = -\frac{x}{-c} = - (x*\frac{2^
43
0
0
除法优化有符号-2的幂逆向还原
摘要:现在我们来逐步分析每一条代码的作用 push ecx 这条代码实际上是为了将esp-4,腾出一个局部变量的栈空间 lea eax,dword ptr ss:[esp] 将刚刚增加的栈空间的地址放入eax中 mov dword ptr ss:[esp],0 初始化这个变量 push eax 将变量地址
45
0
0
逆向还原除法有符号非2的幂的第二种优化
摘要:从代码上来看,基本和有符号非2的幂的第一种优化一样,可是0x003F103F处的加法却很奇怪,请注意0x003F1036的乘法是否符号乘法,而它的操作数是一个负数,但是实际上我想要的是一个无符号数,所以0x003F103F处的加法是为了把这个负数变成无符号数。 接下来我们看看它是如何完成这个操作的
53
0
0
关于c++反汇编与逆向分析除法优化推导6和推导7的思考
摘要:关于c++反汇编与逆向分析除法优化推导6和推导7的思考 推导6: a、b均为整数,x为实数 推导7 设有a、b两整数,当b>0时,有 设有a、b两整数,当b<0时,有
66
0
0
有符号非2的幂的第一种优化
摘要:xc=x2nc12n 这样就把除法转换为被除数x乘以一个整数,再右移n位的形式,但是有一个问题,因为右移n位是取下整 右移n位是取下整 例子: ​ -3/2 = 0xFFFFFFFD / 2 =0xFFFFFFFD >> 1 =
65
0
0
关于有符号整数的一些思考
摘要:1.补码是什么? ​ 计算机存储时,以补码表示负数,例如-1的补码是FFFFFFFF 2.补码如何计算? ​ 因为补码的定义是零减去这个数的绝对值 ​ 例如如-2 == 0-2 == 00000000 - 00000002,零向高位借一位 = FFFFFFFF+1 -00000002 =FFFFFF
127
0
0
点击右上角即可分享
微信分享提示
深色
回顶
收起