前言

一个肚脑虫(Donot)APT组织的下载器样本,样本中的一些关键字符串数据需要使用指定函数进行动态解密。所以正好借此机会记录下怎么使用IDA Python脚本来解密字符串数据。使用IDA Python脚本自动化解密字符串数据对逆向分析人员来说应该是一个比较常用的功能。

myDecode为解密函数,只要将加密的字符串数据作为参数传入就能返回加密前的原字符串

对myDecode函数进行交叉引用,可以发现总共有34个地方调用了该函数

解密算法比较简单,编写解密脚本的基本思路就是通过交叉引用获取每一个加密字符串,然后通过添加注释的方式对解密后的原始字符串进行标注。

 1 _BYTE *__cdecl myDecode(const char *a1)
2 {
3 _BYTE *v2; // [esp+10h] [ebp-8h]
4 unsigned int i; // [esp+14h] [ebp-4h]
5
6 v2 = calloc(1u, 0x1Bu);
7 for ( i = 0; i < strlen(a1); ++i )
8 v2[i] = a1[i] ^ 3;
9 v2[i] = 0;
10 return v2;
11 }

下面是需要用到的几个IDA Python API函数:

1 XrefsTo                #获取交叉引用地址
2 prev_head #获取前一条指令地址
3 print_insn_mnem   #获取指令助记符
4 print_operand   #获取指令操作数
5 get_operand_value   #获取操作数地址
6 get_byte   #从指定地址获取1字节数据
7 set_cmt   #添加注释

完整脚本代码如下:

 1 import idc
2 import idaapi
3
4 def getStrAddress(addr):
5 addr = prev_head(addr)
6 if print_insn_mnem(addr) == "push" and "offset" in print_operand(addr,0):
7 return get_operand_value(addr,0)
8 else:
9 return 0
10
11 def getEncodeStr(addr):
12 out = ""
13 while(True):
14 ch = idaapi.get_byte(addr)
15 if ch != 0:
16 out += chr(ch)
17 else:
18 break
19 addr += 1
20 return out
21
22 def getDecodeStr(str):
23 i = 0
24 out = ""
25 length = len(str)
26 while i < length:
27 out += chr(ord(str[i]) ^ 3)
28 i += 1
29 return out
30
31
32 if __name__ == '__main__':
33 try:
34 for x in XrefsTo(0x6B4C4920,flags = 0):
35 addr = getStrAddress(x.frm)
36 eStr = getEncodeStr(addr)
37 dStr = getDecodeStr(eStr)
38 set_cmt(prev_head(x.frm), dStr, 0)
39 except:
40 print("Error")

看一下添加注释后的效果:

【逆向】使用IDA Python脚本自动化解密字符串数据的更多相关文章

  1. Windows下使用VSCode搭建IDA Python脚本开发环境

    由于本人是VSCode的重度沉迷用户,需要写代码时总会想起这个软件,因此选择在VSCode中搭建IDA Python的开发环境 本文适用的环境如下: 1.操作系统 windows 2.Python3 ...

  2. Python脚本自动化破解大白鲨摄像头(Shodan)

    关于本文的技术知识点,Shodan模块的用法,传送门-->  Python中shadon模块的使用    Shodan的使用 今天我们要利用python进行自动化破解的摄像头叫大白鲨摄像头,他的 ...

  3. php外挂python脚本抓取ajax数据

    之前我写过一遍php外挂python脚本处理视频的文章.今天和大家分享下php外挂python实现输入关键字搜索的脚本 首先我们先来分析一波网站: http://www.dzdpw.com/s.php ...

  4. 使用python脚本从数据库导出数据到excel

    python从数据库导出数据到excel 最近需要从数据库里导出一些数据到excel,刚开始我是使用下面的命令 select * from xxx where xxx into outfile 'xx ...

  5. Python脚本调用C#代码数据交互示例(hello world)

    原地址: http://www.djangochina.cn/forum.php?mod=viewthread&tid=247 随着项目的逐渐收尾, 对IronPython脚本也越来越熟悉,这 ...

  6. 【python接口自动化】- PyMySQL数据连接

    ​ 什么是 PyMySQL? ​ PyMySQL是在Python3.x版本中用于连接MySQL服务器的一个库,Python2中则使用mysqldb.它是一个遵循 Python数据库APIv2.0规范, ...

  7. python脚本往redis加数据

    #-*-coding:utf-8-*-from rediscluster import StrictRedisClusterimport pymysqlimport timeimport cProfi ...

  8. 某互联网后台自动化组合测试框架RF+Sikuli+Python脚本

    某互联网后台自动化组合测试框架RF+Sikuli+Python脚本 http://www.jianshu.com/p/b3e204c8651a 字数949 阅读323 评论1 喜欢0 一.**Robo ...

  9. 【逆向工具】IDA Python安装与使用

    1.IDA Pyhon介绍 IDA Python是IDA6.8后自带插件,可以使用Python做很多的辅助操作,非常方便的感觉. 2.IDA Python安装 从github上IDAPython项目获 ...

  10. Python脚本之——API自动化框架总结

    学完了Python脚本接口自动化之后,一直没有对该框架做总结,今天终于试着来做一份总结了. 框架结构如下图: 来说一下每个目录的作用: Configs:该目录下存放的是.conf,.ini文件格式的配 ...

随机推荐

  1. mysql sum 聚合计算后精度不准 出现多位小数点后的数

    解决办法 原收款单money 字段 为 decimal(28,8) 经过层层计算用到了 @total := ( beginning + @total + gather - verification ) ...

  2. firefox 安装旧版flash播放器

    国内恶心的特供版flash用是不可能在用了,用旧版的火狐和旧版的flash播放器,亲测可用. 下载旧版本的火狐浏览器67.04 https://ftp.mozilla.org/pub/firefox/ ...

  3. docker中搭建Ubuntu:16.04+python3.6+django环境

    用vim 新建一个Dockerfile和sources.list文件,在里面添加如下内容. #sources.list deb http://mirrors.163.com/ubuntu/ xenia ...

  4. 网页端微信小程序客服

    https://mpkf.weixin.qq.com/ 可以设置自动回复

  5. shell—if + case条件语句

    if 条件语句 1. 概述 在shell的各种条件结构和流程控制结构中都要进行各种测试,然后根据测试结果执行不同的操作,有时候也会与 if 等条件语句相结合,来完成测试判断,以减少程序运行错误. 2. ...

  6. js中的this的指向问题

    this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象 this永远指向的是最后调用它的对象,也就是看它执行的时候是谁调 ...

  7. python逐行读取替换文件中的字符串

    用列表中的值逐行替换文件中符合条件的字符串,并保存为新的文件, open("file").readlines 方案1: 逐行替换并保存为新的文件 import re def rep ...

  8. TODO留学小程序,展开,收起失效

    text设置user-select=true后,display: -webkit-box 失效? https://developers.weixin.qq.com/community/develop/ ...

  9. perl正则

    名字 表达式 如果子表达式成功则 - positive lookahead (零宽度正预测先行断言 ) (?=subexp) 如果匹配到右边则成功 negative lookahead (零宽度负预测 ...

  10. Java-面向对象进阶 方法继承、重写

    1.继承 子类继承父类后自动拥有父类非私有的属性和方法 Java中,一个父类可以被多个子类继承,一个子类只能继承一个父类 除了继承父类的属性和方法外,子类还拥有自己特有的属性和方法 如果子类的方法与父 ...