找主函数debug:有调试信息,没优化就大了。
发布:发布版本,优化代码
1.根据字符串进行搜索
2.F8单步搜索main(包含三个参数(注意三推一呼的组合,添加注释
3.3.release版本一般主要功能在前端附近。
4.IDA视图编译
修改内存中的数据。1.直接在1中修改。OllyDbg,找到地址,右键二进制修改。通常,地址大小不能超过原始大小。
2.找到一个新的地址位置输入字符串,然后修改推送位置地址。
3.号码
改变跳转1。OllyDbg直接改变汇编代码或标志位或比较值。
滑板指令nopnop 90
最初的破解控制台想法:
1.修改跳转,直接跳转到想要的地方。
2.修改关键变量的值,就是eax。
3.通过分析得到正确的密码。
4.修改要比较的字符串,使其与我们输入的字符串相同。
先试着破解一下——MFC MFC没吃微软的接口类库
比较容易。我不记得了
初裂——第一个CM(CrackMe)来自《逆向工程核心原理》。
有点简单,就是一个键跳。
函数调用约定1。什么是函数调用约定?
参数传递的规则
2.函数执行后堆栈中的参数怎么办?
(没关系)程序会自动清理。
3.函数执行后esp值如何变化?
esp值恢复到调用该函数之前的状态。堆栈大小有一个固定值。
4.常用的函数调用约定有哪些?
c语言,调用者负责清理堆栈。
Stdcall(,被调用者清除堆栈。
Fastcall(类似于stdcall,部分参数(前两个参数,ecx edx)可以通过寄存器传递实现快速调用,其余参数通过堆栈传递。
Ifelse单个分支标识-调试版本1。找到主函数
断点和程序显示的组合(麻烦点)
2.注意事项:
猜测printf不确定。有可能是把字符串压入堆栈,调用另一个函数,然后在函数内部调用,输出。只能猜测为输出函数,或者包含输出函数ebp *的函数通常是参数ebp-*通常是局部变量lea,是地址转移指令。只传输地址,不传输变量IDA。一般红线相等,绿线不等。单分支发布版的编译器会做一些优化,导致布局和调试版不一样。
Ifelse多分支标识-调试版是多个cmp和jXX的组合。
多分支发布版本优化转换为开关型,直接一步跳转。
开关盒少数分支标识在汇编级为ifelse。
开关情况多分支标识多分支有一个分支表,根据分支在分支表中的偏移量存储的地址跳转。
基于跳转分支表
分支表存储跳转地址
为什么可以直接跳?
因为案例ID必须是整数。
Dowhile循环识别在判断是否满足循环条件之前执行一次代码。
如果满足循环条件-代码
循环条件不满足-中断
特点:代码将被执行一次。
循环识别函数的while循环识别分析ecx在大多数情况下是一个循环计数器。
Eax通常是函数末尾的返回值寄存器。
测试主题-x32dbg直接注释saw flag==
在IDA中是925522*2,然后和config.ini中的字符串进行异或运算
剩下的自己看就挺简单了。
测试题目2同上,只是增加了一些冗余功能和反调试。
如果反调试不影响主进程,可以直接nop。
Win32程序分析启动功能分析Win32程序启动程序识别
Win32窗口创建
main函数有四个参数。
识别控制台主功能有三个参数。
Win32 main有四个参数
使用堆栈传输参数,首先将参数放到eax和ebx。
参数向下的局部变量的位置。
如何判断参数和局部变量:
通常保存场景后,ebp的普适性是参数ebp——是一个局部变量。
使用register传递参数-fastcallfastcall-前两个参数由ecx edx传递。
寄存器传递参数-这个指针这个指针由ecx寄存器传递。
名称修改约定重载:
c编译器:
调用约定
修饰约定
调用约定
_funname@num
_cdecl
_funname
快速呼叫
>@_funname@numc++编译器:
调用约定
修饰约定
stdcall
?funname@@YG参数表@Z
_cdecl
?funname@@YA参数表@Z
Fastcall
?funname@@YZ参数表@Z
参数表:返回值类型,依次为参数类型
用return操作符返回值emmm,return x+y 的返回值在汇编里怎么体现,基本就这样
通过参数按传引用方式返回值引用传参在汇编代码中怎么实现的
不难
局部变量局部变量在win32汇编代码中的展现,跟之前的比较像
全局变量全局变量在win32汇编代码中的展现,一眼就能看出来
全局变量存在数据段,汇编中是存储到另外一个固定的地址
数组数据在汇编中怎么存储、分析
虚函数虚函数引用都在虚函数表里
虚函数表(VirtualTableList)
指针->虚函数表->存储的函数地址-> call
if-else 语句win32程序
跟之前的差不多,没啥大变化
switch-case 语句1.未优化编译:跟之前的单分支switch讲解类似,用cmp
2.优化编译:用dec eax 和 sub代替cmp来调整case值,速度更快
3.利用跳转表:
跟之前多分支switch一样
循环没优化:
优化:
优化版居然更容易理解一点
整数的加减法整数的乘法imul 乘法指令
优化后一般用lea指令
整数的除法-未优化cdq 符号扩展指令
将eax的数的符号扩展到edx中
弱国eax的符号位1,则edx为0xFFFFFFFF
符号位为0,则edx为0x00000000
eax被除数
ecx除数
结果--商在eax 余数在edx
整数的除法-优化一般将除法优化成乘法
除法转化成乘法有点复杂
再思考一下