加密与解密 调试篇 静态分析技术 (三)枚举/IDC/插件

news2024/12/22 20:25:15

目录

1.枚举类型

2.FLIRT

1.应用FLIRT签名

3.IDC脚本

IDC分析加密代码

 4.插件

5.IDA调试器

1.加载目标文件

 2.调试器界面

​编辑

3.调试跟踪

4.断点

5.跟踪


1.枚举类型

这是一段c语言源代码

#include <stdio.h> 
int main(void)
{
	enum weekday { MONDAY, TUESDAY, WEDNESDAY, THUSDAY, FRIDAY, SATURDAY, SUNDAY }; 

	printf("%d,%d,%d,%d,%d,%d,%d",MONDAY,TUESDAY, WEDNESDAY, THUSDAY, FRIDAY, SATURDAY, SUNDAY );

	return 0;
}

 在IDA的反汇编中却成为了没有意义的数字

 因为是有规律的 所以我们可以使用枚举类型来表示这个数字

View ->Open subviews->Enumerations->Shift+0

插入一个新的weekday

然后在 weekday枚举中 按N

 我们重新选择需要定义的数据处

 

Edit->Operand types->Enum member 

 

 如果我们想在操作数类型中重新定义现有数据

Edit->Operand types -> Enum member /按M/右键->Symbolic constant

2.FLIRT

FLIRT(库文件快速识别与鉴定技术)

可以让IDA在一系列编译器的标准库文件里自动找出调用的函数,使反汇编更加清晰

1.应用FLIRT签名

一般反汇编 无法给出具体函数名字

例如

C语言 strlen 函数
在一般中 可能只会显示

call 406E40

这样的反汇编虽然正确但是没有意义

而IDA中FLIRT却可以正确标记所调用的库函数名称

call strlen

IDA通常可以识别一些编译器 但是不一定成功

1. 反汇编一些特定版本编译器产生的程序 

例如 微软的记事本

2. 程序中的编译器资料被删除了

例如 高级语言编写的病毒程序

3. 编译器不支持导致识别失败

打开随书文件

 我们假设这里的call无法识别

我们主要要学会如何载入

View->Open subviews->Signatures /shift +F5

 Apply new signature

 选中后应该是会自动重新分析代码

如果没有

Options -> Analysis  -> Reanalyse program

3.IDC脚本

IDA可以使用脚本来提升控制

IDA支持两个语言编写脚本 IDC、pyhton

IDA的原始嵌入脚本语言叫做IDC

IDC原本就是一种类C语言的脚本控制器、语法和C语言类似

IDC的脚本中都一条包含ida.idc语句

这是IDA的标准库函数

变量定义形式为 auto var

其他逻辑、循环等语句与C语言类似

随书带有3个例子

我们看看第二个

IDC分析加密代码

载入程序

分析一下入口代码

 

 

 

 这里我们能发现 sub_401080       是对 sub_401060的解密

这段代码利用了 SMC (自己修改自己代码技术)

可执行文件中保存着加密文件 然后只有在程序运行 才会通过一处返回正确的代码


call  解密子程序
call  解密后的子程序

我们分析一下解密代码

.text:00401080 ; =============== S U B R O U T I N E =======================================
.text:00401080
.text:00401080
.text:00401080 sub_401080      proc near               ; CODE XREF: sub_401020+6↑p
.text:00401080                 mov     eax, offset loc_401060
 
eax中存入 401060

.text:00401085
.text:00401085 loc_401085:                             ; CODE XREF: sub_401080+14↓j
.text:00401085                 mov     bl, [eax]

把eax中的401060首地址 放入 bl

.text:00401087                 xor     bl, 1

和1进行异或

.text:0040108A                 mov     [eax], bl

把异或后的结果存回eax的地址

.text:0040108C                 inc     eax

把eax的地址进入下一个字节

.text:0040108D                 cmp     eax, (offset loc_401070+4)

检查待查的指令是否结束

.text:00401092                 jg      short locret_401096

结束就调到 401096

.text:00401094                 jmp     short loc_401085

没有就继续

.text:00401096 ; ---------------------------------------------------------------------------
.text:00401096
.text:00401096 locret_401096:                          ; CODE XREF: sub_401080+12↑j
.text:00401096                 retn
.text:00401096 sub_401080      endp
.text:00401096
.text:00401096 ; ---------------------------------------------------------------------------

我们使用随书的代码


#include <idc.idc>
static decrypt(from, size, key ) { 
   auto i, x; 
   for ( i=0; i < size; i=i+1 ) { 
      x = Byte(from); 
      x = (x^key); 
      PatchByte(from,x); 
      from = from + 1;
   } 
 Message("\n" + "Decrypt Complete\n");
} 

 

File->Script file

File->Script command /shift +F12

 run

然后重新对 401060 进行分析

