逆向工程核心原理读书笔记 02
# 第四章 IA-32寄存器寄存器:
- 通用寄存器
- 段寄存区
- 程序状态与控制寄存器
- 指令指针寄存器
# 第五章 栈
!(./mdimg/4-5-6-7/image-20211101200340564.png)
push之后:
!(./mdimg/4-5-6-7/image-20211101200403095.png)
可以看到,0x100压栈,esp减4,继续pop:
!(./mdimg/4-5-6-7/image-20211101200515703.png)
到了eax中,esp加4
# 第六章 分析 abex' crackme#1
代码很短:
!(./mdimg/4-5-6-7/image-20211101201321339.png)
比较少,是直接用汇编写的
INC:加一
DEC:减一
CMP:改变的是ZF位
破解的话可以直接将je改为jmp实现无条件跳转
!(./mdimg/4-5-6-7/image-20211101202229402.png)
成功跳转
# 第七章 栈帧
!(./mdimg/4-5-6-7/image-20211101203316594.png)
# 第八章 abex' crackme#2
用vb写的,
vb使用专用引擎:msvbvm60.dll,比如显示消息框是,要调用msgbox函数,vb调用的是msvbvm60.dll里的trcmsgbox函数,这个函数调用的user32.dll的messagebox函数,
!(./mdimg/4-5-6-7/image-20211101204931969.png)
首先调用的是vb引擎的主函数:ThunRTmain,将结构体地址压栈
上面的那些jmp是vb和vc++编译器常见的间接调用
直接分析vb引擎的主函数现在还做不到,所以先搜索字符串
!(./mdimg/4-5-6-7/image-20211101205615061.png)
从上面跳过来的:
!(./mdimg/4-5-6-7/image-20211101205647806.png)
调用了vbavartsteq函数,之后比较返回值ax后,再je
test指令:若其中一个为0,则zf置1:
je:zf为1则跳转
调试到:
!(./mdimg/4-5-6-7/image-20211101211451928.png)
!(./mdimg/4-5-6-7/image-20211101212530095.png)
我输入的什么uname忘了,,但是重新搞一遍是可以的
!(./mdimg/4-5-6-7/image-20211101212800543.png)
可以看出来,他是根据uname来生成serial的,
下面来分析下他是怎么算的:
他在对我们输入后会进行test之后跳转,那么一定会经过某个函数,而这个函数时check之前完成的,那么往上继续找:
!(./mdimg/4-5-6-7/image-20211101214418734.png)
很经典的一个栈帧的代码,开始执行代码会形成栈帧,下断点,可以看到之前有很多nop,不执行动作,只消耗CPU时钟。
# 关于serial算法的部分先跳过
# 第十章 函数 调用约定
cdecl:主要是C语言,调用者负责处理栈
stdcall常用语win32api,被调用者处理栈
fastcall
# 第十一章
第一个小目标,去除对话框,先看下函数调用,一共有四个msgbox的调用
!(./mdimg/4-5-6-7/image-20211101221947384.png)
都下断点后,f9,发现停下来了但是没有到断点的地方,继续运行,f9,发现弹出对话框
!(./mdimg/4-5-6-7/image-20211101223858235.png)
尝试将这里call改为add esp,14后nop 发现不行,addexp14是为了清理栈,14是参数长度
第二次尝试:往上看:
!(./mdimg/4-5-6-7/image-20211101224027003.png)
这个对话框也是其他函数调用的,如果没执行直接ret的话就不调用了,ret的话要根据传递给函数的参数大小调整栈:
!(./mdimg/4-5-6-7/image-20211101224332132.png)
保存后就没有弹窗了。
关于注册码的话,直接有提示:
!(./mdimg/4-5-6-7/image-20211101225836308.png)
# 第十二章
页:
[1]