逆向
Hello_MyDream
这个作者很懒,什么都没留下…
展开
-
PE结构中的VA、RVA、FOA
VA:虚拟内存地址 就是在4G虚拟内存空间中(0x00000000 ~ 0xFFFFFFFF)定位的地址。RVA:相对虚拟内存地址 从所在模块(dll)基地址开始的地址,即:模块基地址 + RVA = VAFOA:文件偏移地址 它是指某个位置距离文件头的偏移。与内存无关。...原创 2020-09-14 10:16:18 · 1013 阅读 · 0 评论 -
调用约定
调用约定函数的调用约定就是:描述参数是怎么传递和由谁平衡堆栈的。__stdcall __cdecl __fastcall调用约定 参数压栈顺序 平衡堆栈 __cdecl 从右至左入栈 调用者清理栈 __stdcall 从右至左入栈 自身清理堆栈 __fastcall ECX/EDX传送前两个,剩下:从右至左入栈 自身清理堆栈 ...原创 2020-07-09 22:54:08 · 26239 阅读 · 0 评论 -
ODbg使用技巧
0x00:Shift + F2可以下条件断点,汉化版od条件断点会被更改,遇到这种情况就要用英文版了。 [esp + 4] !=[esp + 4]或0x xxxxxxxx(这里输入里面的数值或其他值):表示在[esp + 4]里面的数值不为这个值的时候再断。0x01:双击反汇编右侧的位置可以添加注释。0x02:断点停在在函数头部时可以点击follow in disassembly跳到函数调用位置。0x03:Ctrl + g可以直接全局搜索。0x04:F2断点,F7步入,F...原创 2020-06-20 13:57:42 · 27727 阅读 · 0 评论 -
C++逆向基础与正向比较——Virtual关键字、虚函数表以及动态绑定的实现
添加Virtual后会多出四个字节,位于结构体的首地址。这个指针是虚函数表指针(vptr / 虚表指针),指向了虚函数表的开始位置;对虚函数表头继续寻址,就可以得到虚函数指针了。可以看出,结构体首地址的指针为三级指针。在vptr指向的位置维护了一个数组,即虚函数表,里面保存了当前类内所有虚函数的地址。这里找来一张图可以参考一下:使用指针来调用一下函数:#define _CRT_SECURE_NO_WARNINGS#include <iostream>using name原创 2020-06-16 16:22:42 · 29675 阅读 · 0 评论 -
给软件添加代码
一. 代码节空白区域添加代码1. 根据SizeOfRawData - VirtualAddress的值来判断剩余空间是否足以添加代码2. 根据SizeOfRawData + PointerToRawData来到空余部分3. 将汇编指令转为硬编码:此处添加的代码是MessageBox,可以通过OD(走下角命令 bp MessageBoxA)来查看MessageBox的地址。6a 00 6a 00 6a 00 6a 00 e8 00 00 00 00 e9 00 00 00 00push 6原创 2020-06-11 16:35:45 · 28014 阅读 · 0 评论 -
PE结构解析
一. DOS头原来为DOS系统使用,现在只需要记住如下两项。1、DOC头: WORD e_magic * "MZ标记" 用于判断是否为可执行文件. DWORD e_lfanew; * PE头相对于文件的偏移,用于定位PE文件 如上图所示,DOS头一共40H个字节,即64个字节。结尾处4个字节指向了标准PE头的位置:D8。在这中间的文字是编译器加入的一些描述信息。这些字.原创 2020-06-16 00:35:53 · 28930 阅读 · 0 评论 -
C基础反汇编
switchswitch性能高于if语句的原因在于在case值较为连续的时候会生成值连续的大表,用switch的参数减去第一个最小的case值,和最大值进行比较,小于等于的话在表的范围内寻址即可[ecx*4+0F44D04h]。牺牲内存空间,提升效率,以空间换时间。有时间隔较大的还需要生成小表来记录大表的偏移量,省去大表的许多数据。小表记录偏移量的最大值为FF。int main(int argc, char *argv[]){ switch (1) { case 1: printf(.原创 2020-06-07 20:08:02 · 28050 阅读 · 0 评论 -
汇编学习 (二)
一. 改变EIP的三种方式1. jmp:改变EIP的值。2. call:需要在要跳转的位置点击F12设置断点;会将下一行将要执行指令的地址(计算出来的)压栈,以便返回。最大区别:会改变ESP(栈顶)。3. 与TERN(TER)组合使用:TERN返回要执行的那一行,。POP执行后栈地址会+4,相当于POP EIP,让刚才栈中保存的地址出栈。二. 比较指令1. CMP指令:该指令是比较两个操作数,实际上,它相当于SUB指令,但是相减的结构并不保存到第一个操作数中。只..原创 2020-06-03 16:18:42 · 28068 阅读 · 0 评论 -
C语言参数传递——数据与内存宽度
如下图所示,将参数定义为char类型并不会节省空间,依然会按照4字节压栈传参。最后一行的堆栈平衡也很明显的。原创 2020-06-05 23:57:52 · 29625 阅读 · 0 评论 -
逆向目录
https://blog.csdn.net/Hello_MyDream/article/details/106505072汇编学习一https://blog.csdn.net/Hello_MyDream/article/details/106515598JCChttps://blog.csdn.net/Hello_MyDream/article/details/106515648汇编学习二https://blog.csdn.net/Hello_MyDream/article/details...原创 2020-06-05 15:36:00 · 24776 阅读 · 0 评论 -
字符串截取
有一个字符串是这样的:china中国verygood天朝nice,里面既含有中文又含义英文,请编写一个函数,能截取任意长度的字符串n(n<=总长度)例:fn(5) = chinafn(6) = china中fn(8) = china中国v#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>#include <string.h>#include <m原创 2020-06-05 15:32:29 · 27429 阅读 · 0 评论 -
浮点数存储原理
一. 将一个float型转化为内存存储格式的步骤为:1、先将这个实数的绝对值化为二进制格式2、将这个二进制格式实数的小数点左移或右移n位,直到小数点移动到第一个有效数字的右边。3、从小数点右边第一位开始数出二十三位数字放入第22到第0位。4、如果实数是正的,则在第31位放入“0”,否则放入“1”。5、如果n 是左移得到的,说明指数是正的,第30位放入“1”。如果n是右移得到的或n=0,则第30位放入“0”。6、如果n是左移得到的,则将n减去1后化为二进制,并在左边加“0”补足七位,.原创 2020-06-05 14:00:20 · 29915 阅读 · 1 评论