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内核的子系统进行简单的认识,今天我们正式进入驱动的开发,我们今后的学习为了避免大家没有硬件的缺陷, ...
随机推荐
- <<< 入侵网站思路
思路: 以下是入侵网站常用方法: 1.上传漏洞 如果看到:选择你要上传的文件 [重新上传]或者出现“请登陆后使用”,80%就有漏洞了! 有时上传不一定会成功,这是因为Cookies不一样.我们就要用W ...
- 使用VS2010创建WebService 发布、测试
http://blog.sina.com.cn/s/blog_45eaa01a0102vopl.html 1 打开VS2010,菜单 文件->新建->项目 2 选择[ASP.net ...
- ruby
:for 是关键字, each是方法. for 后面的变量,是全局变量,不仅仅存在于for .. end 这个作用域之内 module中的 self.xx方法可以被直接调用 module中的普通方法, ...
- 说说JavaScriptCore
http://www.jianshu.com/p/1328e15416f3/comments/1724404 javascript目前看来仍是世界上最流行的语言,不管在web.服务端还是客户端都有广泛 ...
- LoadRunner 函数之 web_add_cookie
简单示例: Action() { // 添加cookie web_add_cookie("is_login=True;path=/;domain=10.1.102.75"); // ...
- Java---类加载机制,构造方法,静态变量,(静态)代码块,父类,变量加载顺序
直接上代码: 代码1: public class ConstroctTest { private static ConstroctTest test = new ConstroctTest(); // ...
- java中volatile关键字的含义
在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言是支持多线程的,为了解决线程并发的问题,在语 ...
- MySQL Cluster在线添加数据节点
增加或减少数据节点的数量和 NoOfReplicas(即副本数,通过管理节点的config.ini配置文件来设置)有关,一般来说NoOfReplicas是2,那么增加或减少的数量也应该是成对的,否则要 ...
- Java多态与反射
多态通过分离做什么和怎么做,从另一个角度将接口与实现分离开来:通过多态来消除类型之间的耦合关系,在Java中,多态也叫动态绑定,后期绑定或运行时绑定,那么什么是方法绑定? 方法调用绑定: 将一个方法与 ...
- BZOJ 4581: [Usaco2016 Open]Field Reduction
Description 有 \(n\) 个点,删掉三个点后,求最小能围住的面积. Sol 搜索. 找出 左边/右边/上边/下边 的几个点枚举就可以了. 我找了 12 个点,统计一下坐标的个数,然后找到 ...