《加密与解密》笔记四(二)
来源:互联网 发布:科比体测数据 编辑:程序博客网 时间:2024/05/17 01:08
继续基础部分的记录
3:
全局变量:
全局变量一般在调用的时候是直接以
mov dword ptr [********],0x….
来表示赋值的,也就是说直接对全局变量的地址进行解引用操作,在书中有一个图:
注意红色框部分,这里实际上是初始位置和大小,实际上这个是加上了00400000段以后的结果(图片中全局变量的地址)
数组:
实际上数组非常类似于入栈操作,只不过用了sub(减法)操作来代替,比如:
#include<stdio.h>int _stdcall a(int b, int c,int d){ _asm { xor eax,eax add eax,[ebp+8] add eax,[ebp+0xc] add eax,[ebp+0x10] }}int main(){ int b[] = { 1,2,3 }; _asm { push eax } int c = a(b[0], b[1], b[2]); _asm { pop eax } printf("%d", c); return 0;}
我们其实是可以看见,在定义b的那一行语句对应的汇编大概是:
mov dword ptr [b],1 //ebp-14h
mov dword ptr [ebp-10h],2
mov dword ptr [ebp-0Ch],3
如果为全局的话那么大概就是:
int main(){ static int a[] = { 1,2,3 }; int j = 0;00411D2E mov dword ptr [j],0 for (int i = 0; i < 3; ++i)00411D35 mov dword ptr [ebp-14h],0 00411D3C jmp main+37h (0411D47h) 00411D3E mov eax,dword ptr [ebp-14h] 00411D41 add eax,1 00411D44 mov dword ptr [ebp-14h],eax 00411D47 cmp dword ptr [ebp-14h],3 00411D4B jge main+4Fh (0411D5Fh) j += a[i];00411D4D mov eax,dword ptr [ebp-14h] 00411D50 mov ecx,dword ptr [j] 00411D53 add ecx,dword ptr [eax*4+418034h] 00411D5A mov dword ptr [j],ecx 00411D5D jmp main+2Eh (0411D3Eh) }
发现add那一行(00411D53)的解引用方式.
虚函数:
虚函数时C++面对对象最核心的部分,只要一个类中出现了虚函数那么它的第一个4字节大小的数据就是一个虚函数表指针。
这里又要运用到我以前学C++时的笔记(学习资料)里面的一个图了:
(图是自己分析出来的,所以如有错误欢迎指正)
还有一个更细致的图:
这个内容大概就是虚函数表内的情况
但是我们只需要了解:
对应虚函数表指针解一次引用则是一个函数指针,两次引用则到了函数位置,所以有书上的一个汇编描述:
第一次是将虚函数表的指针给eax
然后是将虚函数表指针给esi保存
然后对虚函数表解一次引用给eax得到第一个虚函数的指针
然后对虚函数的指针再解一次引就相当于call了一个函数(跳转到地址,并且将下一行的地址入栈先)
4:
if else switch case
这几个实际上在逆向的时候遇到的就是一处比较(
一般为cmp,或是test,
cmp的话就是将两者的值相减,然后判断0标志寄存器位是否位0(jnz,jz),
test就是两者执行与运算然后判断标志寄存器是否为0,
但是有的时候可能会用到dec,这个就是将后面的值减一,
判断是否为0的方法如 :(case 1,2->dec eax jz … dec eax jz…就相当于第一次减一为0测试跳转第二次再减1测试跳转)
或者是一些跟高级的类似于跳转表: jmp dword ptr [4*eax + ……],
这个只是适用于执行一些特定的如
)然后执行测试跳转
- 《加密与解密》笔记四(二)
- 《加密与解密》笔记四(四)
- 《加密与解密》笔记四(一)
- 《加密与解密》笔记四(三)
- 《加密与解密》笔记(二)
- 《加密与解密》笔记三(二)
- 《加密与解密》笔记五(二)
- 《加密与解密》笔记二
- 加密与解密笔记
- java加密与解密(二)
- 《加密与解密》笔记(一)
- 《加密与解密》笔记(三)
- 《加密与解密》笔记三(一)
- 《加密与解密》笔记五(一)
- 《加密与解密》笔记六(一)
- 《加密与解密》学习笔记(二) - 加密算法和PE文件
- 《加密与解密》笔记一
- 加密与解密(PE结构笔记_概述)
- 拦截器链模式(责任链)
- Android面试题整理-2
- 获取Java虚拟机正在运行所有线程的堆栈信息
- javascript消息框
- Java8新特性--Lambda表达式
- 《加密与解密》笔记四(二)
- React简介
- mysql的查询缓存
- Android面试题整理-3
- selenium+python问题总结
- centos7 更改用户组
- 51nod 1597 有限背包计数问题
- install pip3 for python 3.x
- mysql高性能—分区表