0%

逆向笔记之C基础(二)

本文笔记均来自于对滴水逆向教程的学习,通过学习教程记录的笔记,个人所见所得。

内存图

数据类型与数据存储

C语言数据类型汇编数据宽度
charbyte
shortword
intdword
longdword
  1. 无符号跟有符号,在内存中存储的是一样的,根据使用的人来决定

  2. 默认有符号,类型转换–比较大小–数学运算要注意

  3. 有符号跟无符号,比较会改掉,jbe跟jle 低于等于,小于等于

Read more »

Win32

第一章

编码的发展

  1. ascii
  2. gb2312
  3. unicode

win32宽字符

宽字符,win底层都是用宽字符实现的

练习

练习使用带w的函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// WChar.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <locale>

int main(int argc, char* argv[])
{
setlocale(LC_ALL, "");
// TODO: Place code here.
wchar_t wStr[] = L"中国";
wprintf(L"%s\n", wStr);
int length = wcslen(wStr);
wchar_t wAim[10];
wcscpy(wAim,wStr);
wcscat(wAim,wStr);
int result = wcscmp(wAim,wStr);
unsigned short* test = wcsstr(wAim, wStr);
return 0;
}
Read more »

逆向笔记之基础学习(一)

本文笔记均来自于对滴水逆向教程的学习,通过学习教程记录的笔记,个人所见所得。

我感觉滴水课程原理性的讲的蛮好,通过这个来夯实基础。

大纲:

  1. 进制学习

    1. 数据宽度
    2. 二进制的逻辑运算
    3. 通用寄存器
    4. 常见汇编指令
    5. 内存
    6. 标志寄存器
    7. 堆栈
    8. jcc

进制

学习大纲:

  1. 进制的实质就是查表
  2. 熟悉2进制跟16进制的转换
  3. 熟悉进制表的制作以及计算进制之间的加减乘除
Read more »

C++

this指针

汇编中会将对象的基地址通过ecx传递,然后通过ecx+几来计算

练习

习题1

代码原型,分别分析结构体中的Add跟普通的Add 以及结构体中的Sub跟普通的Sub的区别

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
// Test.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>

using namespace std;

struct Calc
{
int x;
int y;
int Add()
{
return this->x + this->y;
}
int Sub(int num1)
{
return this->x + this->y -num1;
}
};
int Add()
{
return 1+2;
}
int Sub(int num1)
{
return 1+2-num1;
}


int main(int argc, char* argv[])
{
Calc mycalc = Calc();
mycalc.Add();
mycalc.Sub(1);
Add();
Sub(1);
//cout << "Hello world!" << endl;
return 0;
}
Read more »

PE文件

需要认真学的地方了,我多次学这个都放弃了,这次得认真学下去

手动解析PE文件