选中 401060的代码 然后U 然后重新选中 按 C

就可以出现解密后的代码了

在实际环境中

大多数程序的加密都比这复杂

但是思路都是一样

通过汇编看看是如何解密 然后就写出脚本来解密即可


在IDA中 对于由 SMC和其他加密技术的代码 也可以使用其他方式来解密

(OllyDbg的动态调试)然后通过IDA的"Additional binary file" 将解密文件程序加载

这样就会比自己写代码来的有效

 4.插件

这里我们就介绍一个插件

已经集成在IDA中了

Hex-Rays

在进行IDA反汇编分析前

View->Open Subviews-> F5/Pseudocode

 这样就能返回高级语言

5.IDA调试器

1.加载目标文件

Debugger->Select Debugger

选中 Local Windows debugger

 

 

 2.调试器界面

 

3.调试跟踪

IDA快捷键
F7单步步进,遇到call指令时跟进
F8单步步过,遇到call指令时路过,不跟进
F4运行到光标所在行
Ctrl+F7直到该函数返回时才停止
F9运行程序
Ctrl+F2终止一个正在运行的程序
F2设置断点

4.断点

F2进行断点

Debugger -> Breakpoints -> Breakpoints List

也支持条件断点

设置断点后 

右键 -> Edit Breakpoints


5.跟踪

IDA分为两个分类

一类是 指令跟踪

Debugger -> Taceing -> Instruction Tracing


IDA负责 记录地址、指令和寄存器的值


另一类是函数跟踪

Debugger -> Tracing -> Function Tracing

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/683351.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis入门(6)-ZSet

Redis中的Zset是有序的、可重复的&#xff08;元素不能重但score可重&#xff09;&#xff0c;其中每个元素都有一个分值score&#xff0c;Redis会根据其score对其进行从小到大的排序。 1.zadd key score member [score member] 添加元素 zadd subject 3 JAVA 2 C 1 mysql…

操作系统——磁盘调度算法的模拟与实现

一、实验题目 磁盘调度算法的模拟与实现 二、实验目的 (1) 了解磁盘结构以及磁盘上数据的组织方式。 (2) 掌握磁盘访问时间的计算方式。 (3) 掌握常用磁盘调度算法及其相关特性。 三、总体设计&#xff08;含背景知识或基本原理与算法、或模块介绍、设计步骤等&#xf…

计算机网络--网络编程(1)

简单认识一下传输层中的UDP和TCP&#xff1a; TCP&#xff1a;有链接&#xff0c;可靠传输&#xff0c;面向字节流&#xff0c;全双工 UDP&#xff1a;无连接&#xff0c;不可靠传输&#xff0c;面向数据报&#xff0c;全双工 有链接类似于打电话&#xff0c;通了就是有链接。…

软件测试项目中如何做好单元测试

前言 如《Unit Testing》书里提到&#xff0c;学习单元测试不应该仅仅停留在技术层面&#xff0c;比如你喜欢的测试框架&#xff0c;mocking 库等等&#xff0c;单元测试远远不止「写测试」这件事&#xff0c;你需要一直努力在单元测试中投入的时间回报最大化&#xff0c;尽量…

kotlin Flow系列之-SharedFlow

文章目录 前言SharedFlow之创建SharedFlow之缓存系统buffer&Slots SharedFlow源码发送数据接收数据SharedFlow存在的bug 前言 Kotlin中Flow被分为冷流 热流 两大类。比如经常被使用的flow{}函数就可以创建一个冷流。而本文的主角SharedFlow就是一个热流。冷流需要调用Flow…

Makefile基本原理详解及使用

1、什么是 Makefile 一个企业级项目&#xff0c;通常会有很多源文件&#xff0c;有时也会按功能、类型、模块分门别类的放在不同的目录中&#xff0c;有时候也会在一个目录里存放了多个程序的源代码。 这时&#xff0c;如何对这些代码的编译就成了个问题。Makefile 就是为这个问…

电路图中常见符号总结

前辈说不会FPGA电路原理图&#xff0c;就不能知道如何去控制、如何去实现 因此本篇记录看的原理图中见到的符号&#xff0c;虽然都很基础&#xff0c;但我都不会&#xff0c;难受&#xff0c;因此只能看一点记一点 >_< >_< >_< >_< >_&…

如何学习和提升软件测试与调试的能力?

要学习和提升软件测试和调试能力&#xff0c;可以考虑以下方法&#xff1a; 学习软件测试基础知识&#xff1a; 了解软件测试的基本概念、原则和方法。可以通过阅读相关书籍、参加在线课程或培训来学习软件测试的基础知识。 掌握测试技术和工具&#xff1a; 了解各种测试技术…

南卡OE Pro新品上线即刻售罄:秒空背后的热潮是什么?

