从 dll 中检索加密/编码逻辑

逆向工程 混淆 加密 解密 编码
2021-06-24 23:38:20

我正在尝试从程序中检索解密/解密逻辑。不幸的是,我几乎没有逆向工程经验。

我正在为多媒体设备构建一个替代控制器应用程序。原始控制器可用于 Windows(我的目标)以及 mac、ios 和 android。设备和控制器应用程序之间的大部分通信类似于 UPnP 协议,因此以 XML 格式传输并以明文形式可读。然而,有一种情况,设备向控制器发送某种令牌(控制器随后使用它来针对其他服务进行身份验证),并且这种传输似乎被编码/加密/混淆(在文本中称为“编码”)。这种编码形式在正常 UPnP 响应的 XML 字段中传输。

我在监视编码形式的几个传输时进行了以下观察:

  • 它总是以 2: 开头,后面跟着一个似乎是 base64 编码的字符串
  • 当多次传输时,即使内容应该没有改变,刺痛也会改变(这是在假设编码前不包含其他变量(如时间戳)的情况下)。所以可能存在某种盐。
  • 如果数据没有改变,字符串的长度保持不变
  • 如果从控制器中移除所有令牌,该字段中仍会传输一些编码数据。这让我想到要么填充发生,要么(更有可能)编码的字符串解码为一些序列化的数据结构(甚至可能是 XML)。
  • 即使编码版本不同,用于身份验证的令牌(因此解码形式)确实保持不变。

应用程序本身是用 c# 编写的,但所有与安全相关的东西(包括解码/处理令牌)似乎都是使用 pINVOKE 从不是用 .net 编写的 DLL 中调用的

我在 dll 上运行了 signrch,我怀疑编码会发生,但是返回了很多可能的命中(30+)。在查看 dll 时,似乎 openssl 库已编译到其中,因此可能存在很多误报。DLL 还处理 HTTPS 通信,因此 openssl 不一定与我正在寻找的编码方法有关。

我试图研究 ida pro 和 windbg,但是我从教程中读到的内容主要围绕在单击激活例如检查例程的按钮之前设置断点。但是,在我的情况下,控制器应用程序在应用程序启动时收到一次此数据(带有数十个其他 UPnP 数据包),我的猜测是在接收数据包时进行解码,因此不可能将断点设置为例如按钮。然而,我能够弄清楚的是,解码的令牌存在于内存中(但是每次启动应用程序时偏移量都不同)。编码版本在运行时似乎不存在于内存中。

一些示例:未配置令牌时的编码字符串:

2:nrlrLkCeoSOK34YSDZUKzbXs6olm9YSE4jLFnXONMJO5XhjfwCsPpymjHEXBhuSiRUAYpghW1NHj7M2zIgzcbw==

代表(据说)相同数据的三个字符串:

2:PITkxbk12KlLvsPtOV8ptZbqfMcK0EmSA/XOejbBHs8+ffKNzwYSoz6oGdL5wiudTWJri4ZG/CwB2/Pfh91ULuqBYWaLaW7YCzEzRb53NS+qarNiUAU0Kn7TCuhPzougX91sKFOP3BTWdUu6BQBP7IlWIZ1odp4ilU8RdEUhPvkOVyH9OBQwvpYXPbqca/OLGjNFPvomS5yaeOjtbpDuVd8mfvBycVHB8rULDvkJcXOS/qQWHOt8iYYZXHBXBD9v4h3Bs+o09sWsXxIh+0q4qz+TKY/gYRnogenJ9vN83lkE6FTgtHns/6zxlCt4xaFINmShdovvYlS/sdZ+aKgcGoq8zFjWJAbc2WQQwdxPTLZsCUmJSjH6jp1t6pCv7t4tBMaSpCTvAoRrXElNQIW1LOe/9X6Cu5Ggjp17Whwe9+7DuWz6HxPEpq/TIVLIV7kJQRj6GcD7/sWPakLLXxiN1Bf5yfJVvX3wA67vwXwigO5v5d5JzKPrjULskeCLUk//61gPulxFguf63cn6NN1zXpDBOf3sCxwzquKIobE8s+F2mJ0pzWCNwYSg3IpvAUzH2fqLvsjqO6DdNr6AVZr77vPG9/dQ2+sFesFHMFQ859eVwNUSvYkxQoqFukxJOXfY+muf1AYqczvCA0K/uYDnKAj24oB0Wgw9YvAS8YHO9YI=

