调试器是如何实现栈回溯的

  • 目前的主流CPU架构都是使用栈来进行函数调用的,栈上记录了函数的返回地址,因此,通过递归是寻找放在栈上的

函数返回地址,便可以追溯出当前线程的函数调用序列,这便是栈回溯的基本原理。

Exeinfo PE 和 PEiD两个工具的 原理

  • 特征码识别

OD用过什么插件 StrongOD常用选项 跳过哪些异常

  • API Break
  • 异常计数器
  • StrongOD
  • 中文搜索引擎
  • LoadMapEx
  • Ollydbg Script
  • ret/sync IDA联动
  • OllyDump

如何调试没有源代码的驱动 SXE命令 驱动断点位置

  • 使用PE工具查看驱动程序的入口点偏移 然后在入口函数处下断点

IDA F5不能正确识别函数,怎么解决(花指令 混淆的处理方法)

  • 利用OD的去除花指令插件
  • 在IDA中找到流氓指令 手动去除,去除方式,将数据修改为代码或者将代码修改为数据

IDA重设基址的方法

  • 菜单->Edit->Segments->ReBase Program

已经执行的程序 如何从头重新调试

  • 找到头部,右键 此处为新的EIP

如何调试服务

    1. 在调试配置中生成服务
    1. 安装服务
    1. 启动服务
    1. 使用管理员权限启动VS
    1. 附加服务
    1. 在代码中设置断点
    1. 访问服务管理器并操作服务

DLL文件如何调试

    1. 使用OD的LoadDll.exe
    1. 自己写一个程序,用LoadLibrary+GetProcAddress加载目标DLL,然后调试自己的程序

CALL和FF15 FF25有什么区别

  • FF15是call FF25是jmp E8也是call E9是jmp
  • FF15是通过跳板过去,假设在0x450000的位置存储着0x500000的地址,那么FF15 0x450000就会直接跳到0x500000那个地址
  • call是通过两个地址间的偏移来跳转的。E8 目标地址-当前地址-5

反虚拟机技术都有哪些

  • 检测特定的文件夹或文件信息
  • 检测当前进程信息
  • 检测特定的服务名
  • 检测特定的注册表信息
  • 通过特权指令检测虚拟机
  • 利用IDT基址检测虚拟机
  • 利用LDT和GDT
  • 基于时间差检测虚拟机
  • 利用IO端口检测虚拟机

各种反调试技术

  • BeingDebugg反调试
  • NtQueryInformationProcess反调试
  • 进程状态检测
  • SedebugPrivilege
  • 调试环境检测
  • 注册表检测
  • 窗口检测
  • 父进程检测
  • 进程扫描
  • INT3 扫描
  • MD5校验
  • 时钟检测
  • TLS反调试
  • 利用SEH清除硬件断点

分析过什么程序

  • 分析过一些CrackMe 还有扫雷游戏 做过扫雷外挂
  • 分析过010Edit的注册算法 先是暴力破解 然后对其算法进行了分析 算出了正确的序列号
  • 分析过勒索病毒 远控木马 office宏病毒
  • 分析过android的APK 反编译smali代码

32位windows上函数调用 参数压栈方式 堆栈平衡方式有几种?为什么要那么多种?简单说说每种的特点

  • API使用的方式 _stdcall,参数压栈的方式是从右到左 堆栈平衡的方式是call内平衡
  • _cdcel,参数压栈的方式是从右到左 堆栈平衡的方式是call外平衡
  • X64 delphi使用方式,fastcall 参数压栈方式是x64前四个参数使用寄存器 其余使用push 从右到左 delphi前2个
  • 参数使用寄存器 其余使用push 从右到左
  • C++使用的方式 thiscall 参数压栈方式是从右到左 ECX传递对象this指针 其他和stdcall一样
  • 产生这么多方式的原因有两个:
    1. 语言不同
    1. 编译器不同 程序编译的兼容性 编译器为了提供程序兼容性 会继承不同的调用约定方式

描述一下反汇编后的switch是怎么进行的

  1. 当case语句较少时,反汇编和if else相同 都是通过cmp和JCC指令实现跳转 这个时候switch和if else的效率相
    同,这个是普通结构
    2. 当case语句较多的时候 会采用跳转表来编译switch case语句 此时switch效率要比if else高,这个是大表结构
    3. 当间隔较多且case语句较多时,会采用大表+小表结构
    4. 树形结构

IDA和OD在逆向的区别 其中如何在OD中定位win32程序的main函数

IDA:一般作为静态分析工具 可以反编译成C代码 看代码逻辑更清晰 并且支持各种平台的文件格式 Android C++程序
可以使用IDA动态调试分析
OD:一般作为动态分析工具 可以动态调试汇编代码 做运行时分析 只能在windows平台进行操作

如果分析一个杀毒软件的杀毒引擎 有什么思路

如果分析杀毒引擎 应用层的话从扫描器开始分析 也就是从文件扫描这块入手 在文件操作的API下断 CreateFileA/W
ReadFile,跟踪扫描流程 驱动层的话 先使用ARK工具PCHunter定位杀毒引擎驱动做了哪些事 看看有没有SSDT HOOK
IDT HOOK inline HOOK等 确定杀毒引擎的驱动文件 用IDA静态分析所需要的功能 用windbg双机调试驱动程序 动态
观察驱动的运行

如果写一个远控软件 有什么思路

