2.2逆向工程的原理和特点,2.2年化率是多少

  

  找主函数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@num

  

c++编译器:

  

调用约定

  

修饰约定

  

stdcall

  

?funname@@YG参数表@Z

  

_cdecl

  

?funname@@YA参数表@Z

  

Fastcall

  

?funname@@YZ参数表@Z

  

参数表:返回值类型,依次为参数类型

  

用return操作符返回值emmm,return x+y 的返回值在汇编里怎么体现,基本就这样

  

通过参数按传引用方式返回值引用传参在汇编代码中怎么实现的
不难

  

局部变量局部变量在win32汇编代码中的展现,跟之前的比较像

  

全局变量全局变量在win32汇编代码中的展现,一眼就能看出来
全局变量存在数据段,汇编中是存储到另外一个固定的地址

  

数组数据在汇编中怎么存储、分析

  

虚函数虚函数引用都在虚函数表里

  

虚函数表(VirtualTableList)

  

指针->虚函数表->存储的函数地址-> call 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

  

整数的除法-优化一般将除法优化成乘法

  

除法转化成乘法有点复杂
再思考一下

相关文章