前言

一个肚脑虫(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. 使用FTP协议的主机必须设置xftp版本1.2...

    1.查看是不是没安装xftp,xshell上的那个按钮只是启动按钮 2.还是不行的话,试试在linux上安装这个: yum  install lrzsz

  2. 查找数组中某个元素出现的次数,例如数组arr=[1,2,3,4,3,4,5,3]中target=3出现的次数

    1 function(arr,target) { 2 3 let num = 0 4 5 arr.forEach((item, index) => { 6 7 if (item===target ...

  3. VM安装linux2022、设置root密码、设置国内更新源

    一.创建虚拟机 1.打开VM软件选择"创建新的虚拟机" 2.选择"典型"即可 3.选择"稍后安装操作系统" 4.选择客户机操作系统为&quo ...

  4. window操作

    1.进入目录 cd ... 2. 进入D盘 D: 3.读取文件内容 type file

  5. MySQL时区的问题

    我这里是在application.properties文件中配置的MySQL连接信息. 开始时间显示不征程是因为没有配置时区,后来加上了setTimeZone=Asia/Shanghai,时间显示正常 ...

  6. TPM 2.0 - could not load "libtss2-tcti-tabrmd.so.0"

    报错: TPM 2.0 - could not load "libtss2-tcti-tabrmd.so.0" 解决:sudo apt install libtss2-tcti-t ...

  7. CxImageJPG

    typedef struct tag_ExifInfo { char Version [5]; //EXIF 信息版本 char CameraMake [32]; //DC 制造商 char Came ...

  8. encodeURI和encodeURIComponent

    encodeURI和encodeURIComponent的作用对象都是URL,唯一的区别就是编码的字符范围: encodeURI不会对ascii字母.数字.~!@#$&*()=:/,;?+' ...

  9. linux发展史及软件配置

    linux岗位需求 # 1.岗位需求 自动化运维,容器运维,DBA,IDC运维(不建议) ps:linux岗位会的越多给的越多 linux工作本质 linux简要发展史 # 1.发展 1991年,芬兰 ...

  10. JS学习-从服务器获取数据

    从服务器获取数据 Ajax 通过使用诸如 XMLHttpRequest 之类的API或者 - 最近以来的 Fetch API 来实现. 这些技术允许网页直接处理对服务器上可用的特定资源的 HTTP 请 ...