idapython在样本分析中的使用-字符解密
最近接手的一个样本,样本中使用了大量的xor加密,由于本身样本不全,无法运行(好吧我最稀饭的动态调试没了,样本很有意思,以后有时间做票大的分析),这个时候就只好拜托idapython大法了(当然用idc也一样),期间遇到几个问题,遂记录一番。
样本加密的字符如下,很简单,push压栈之后,反复调用sub_1000204D解密。
此时,要写脚本的话,我们希望这个脚本能够足够通用,通常样本中的加密都是由一个函数实现,函数本身实现解密,传入的参数通常是解密字符,和key两个参数(当然肯定也有其他的模式),那么在写一个较为通用脚本前需要解决已下几个问题:
- 如何获取所有调用解密函数的地址
- 如何获取需要解密的字符
- 解密算法如何
- 解密之后的处理(最简单的比如注释)
首先针对第一个问题,如何获取调用解密函数的地址。
在ida中针对这一需求其实提供了一个函数XrefsTo,该函数会返回一个地址的所有引用,在ida中通过一下两句脚本可以测试一下。
for x in XrefsTo(0x1000204D,flags = 0):
print hex(x.frm)
测试结果如下:
第二个问题,如何获取加密的的字符串。
在本例中函数的调用如下。
此时我们需要用到几个函数
第一个函数为PrevHead,该函数用于获取一段代码段中的指令,ea为开始,mines为结尾,注意这个函数的搜索为降序搜索,说白了就是往前找。通过这个函数我们就可以获取解密函数之前的指令,即push offset xxxxx指令所在的代码区域了
long PrevHead (long ea, long minea);
第二个函数为GetMnem,用于获取ea指定地址附近的指令
string GetMnem (long ea);
第三个函数为GetOpnd,用于获取操作指定地址ea附近指令的操作码,注意此处的n为操作码的编号,由0开始,比如指令push offset xxxxx,0号操作码为push
string GetOpnd (long ea,long n);
第四个函数为GetOperandValue,用于获取指定地址ea附近指令的操作数,通用n为操作数的编号,由0开始,比如指令push offset xxxxx,0号操作码为xxxxx
long GetOperandValue (long ea,long n);
通过这几个函数就可以获取压栈指令push压如的加密字符了,以下为参数获取函数
测试效果如下:
但是此处我们只是获取了加密字符的地址,此处还需要计算出加密字符串的截止地址。
第三个问题,解密字符。
由于此处只是简单的xor解密,含简单,当然以后有其他的加密方式,直接增加函数即可。
第四个问题,注释
可以通过函数MakeComm()实现。ea为注释地址,comment为注释类容。
Success MakeComm (long ea,string comment); // give a comment
至此把所有的内容整合起来即可
运行脚本之后的结果。
idapython在样本分析中的使用-字符解密的更多相关文章
- CVE-2010-2883:基于样本分析 PDF SING表字符溢出漏洞
0x01 前言 CVE-2010-2883 漏洞的成因是由于 CoolType.dll 这个动态链接库在解析 SING 表中的 uniqueName 这个项时没有对长度进行限制,导致使用 strcat ...
- Java实现 LeetCode 777 在LR字符串中交换相邻字符(分析题)
777. 在LR字符串中交换相邻字符 在一个由 'L' , 'R' 和 'X' 三个字符组成的字符串(例如"RXXLRXRXL")中进行移动操作.一次移动操作指用一个"L ...
- linux xorddos样本分析2
逆向分析 之后我们通过ida对该样本进行更深入的分析样本的main函数中,一开始会调用函数dec_conf对样本中的大量加密的字符串进行解密,如下图所示.
- ocky勒索软件恶意样本分析1
locky勒索软件恶意样本分析1 1 locky勒索软件构成概述 前些时期爆发的Locky勒索软件病毒这边也拿到了一个样本,简要做如下分析.样本主要包含三个程序: A xx.js文件:Jscript脚 ...
- ocky勒索软件恶意样本分析2
locky勒索软件恶意样本分析2 阿尔法实验室陈峰峰.胡进 前言 随着安全知识的普及,公民安全意识普遍提高了,恶意代码传播已经不局限于exe程序了,Locky敲诈者病毒就是其中之一,Locky敲诈者使 ...
- locky勒索样本分析
前段时间收到locky样本,分析之后遂做一个分析. 样本如下所示,一般locky勒索的先决条件是一个js的脚本,脚本经过了复杂的混淆,主要用于下载该样本文件并运行,. 解密 样本本身进行了保护,通过i ...
- Linux c字符串中不可打印字符转换成16进制
本文由 www.169it.com 搜集整理 如果一个C字符串中同时包含可打印和不可打印的字符,如果想将这个字符串写入文件,同时方便打开文件查看或者在控制台中打印出来不会出现乱码,那么可以将字符串中的 ...
- Linux内核分析(六)----字符设备控制方法实现|揭秘系统调用本质
原文:Linux内核分析(六)----字符设备控制方法实现|揭秘系统调用本质 Linux内核分析(六) 昨天我们对字符设备进行了初步的了解,并且实现了简单的字符设备驱动,今天我们继续对字符设备的某些方 ...
- Linux内核分析(五)----字符设备驱动实现
原文:Linux内核分析(五)----字符设备驱动实现 Linux内核分析(五) 昨天我们对linux内核的子系统进行简单的认识,今天我们正式进入驱动的开发,我们今后的学习为了避免大家没有硬件的缺陷, ...
随机推荐
- 前端模块化工具-webpack
详解前端模块化工具-webpack webpack是一个module bundler,抛开博大精深的汉字问题,我们暂且管他叫'模块管理工具'.随着js能做的事情越来越多,浏览器.服务器,js似乎无处不 ...
- Iptables防火墙NAT地址转换与端口转发
开启系统转发功能: [root@localhost /]# vim /etc/sysctl.conf # Generated by iptables-save v1.4.7 on Thu May 12 ...
- Codeforces 2016 ACM Amman Collegiate Programming Contest B. The Little Match Girl(贪心)
传送门 Description Using at most 7 matchsticks, you can draw any of the 10 digits as in the following p ...
- Python * 和 ** 参数问题
Problem def calcuate(*keys) def calcluate(**keys) Slove *: 用来传递人一个无名字的参数,这些参数会以一个Tuple的形式来访问. **: 用来 ...
- SDL 1.2.15 issue
SDL 1.2.15中,对于X11的函数,默认采用动态加载的方式 但相应的X11函数名在SDL中并没有重新命名(SDL2中都添加了前缀X11_) 这样在SDL与其他库混合静态编译链接时,X11的函数就 ...
- windows bat 设置代理上网脚本bat
取消IE代理服务器 ****************************************************************************************** ...
- 第二轮冲刺-Runner站立会议04
今天:查看gridview与baseadapter的连接 明天准备做什么:继续gridview与baseadapter适配器 遇到的困难:暂无
- Apache限制某个目录下的PHP文件没有执行权限
为了安全期间,有时我们需要限制网站下的某些目录对于php脚本不能执行. 有两种方法可以参考: 1. 使用.htaccess 文件限制 在要限制php执行的目录下,创建.htaccess文件,加入内容 ...
- Spring中集合类型属性注入
我们都知道如何去注入普通属性的值,非常简单,那么我们如何去注入开发中常见的集合类型的属性了,别急,往下看. 这里将介绍如何给Map list set Array Properties 这些属性注入值. ...
- JSON.parse和eval的区别
JSON.parse和eval的区别 JSON(JavaScript Object Notation)是一种轻量级的数据格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是Jav ...