2:XfaIk9XLov9k8vHKXXZ9NFpUvNSk8QsEjI73E+txW6wg+kSr2hWWljLU5OOmQBcN+ACRKF4f4paJBxlf9AGiFnWyrNKT4nguM/4iBsHsiIADlMavjYncsNntClcxPh+Me2l1W/uQzqG83SlHcM525P5wfpH45zC7/hFjmWKPGIQ/k/LAsJy6gZlrmOZ0B2JJ0Cw+yUOzTD4EUo092EPRf7hq7aIrs0dLfPtT2D6LMKwmKAfW2fhllV/jJ33dAVn6Dy/PctFErGtvXljhnuI8r5qpMyIOZ5SsoFE/tnk+kOqWYVg5/Djbl/fpV2p70B9vxzpVkko8pfIJ3UmYsqu5WSlaX441Qs/gY8nzjWmJw8+8LzxL+P2YgYo5W+u6a/oS4R+sZ3FD0q3KQvmVNjklgdGipTOfsv9amP6M6ifAHPdgB5kj9ivOtufaiFKR9GqS9/g4vjYQqofU3Yk2nB6xMi2W1eA2Mk+BJAjfsTr1Yo4Njoa0+XQfAMfqpJe9Zka2NSLu2noDDEdRTqASJi6IiNxbsbsVGHhHFEAEojwTQlrk6xUtOt5RjTA6XovdgQoGywjU+FixEbEEQA0TbNE2KsFhmKXIauo3yQaZ9EKDMJjOMz53UK/EFEZu6L7yy7ijnQB13rSw+obIbFXr/J/vxc97EsRXm7zSUIQoEq9qwKE=

2:9xVbeGOq4XDN26aIYcbNVYDAVQNgVseVvipidY71ZzJAKYlYdcDd46uIFQdfla5pXqupZABtl4Njg+wC8lxmxx2EFR1ZwBYr+ZbvswCQp9YKKMAhI3Ly12j3XNrtIAfl+EDDgz5woHNLXLfVthFel4WSe3mGHMa0S8ZcXRyRyLJHx7lIXZ4G68by2cLTYTldAWuYYl7xhmIJNLgMA8iI63FBGYiw/aXd/30KkLPoUP7As1R/GfItnDfp0pG5l63DtBFSo3mnDRVrdDIsYALRpsBLhhvx4+0CjlyMaK511pM0+IxmtcE6L0L6QhcztYzWcjnbjkLi7r9dmO5ABEfq8/8+wpnxERXwiwRTsYPy2/+rYQlLK0hkeGiqacbnjQQWyVRVzaE47oAhC9ln+ws5go/v+reDHhmpf/9vj9RO7EzFq9LVZRxbxy7C5QZzHEqncSdR+TzOrs0MkRO3pe+e2Q5P68kgTYVO6K8XpvLU9ClfDyIOCpwNufRz/fEVl2ry5UrjS5d5k39+UheQizu9nu+Y+4xC42Wd+y1E7WsZYQaLgNL6EQP1w8yb3+PwdvgOxgId7IMag81/4+mjO9x/N1Zoq405nSXodirZ5RiWIAl4+uHARqwDnX1lZQo7Fo0pMs8ZwOtGiqA8/WVbMKqigBOEW6m2/2K2nI3cTYKqmVg=

我很想听听如何解决这个问题以获得更多见解的建议。

2个回答

无法评论,所以答案是:)

-- 如果您知道需要查看什么 dll 并且它是用 .net 编写的,那么 IDA 可能不是最佳选择(根据个人经验)。

但是,如果您仍在寻找需要反编译的 dll,您可能希望给 APImon 和 procmon 一个机会,以找到确切需要反编译的内容。

我建议尝试使用 .net 反编译器,例如dotPeek或任何其他。您通常可以从任何 .net 程序(未混淆/加密)中按原样读取代码。如果 dll 被混淆,您可以尝试使用de4dot对其进行反混淆或从内存中转储并对其进行分析。

上面的字符串肯定是 base64 编码的,所以你可能会寻找 object.binary.base64

看看 IDA Pro 的插件IDA Scope它有一个加密识别工具,我认为它会对你有所帮助。

在此处输入图片说明