远程控制软件其实就是管理木马的软件 所以编写远控 我会根据实现木马的功能 然后去编写远程控制软件 常见的功能
就是建立网络连接 发送cmd命令 上传下载文件 如果时间有限 我会根据网络中比较流行的远控 比如大灰狼远控
Gh0st远控 根据他们的架构进行设计编写客户端 服务端也就是木马 我会根据需求来编写 功能少的比如只有网络连接
下载功能 我会用汇编语言编写 要是功能多 我会使用C语言来编写框架 用汇编语言实现具体功能 尽可能使用
shellcode实现每一个功能 方便做免杀

常见加解密算法了解多少

基本的编码算法有base64,http/https加密传输的时候都会使用base64编码加密数据 转为字符串进行传输 base64的
特征是字母和数字结合的一串字符串 末尾一般都等号 常见的加密算法分为两种 一种是对称加密 一种是非对称加密
对称加密一般都是通过异或 循环加密 位移 置换等这些操作进行加密的 非对称加密使用的是数学难题 正向求解容易
逆向推理难
常见的对称加密算法有DES,3DES,TEA.AES 常见的非对称加密算法有RSA,椭圆曲线
逆向分析时一般分析算法是先使用插件识别程序中的编译常量来确定算法 插件有PEID的算法插件 yara规则算法特征
库 IDA的算法插件 然后定位代码 再动态调试分析算法 然后根据具体的算法实现逻辑找算法的key或是其他关键的部
件 进行深入分析

od和ida的反汇编引擎有什么区别?

OD的反汇编引擎算法使用的是线性扫描,Ctrl+A功能使用的算法是递归下降
IDA反汇编引擎算法使用的是递归下降

反汇编引擎工作原理?
OpCode查表

怎么写一个注册机?如果是网络验证如何破解?

首先将程序的注册算法分析出来 然后根据注册的算法推出注册机
找到网络验证的地方 直接暴力破解

IDA脚本是否用过

在破解反虚拟机的时候用过一个搜索反虚拟机指令的python脚本

如何确定汇编指令的长度

1.没有操作数的指令,指令长度为1个字节
2.操作数只涉及寄存器的的指令,指令长度为2个字节 如:mov bx,ax
3.操作数涉及内存地址的指令,指令长度为3个字节 如:mov ax,ds:[bx+si+idata]
4.操作数涉及立即数的指令,指令长度为: 寄存器类型+1 8位寄存器,寄存器类型=1,如:mov al,8;指令长度
为2个字节16位寄存器,寄存器类型=2,如:mov ax,8;指令长度为3个字节
5.跳转指令,分为2种情况:
1.段内跳转(指令长度为2个字节或3个字节)
jmp指令本身占1个字节
段内短转移,8位位移量占一个字节,加上jmp指令一个字节,整条指令占2个字节
如:jmp short opr
段内近转移,16位位移量占两个字节,加上jmp指令一个字节,整条指令占3个字节
如:jmp near ptr opr
2.段间跳转,指令长度为5个字节
如:jmp dword ptr table[bx][di]
或jmp far ptr opr
或jmp dword ptr opr

给你一个外挂,如何逆向获得里面的功能?

根据外挂的快捷键和按钮一个一个的去定位到所有的响应事件 然后开始逆向 比如说F1是秒杀 那么可以从F1的响应事
件开始入手 逐个逆向分析

假如调用了一个API,那么在调用API处,OPCODE与汇编指令的形式是什么样的?

首先在调用API之前会有几个push用于传递参数 然后会有一个E8也就是call用于调用API

汇编指令call和ret的具体操作是什么

RET等价于将栈顶地址pop出来 然后再jmp到这个地址
CALL等价于将CALL指令下一条地址push到栈中 然后再jmp到CALL后面要跳转的地址中

PE文件是什么 属于PE文件的扩展名有哪些

PE文件是windows下的可执行文件格式 扩展名exe,dll,sys,ocx,com都是PE文件格式

OD中常规断点的快捷键是什么 并简要说明常规断点与内存断点的实现原理

OD常规断点的快捷键是F2类似VS中的F9
常规断点 即是int3断点 机器码为CC通过简单指令临时替换实现 中断下来后再恢复原有指令API函数DebugBreak内
部即是int3要特别说明的是int3指令是专为调试而设计的中断指令 只有1字节大小 可以替换任意指令
内存断点 在访问内存时进行中断 通过修改内存属性来实现 当对指定内存访问时会引起访问违规 系统发送调试事件给
调试器 实现断点机制

简述一个OFFSET与LEA的区别

lea是机器指令offset是伪指令
lea是在运行时执行 而ofset是在编译时执行
lea可以获取由寄存器组成的表达式地址 可以进行比较复杂的运算
offset只能取得用”数据定义伪指令”定义的变量的有效地址 不能取得一般操作数的有效地址

简述一下Intel CPU体系架构是如何实现硬件断点 且相对于软件断点的优势

硬件断点原理是使用4个调试寄存器(DR0 DR1 DR2 DR3)来设定地址 以及DR7设定状态 硬件断点的优点是速度快 在
INT3断点容易被发现的地方 使用硬件断点来替代会有很好的效果 缺点就是最多只能设置4个断点

80x86 16位CPU有四个段寄存器 它们有什么作用

四个段寄存器分别为:CS,DS,ES,SS
CS:代码段寄存器, 装代码段的起始地址
DS:数据段寄存器,装数据段的起始地址
ES:附加段寄存器,装附加段的起始地址
SS:堆栈段寄存器,装堆栈段的起始地址