近日&#xff0c;南卡OE Pro品牌的最新产品上线&#xff0c;却在瞬间被抢购一空&#xff0c;引起了广大耳机爱好者的热烈关注和激烈讨论。这一现象再次展示了南卡OE Pro在耳机市场的强劲号召力和深受用户喜爱的地位。让我们一起揭开这场秒空背后的热潮&#xff0c;探究引发如此…

全网首个Ozon选品数据分析软件重磅上线!

【萌啦OZON数据】分析工具重磅上线&#xff01;在线解析俄罗斯市场、开启热销选品新玩法&#xff01;1对1免费指导&#xff0c;详细演示软件选品&#xff0c;快速上手&#xff01; 欧洲第四大电商市场OZON 近日&#xff0c;俄罗斯电商平台Ozon2023年Q1业绩新鲜出炉。数据显示&a…

OpenStack(T版)基础环境准备

文章目录 OpenStack(T版)基础环境准备centos硬件安装版本安装两台centos7服务器虚拟网络编辑器配置网络修改主机名主机名映射关闭防火墙和SElinux配置时间服务器安装openstack(T版)包安装SQL数据库(controller)安装消息队列rabbitmq(controller)安装分布式内存对象缓存系统memc…

代码随想录算法训练营第46天 | 139.单词拆分 + 多重背包理论基础 + 背包问题总结

今日任务 目录 139.单词拆分 - Medium 多重背包理论基础 背包问题总结 递推公式 遍历顺序 139.单词拆分 - Medium 题目链接&#xff1a;力扣-139. 单词拆分 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意…

操作系统——实现一个简单的 shell 命令行解释器

一&#xff1a;实验题目 实现一个简单的 shell 命令行解释器 二&#xff1a;实验目的 本实验主要目的在于进一步学会如何在 Linux 系统下使用进程相关的系统调用&#xff0c;了解 shell 工作 的基本原理&#xff0c;自己动手为 Linux 操作系统设计一个命令接口。 三&…

WebSocket是什么,怎么用

74. WebSocket是什么&#xff0c;怎么用 当涉及到实时通信和即时更新的需求时&#xff0c;WebSocket 是一种强大且常用的解决方案。 1. 什么是 WebSocket&#xff1f; WebSocket 是一种在客户端和服务器之间实现双向通信的协议。它允许服务器主动向客户端推送数据&#xff0…

在Mac上安装Aspectj1.9.8(用于Java17)

1. 确定所使用的Java版本和AspectJ的对应关系 2. 下载AspectJ包 3. 安装AspectJ 4. 添加AspectJ对应的环境变量 5. 测试AspectJ 5.1 简单命令行测试安装是否成功 5.2 在IDEA中添加对AspectJ的支持【todo】 5.3 敲测试代码并进行测试【todo】 -----------------------------…

如何将window文件夹挂载到VMware系统mnt目录

背景&#xff1a;项目开发过程中&#xff0c;通常是在Windows上编码&#xff0c;有些框架和软件只能够在Linux上面执行&#xff0c;如果在 VMware中的Linux上面开发不太方便&#xff0c;因此需要在Windows上面开发好再同步到Linux上面运行。 软件&#xff1a; Samba客户端 V…

nodejs安装及环境变量配置(修改全局安装依赖工具包和缓存文件夹及npm镜像源)

本机环境&#xff1a;win11家庭中文版 一、官网下载 二、安装 三、查看nodejs及npm版本号 1、查看node版本号 node -v 2、查看NPM版本号&#xff08;安装nodejs时已自动安装npm&#xff09; npm -v 四、配置npm全局下载工具包和缓存目录 1、查看安装目录 在本目录下创建no…

抓包技术的应用示例

前言 最近瑞幸在搞活动&#xff0c;每天免费送10000份咖啡&#xff0c;我是个不喝咖啡的人儿&#xff0c;所以没咋关注&#xff0c;今早我们的团宠小妹&#xff0c;拉着我 10点整拼手速&#xff0c;想着帮她抢一杯&#xff0c;于是点开瑞幸咖啡小程序主页&#xff0c;banner 栏…

数学建模常用算法之主成分分析

数学建模常用算法之主成分分析 引言步骤实例以及代码 引言 主成分分析是一种降维算法&#xff0c;它能将多个指标转换为少数几个主成分&#xff0c;这些主成分是原始变量的线性组合&#xff0c;且彼此之间互不相关&#xff0c;且能反映出原始数据的大部分信息。 一般来说&#…

机器学习笔记 - vision transformer(ViT)简述

一、ViT简述 视觉转换器 vision_transformer(ViT) 因其令人印象深刻的准确率和计算效率而迅速成为卷积神经网络 (CNN) 在计算机视觉任务中的首选替代品。ViT模型在许多数据集和任务组合中的表现比CNN高出近4倍,从而确立了自己作为非常强大的竞争者的地位。 同样,基于转换…