最近接手的一个样本,样本中使用了大量的xor加密,由于本身样本不全,无法运行(好吧我最稀饭的动态调试没了,样本很有意思,以后有时间做票大的分析),这个时候就只好拜托idapython大法了(当然用idc也一样),期间遇到几个问题,遂记录一番。

样本加密的字符如下,很简单,push压栈之后,反复调用sub_1000204D解密。

此时,要写脚本的话,我们希望这个脚本能够足够通用,通常样本中的加密都是由一个函数实现,函数本身实现解密,传入的参数通常是解密字符,和key两个参数(当然肯定也有其他的模式),那么在写一个较为通用脚本前需要解决已下几个问题:

  1. 如何获取所有调用解密函数的地址
  2. 如何获取需要解密的字符
  3. 解密算法如何
  4. 解密之后的处理(最简单的比如注释)

首先针对第一个问题,如何获取调用解密函数的地址。

在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在样本分析中的使用-字符解密的更多相关文章

  1. CVE-2010-2883:基于样本分析 PDF SING表字符溢出漏洞

    0x01 前言 CVE-2010-2883 漏洞的成因是由于 CoolType.dll 这个动态链接库在解析 SING 表中的 uniqueName 这个项时没有对长度进行限制,导致使用 strcat ...

  2. Java实现 LeetCode 777 在LR字符串中交换相邻字符(分析题)

    777. 在LR字符串中交换相邻字符 在一个由 'L' , 'R' 和 'X' 三个字符组成的字符串(例如"RXXLRXRXL")中进行移动操作.一次移动操作指用一个"L ...

  3. linux xorddos样本分析2

    逆向分析 之后我们通过ida对该样本进行更深入的分析样本的main函数中,一开始会调用函数dec_conf对样本中的大量加密的字符串进行解密,如下图所示.

  4. ocky勒索软件恶意样本分析1

    locky勒索软件恶意样本分析1 1 locky勒索软件构成概述 前些时期爆发的Locky勒索软件病毒这边也拿到了一个样本,简要做如下分析.样本主要包含三个程序: A xx.js文件:Jscript脚 ...

  5. ocky勒索软件恶意样本分析2

    locky勒索软件恶意样本分析2 阿尔法实验室陈峰峰.胡进 前言 随着安全知识的普及,公民安全意识普遍提高了,恶意代码传播已经不局限于exe程序了,Locky敲诈者病毒就是其中之一,Locky敲诈者使 ...

  6. locky勒索样本分析

    前段时间收到locky样本,分析之后遂做一个分析. 样本如下所示,一般locky勒索的先决条件是一个js的脚本,脚本经过了复杂的混淆,主要用于下载该样本文件并运行,. 解密 样本本身进行了保护,通过i ...

  7. Linux c字符串中不可打印字符转换成16进制

    本文由 www.169it.com 搜集整理 如果一个C字符串中同时包含可打印和不可打印的字符,如果想将这个字符串写入文件,同时方便打开文件查看或者在控制台中打印出来不会出现乱码,那么可以将字符串中的 ...

  8. Linux内核分析(六)----字符设备控制方法实现|揭秘系统调用本质

    原文:Linux内核分析(六)----字符设备控制方法实现|揭秘系统调用本质 Linux内核分析(六) 昨天我们对字符设备进行了初步的了解,并且实现了简单的字符设备驱动,今天我们继续对字符设备的某些方 ...

  9. Linux内核分析(五)----字符设备驱动实现

    原文:Linux内核分析(五)----字符设备驱动实现 Linux内核分析(五) 昨天我们对linux内核的子系统进行简单的认识,今天我们正式进入驱动的开发,我们今后的学习为了避免大家没有硬件的缺陷, ...

随机推荐

  1. php-fpm中启用慢日志配置(用于检测执行较慢的PHP脚本)

    虽然通过nginx accesslog可以记录用户访问某个接口或者网页所消耗的时间,但是不能清晰地追踪到具体哪个位置或者说函数慢,所以通过php-fpm慢日志,slowlog设置可以让我们很好的看见哪 ...

  2. 3 HTML&JS等前端知识系列之javascript的基础

    preface 作为一名运维开发,必须懂得前端知识,比如javascript,dom等等,下面就聊聊javascript. include 数据格式 条件判断,循环流程等. 函数 面向对象 what ...

  3. ArcGIS Server开发教程系列(2)配置ARCMAP和ARCCatalog发布服务

    1.       Arc catalog的配置 打开catalog,如图新增刚刚创建的server 1. Use GIS services: 用户身份连接 使用此种连接,可以浏览.使用站点内发布的所有 ...

  4. yaf设置命名空间

    修改yaf配置文件 文件是:yaf.ini extension=yaf.so yaf.use_namespace=1 index文件. 目录是application/controllers/Index ...

  5. OC初步 (一)

    OC完全兼容C, 代码后缀名一般习惯用 *.m 或 *.mm,按惯例从 "Hello,World!" 开始,我们编写一个 test.mm 文件如下: #import <Fou ...

  6. STL学习之运算符(<<)重载问题和仿函数的实现

    /*   运算符<<的重载一直报错,   友原函数中可以访问到类的私有成员*/#include<iostream>using namespace std; class MyIn ...

  7. 【荐2】Total Commander 7.57 配置选项 个性化设置备份,,,开启时如何自动最大化???(二)

    最近安装了下新版的“Total Commander 7.56”,发现它的默认设置是如此的不好用,现把对其个性化设置备份如下(符合大部分用户的操作习惯): 默认打开Total Commander 7.5 ...

  8. 用JS做关灯游戏(初级)

    这是一个很有意思的游戏,可以试着玩下. <!DOCTYPE html> <html> <head> <meta charset="utf-8&quo ...

  9. jquery.print.js 打印插件

    <script language="javascript" src="jquery-1.4.4.min.js"></script> &l ...

  10. PYTHON 函数的普通参数

    # 形式参数,还没有赋值的代指参数 def kd(p): print(p) return True #实际参数,只有实际值的参数 ret = kd(") if ret: print(&quo ...