dos头

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
typedef struct _IMAGE_DOS_HEADER {      // DOS .EXE header
WORD e_magic; // Magic number *
WORD e_cblp; // Bytes on last page of file
WORD e_cp; // Pages in file
WORD e_crlc; // Relocations
WORD e_cparhdr; // Size of header in paragraphs
WORD e_minalloc; // Minimum extra paragraphs needed
WORD e_maxalloc; // Maximum extra paragraphs needed
WORD e_ss; // Initial (relative) SS value
WORD e_sp; // Initial SP value
WORD e_csum; // Checksum
WORD e_ip; // Initial IP value
WORD e_cs; // Initial (relative) CS value
WORD e_lfarlc; // File address of relocation table
WORD e_ovno; // Overlay number
WORD e_res[4]; // Reserved words
WORD e_oemid; // OEM identifier (for e_oeminfo)
WORD e_oeminfo; // OEM information; e_oemid specific
WORD e_res2[10]; // Reserved words
LONG e_lfanew; // File address of new exe header *
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
Read more »

移位与内存分配

移位

  1. 算术移位
  2. 逻辑移位
  3. 循环移位

算术移位

逻辑移位

循环移位

带进位的循环移位指令

练习

  1. 定义一个unsiged char 类型,通过程序为第3、5、7位赋值,赋值时不能影响到其它位原来的值.(使用位操作指令、比如:& | ! ^ << >>等)
  2. 判断某个位的值是否为1. (使用位操作指令、比如:& | ! ^ << >>等)
  3. 取第7、6、5位的值,以十进制显示(unsigned).(使用位操作指令、比如:& | ! ^ << >>等)
  4. 用十六进制文本编辑器分别打开一个.exe、.dll、.sys、.txt、.doc .jpg、.pdf等将前四个字节写在下了.
  5. 将一个在十六进制编辑器中打开的.exe文件,拖拽到最后,观察文件中的大小和硬盘上的大小.
Read more »

指针

指针1

大纲:

  1. 宽度
  2. 声明
  3. 赋值
  4. ++ –
  5. 加/减 一个整数
  6. 求差值
  7. 比较

这些我都学过了,c语言基础相对较好,略过

1
2
3
4
5
char**** a;
char**** b;
a = (char****)200;
b = (char****)100;
int x=a-b;

结果就是砍掉一个*,在除以数据宽度就行

总结:

  1. 带有 * 的变量类型的标准写法:变量类型* 变量名
  2. 任何类型都可以带 * 加上 * 以后是新的类型
  3. *可以是任意多个
  4. 带 * 类型的变量赋值时只能使用“完整写法”.
  5. 带 * 类型的变量宽度永远是4字节、无论类型是什么,无论有几个*.
  6. 不带*类型的变量,++或者– 都是假1 或者减1
  7. 带*类型的变量,可是进行++ 或者 –的操作
  8. 带 * 类型的变量,++ 或者 – 新增(减少)的数量是去掉一个*后变量的宽度
  9. 带*类型的变量可以加、减一个整数,但不能乘或者除.
  10. 带*类型变量与其他整数相加或者相减时:
    • 带 * 类型变量 + N = 带 * 类型变量 + N(去掉一个后类型的宽度)
    • 带 * 类型变量 - N = 带 * 类型变量 - N(去掉一个后类型的宽度)
  11. 两个类型相同的带 * 类型的变量可以进行减法操作.
  12. 想减的结果要除以去掉一个 * 的数据的宽度.
  13. 带 * 的变量,如果类型相同,可以做大小的比较。
Read more »

Switch语句逆向

break加与不加有什么特点?default语句可以省略吗?

答: 不加,每个都会执行,可以省略,不过怕会出错

添加case后面的值,一个一个增加,观察反汇编代码的变化(何时生成大表).

将3中的常量值的顺序打乱,观察反汇编代码(观察顺序是否会影响生成大表).

答: 不会

将case后面的值改成从100开始到109,观察汇编变化(观察值较大时是否生成大表).

Read more »

结构体

1
2
3
4
struct AA
{

}

返回结构体

1
2
3
4
lea eax,[ebp-30h]
push eax
call
# 这样利用地址存储返回的结构体

练习

  1. 定义一个结构体Gamer用来存储一个游戏中的角色的信息,包括血值、等级、坐标等信息
    • 具体包含哪些信息自由设计
    • 但这些包含的类型中,必须要有一个成员是结构体类型
  2. 定义一个函数,用来给这个结构体变量赋值
  3. 定义一个函数,用来显示这个结构体变量的所有成员信息
Read more »

参数返回值局部变量_数组

  1. 本机尺寸:如果本机是32位的,那么对32位的数据支持最好,如果是64位的,那么对64位的支持最好.
  2. 编译器遵守了这个规则:char类型或者short类型的参数不但没有节省空间,反而浪费了多余的操作.

结论:整数类型的参数,一律使用int类型

参数传递的本质:将上层函数的变量,或者表达式的值“复制一份”,传递给下层函数.

Read more »