商用硬件Token装备软件完成中的Envelope破绽剖析 | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

商用硬件Token装备软件完成中的Envelope破绽剖析

申博_新闻事件 申博 120次浏览 已收录 0个评论

申博网络安全巴士站

申博-网络安全巴士站是一个专注于网络安全、系统安全、互联网安全、信息安全,全新视界的互联网安全新媒体。

————————————-

媒介

我近来正在研讨一个运用加密Token(USB加密狗)的不知名Windows软件,个中可实行文件自身经由某种情势的预处置惩罚,并被封装和加密,以阻挠在没有加密狗的情况下运用。如今,该软件不再适用于Windows 10(多是由于Envelope珍爱逻辑中的某些破绽)。

现实上,该软件运用这些Envelope是为了防备加密狗代码被删除,以下所示:

if(!dongle_present()){exit();}

纵然被删除,也很轻易被修复。

别的,运用这些Envelope另有作用。

1.隐蔽硬编码的隐秘;

2.隐蔽未宣布的功用;

3.阻挠或使软件复制庞杂化;

曩昔往年,我已研讨了几个辅佐封装的硬件的二进制文件,个中并没有许多变体。斟酌到封装代码已成了一个不怎么被存眷的手艺,没有许多变体也是可以或许明白的。别的,增添最少须要经由历程HID举行通讯的硬件组件,会使任何封装器模子庞杂化,并明显增添攻击面。

然则,本文所讲的样本则异常风趣,由于它好像不是一样平常的AKS/HASP SRMEnvelope或VMPEnvelope,而是来自沉思洛克(SenseLock) 的更廉价的产物。

硬件

商用硬件Token装备软件完成中的Envelope破绽剖析

Senselock LC也被称为Clave 2,这个预算级别的硬件加密Token不像Elite EL型号那样虚有其表。它没有壮大的API,没法实行用户建立的自定义固件,它相对是“入门级”的Token装备。

设置装备摆设以下:

1.内置2KB闪存;

2.经由历程API和“更新包”长途更新此内存地区;

3. AES128位加密,带有弗成设置装备摆设的硬件密钥

4.每次挪用最多16个字节的输入数据;

5.HID(Driverless)支撑Windows/Mac/Linux 32/64位;

另一个值得吹嘘的特征(仅适用于Windows 32位)是一个Envelope实用顺序,它可以或许用加密狗加密和封装现有的、预编译的可实行文件,并供应一些分外的平安选项,好比自定义破绽音讯或将特定的封装可实行文件绑定到特定的加密狗。

供应商供应的软件

荣幸的是,这个加密狗的API可以或许在Senselock站点上免费取得,包罗用于封装的实用顺序。应当注重的是,虽然其他产物(如HASP)会殽杂客户端API库和封装实用顺序,但这并不是老是云云。

你可以或许很轻易地从API zip中轻松抓取一个静态库文件并解压缩它:

商用硬件Token装备软件完成中的Envelope破绽剖析

可以或许看出它们没有被删除,今后会有用的。

商用硬件Token装备软件完成中的Envelope破绽剖析

Envelope实用顺序自身是一个相称基本的GUI,它会扩展到运用LC库静态编译的exe。

API自身也是相称简朴的,运用Clave 2,你可以或许举行以下操纵:

1.翻开具有给定索引的句柄;

2.运用暗码登录,暗码有三个 ,分别是admin (read – write)、general (read/encrypt/decrypt)和auth;

3.做你想做的;

应当注重的是,这类API流程的事变体式格局意味着在大多数情况下,通用暗码最少多是硬编码的。因而,若是有人晓得所需的暗码,那末运用这个公然可用的API并运用适用于其他软件的加密狗建立软件就很简朴了。

注: 大多数加密TokenAPI都邑举行一些初始化,以便将静态和动态库绑定到特定的加密狗或加密狗系列,这是为了防备人们经由历程大众可用库与特定加密狗交互。

破绽寻觅

1.一最先我们对目标应用顺序相识得不够多,以是更好的要领是封装一个超等基本应用顺序。如许,我们就将同时具有代码和原始二进制文件,并将其用于我们的测试。

2.我们可以或许会运用API库来符号供应商代码,并实验更快地肯定全部历程的事变体式格局。

3.我们的目标是肯定封装器是怎样事变的,或许运用调试器天生一个运转转储。

4.若是我们真的想要分外的点,这是可以或许的,我们可以或许静态地重构原始的exe,而不须要现实运转顺序。

4.1该封装器是不是采用了分外的历程、nanomites……;

4.2若是封装器运用被盗字节,那末静态构建将越发难题;

测试应用顺序

一个相称基本的C言语顺序将异常合适测试:

#include <Windows.h>#include <stdio.h>int main() {
	HMODULE h = LoadLibraryA("user32.dll");	printf("This is a test program: %p\n", h);

	HANDLE hfile = CreateFileA("C:\\test.txt",
		GENERIC_READ,
		FILE_SHARE_READ,		NULL,
		OPEN_EXISTING,
		FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,		NULL);	CloseHandle(hfile);	return 0;
}

编译后的结果大约是9KB (JFC Visual Studio),用Envelope处置惩罚它会获得一个后缀为“_shell”的exe(巨细> 100KB)

商用硬件Token装备软件完成中的Envelope破绽剖析

将它加载到IDA中剖析IAT,如许我们的可实行文件中有一个新局部:

商用硬件Token装备软件完成中的Envelope破绽剖析

毫无疑问,这也是我们新的测试点。

首先要做的是翻开我们的静态库,寻觅常量和种种相似的函数,并搜检xreferences,以实验符号个中的一些内容。

结果以下:

商用硬件Token装备软件完成中的Envelope破绽剖析

如今,在原始进口点以后输入一些二级函数,如许我们将最先看到一些熟习的内容,比方:

商用硬件Token装备软件完成中的Envelope破绽剖析

商用硬件Token装备软件完成中的Envelope破绽剖析

如今,我们就取得了一些VM检测代码。

现实上,经由历程封装器进口点中的一些函数,你会看到许多来自以下链接的复制粘贴代码:https://www.cnblogs.com/zhangdongsheng/archive/2012/07/02/2573416.html

通常情况下,封装者会殽杂这类逻辑,以使辨认或修正变得越发难题。在这类情况下,若是你修正此局部中的任何字节,应用顺序都将封闭(无论怎样都不会一样平常运转)。

商用硬件Token装备软件完成中的Envelope破绽剖析

在末了的拆封历程中有一些校验和被用来阻挠改动,不外它们看起来更像是搜检一个硬编码的值,该值不用于任何其他用处。因而,可以或许很轻易地变动结果值或完整删除搜检而不发生任何结果。

除此以外,它是寻觅历程称号的异常典范的搜检(比方ollydbg,idaq,softice等)。

须要注重的一件事是,由于我们符号了LC API函数,以是我们还可以或许看到这些API挪用的实行地位。如许,我们可以或许看到挪用LC_passwd的地位,这意味着,我们也晓得了硬编码后的加密狗暗码的地位。

商用硬件Token装备软件完成中的Envelope破绽剖析

如今,我们就可以或许最先剖析封装器的流程了。

剖析封装历程

在对大多数内容举行符号剖析以后,剖析封装器的历程就异常简朴。以是我会扼要的说一下,由于有许多示例文件,好比动态绑定剖析、反调试搜检和反vm或反改动搜检,它们在大多数封装的二进制文件和一些一样平常治理事变中都很罕见。剖析历程以下:

* Iterate each section of the exe that is marked as executable (e.g. a CODE section)
  -> Log into the Dongle,
  -> Send the hardcoded exe key (16 bytes) to the dongle's "encrypt" fuction.
  -> Retrieve the 16 byte key result.
  -> Use the key result in a Rijndael function to decrypt the given section in place.

* Go to a hardcoded offset in the .lcsh section

* Decrypt the a blob of data scraped from the original Import Address Table (in place)
  using the same method of getting a key and Rijndael and all that stuff from the code
  sections.

* Read the original IDT in plaintext from a hardcoded offset in the .lcsh section.

* Use the newly decrypted original IAT and IDT to write various offsets to
  relocation points and additional locations to reflect the IAT's new location.

* Jump to OEP (this address is also hardcoded into .lcsh).

1.可以或许看出,这个封装器做的任何事变都不会形成丧失或损坏。因而,我们决议静态地重构一个可运转的非封装可实行文件。

2.我们应当可以或许复制一切这些步调,值得注重的是,搞清楚全部历程不须要动态剖析。由于没有渣滓代码、阻挠反汇编的宏和殽杂战略,以是静态地搞清楚这些步调异常简朴。

3.既然我们明白了这个历程,那末我们应当可以或许构建一个可以或许解压缩给定可实行文件的剧本。不外个中会遭到一些限定:

3.1我们须要加密谁人exe密钥,Envelope天生器会随机建立一个128位的值用于加密狗。因而,一切的exe都是分歧的。因而,若是宣布了更新的可实行文件,则还得依靠加密狗。

3.2我们可以或许愿望挑选性地指定一个预先录制的加密密钥,如许就不老是须要加密狗了,并在运用加密狗时,运用某种打印输出来检察天生的加密密钥

3.3我们有一个dll ,甚至有一个64位dll,但由于API存在破绽,以是供应商发起运用32位版本。因而,我们将运用带有Python Ctypes的32位供应商API dll,,并在我们的解封器中放入正当的加密狗交互。

除加密狗的硬编码密钥和暗码以外,它们地点的一样平常地区另有一些其他风趣的值。

商用硬件Token装备软件完成中的Envelope破绽剖析

红蓝对抗基础设施架构设计Wiki(上)

此Wiki的目的是为渗透测试人员提供用于设置弹性Red Team基础架构的资源。这是为了补充Steve Borosh(@424f424f)和Jeff Dimmock(@bluscreenofjeff) BSides NoVa 2017演讲“Doomsday Preppers:强化你的红队基础设施”的议题 (点此下载PPT)。 如果你有想要添加的内容,请提交Pull Request或在repo上提交问题。 感谢本维基中引用内容的所有作者以及所有人! 目录 设计注意事项 功能隔离 使用重定向器 样例设计 更多资源 域名 域名分类和黑名单检查资源 网络

在CFFExplorer中翻开我们的原始exe,此时会涌现一些值。

商用硬件Token装备软件完成中的Envelope破绽剖析

此时,我们就可以或许最先构建这个area中存在的内容了,并正确解压所触及的主要可实行文件,好比:

1.OEP(即顺序的进口点,可以或许用OD载入,不剖析代码);

2.电子狗暗码;

3.预加密的EXE密钥

4.原始映像基底;

5.加密的IAT偏移和巨细;

6.IDT偏移量和巨细;

7. 初始重定位目次;

编写一个解封器

注重:个中包罗了代码。

为了使全部编写历程更轻易,我们将运用2个Py3模块:

1.pefile; 

2.py3rijndael; 

PEfile模块异常合适处置惩罚pe文件或自动实行这类义务,我们在示例中运用的是Rijndael的初始py3模块,由于这是封装器用来加密和解密代码块的。

第1步:加载Senselock数据块

首先是加载PE文件并从数据块中转储风趣的值,相似于:

商用硬件Token装备软件完成中的Envelope破绽剖析

注重,若是加密狗可用,我们可以或许运用针对“LC.dll”(pylc)建立的最小绑定派生出EXE密钥。暗码和开发人员ID可以或许直接从可实行文件中读取。因而,不须要分外的设置装备摆设。

第2步:解密一切代码段

接下来,我们必需迭代每一个局部,并肯定它是不是可实行。我们可以或许经由历程搜检“IMAGE_SCN_MEM_EXECUTE”标记的每一个局部来完成这一点。若是是如许,我们运用Rijndael和EXE密钥解密该局部。

对照我们的封装和非封装版本,我们可以或许看到.text局部发生了转变:

商用硬件Token装备软件完成中的Envelope破绽剖析

事实上,与原版比拟,我们好像取得了提高!

商用硬件Token装备软件完成中的Envelope破绽剖析

纵然在IDA中加载它并转到指定的OEP,我们也可以或许看到事变正在规复一样平常。

商用硬件Token装备软件完成中的Envelope破绽剖析

第3步:解密IAT信息

接下来,我们须要解密该IAT块以检察我们正在运用的内容。内置构造是以下如许的:

· bytes – encrypted_iat_information

· bytes – original_idt

商用硬件Token装备软件完成中的Envelope破绽剖析

值得注重的是,这不仅仅是原始IAT的副本。Thunk条目已被删除并存储在自定义表中,在重构IAT之前须要对该表举行剖析。

注重:以下步调的难度将取决于PE内部构造和测试者导入方面的履历,在此,我发起你浏览一下该内容。http://www.reverse-engineering.info/SystemInformation/iat.html#sec3.2

第4步:剖析IAT Blob

接下来的义务现实上是加载我们解密的IAT blob,并将其视为一个内置了几个字符串表的多链表。

商用硬件Token装备软件完成中的Envelope破绽剖析

迥殊值得注重的是,该表还斟酌了按一样平常体式格局(IMAGE_ORDINAL_FLAG32)显现的导入序号。

在处置惩罚结束时,我们应当有一个看起来像如许的列表:

KERNEL32.dll
       CreateFileA
       LoadLibraryA
       CloseHandle
       IsDebuggerPresent
       InitializeSListHead
       GetSystemTimeAsFileTime
       GetCurrentThreadId
       GetCurrentProcessId
       QueryPerformanceCounter
       IsProcessorFeaturePresent
       TerminateProcess
       GetCurrentProcess
       SetUnhandledExceptionFilter
       UnhandledExceptionFilter
       GetModuleHandleW
VCRUNTIME140.dll
       memset
       _except_handler4_common
api-ms-win-crt-stdio-l1-1-0.dll
...

我们如今将“表”(LOL)列表,并在处置惩罚导入描述符表(IDT)以后将其返回。

第5步:规复原始IDT

商用硬件Token装备软件完成中的Envelope破绽剖析

如前所述,原始IDT完好无损,并遵照加密的IAT信息blob。事实上,IDT依然保存其末了位于IAT头部时的RVA(relative Virtual Address,相对虚拟地址偏移),它没有被修正并遵照典范的构造。

_fields_ = [('p_original_first_thunk', ctypes.c_int32),
            ('time_datestamp', ctypes.c_uint32),
            ('forwarder_chain', ctypes.c_int32),
            ('p_name', ctypes.c_int32),
            ('p_first_thunk', ctypes.c_int32)]

我们还晓得,在这个示例中,包罗8个条目(7个实在条目和1个空缺)来透露表现表的末端,每一个长度为20字节。

这几步下来,重构就算完成了。若是你想实验查找IDT曩昔的地位,可以或许经由历程以下步调:

1.寻觅最小的OFT值;

2.减去0x14 * number_of_idt_entries;

商用硬件Token装备软件完成中的Envelope破绽剖析

在大多数情况下,这应当是IDT的原始地位。由此我们晓得,封装器不能在原始PE映像中正确地重修该表,它在lcsh中“in place”运转它,并更新一切重定位偏移量来举行婚配。

第6步:规复DLL字符串地位!

由于晓得IDT的地位和称号RVA,这意味着我们也晓得这些dll称号字符串的地位。

作为嘉奖,让我们把它们放回本来的地位,以便让那些RVA值连结有用,而不是糟蹋分外的空间!

商用硬件Token装备软件完成中的Envelope破绽剖析

如上所述,编译历程将dll字符串内联到THUNK条目中,它们位于_IMAGE_IMPORT_BY_NAME构造的旁边,而且它们也是无序的。固然,他们中的一些也有多个跟随null( trailing null),至于是什么缘由,我们也不清楚。

第7步:建立一个新的Thunk数组地位

为此,我们须要遍历前面建立的导入列表,找到函数称号,然后按称号构造建立导入。应当注重,由于序号不须要_IMAGE_IMPORT_BY_NAME构造,以是没有序号信息。

然则,关于每次导入,我们将增添偏移量,我们将把它写入列表供今后参考,由于这些偏移量将在今后修复IAT时须要用到。

商用硬件Token装备软件完成中的Envelope破绽剖析

第8步:调解重定位

如今要进入末了的调解阶段了,为此我们必需建立一个值表,经由历程RVA指向_IMAGE_IMPORT_BY_NAME构造,或许经由历程迭代导入列表将序号分列好。

经由历程IDT,我们可以或许在两个地位:FirstThunk和OriginalFirstThunk写入这些偏移量。

第9步

1.如今,我们必需将导入局部偏移量变动为前面编写IDT标头的值,同时变动导入表的整体巨细。

2.我们必需将EntryPoint调解为真正的OEP;

3.我们应当重命名.lcsh局部让我们晓得它已被修正;

商用硬件Token装备软件完成中的Envelope破绽剖析

从上图可以或许看出,构建结果异常圆满。

商用硬件Token装备软件完成中的Envelope破绽剖析

由于称号表的导入偏移量是分歧的,而且我们末了增添了一些分外的内容,以是一些PE标头偏移量会和本来的架构有所分歧。除此以外,未封装的exe的巨细为10074字节(原始值为9216字节,封装后为102912字节)。

如今,我们可以或许清理该架构,搜检所封装的“代码”目次便可。然则,你须要从供应商SDK(Clave2 Basic_v2.2.2.2.zip)下载LC.dll文件。

总结

1.供应商将客户端库锁定到特定客户是有缘由的;

2.有时候,一些殽杂或反汇编战略可以或许会对剖析封装事变发生巨大影响;

3. 若是可实行文件运用加密狗,如加密的应用顺序文件或经由历程应用加密狗事件举行网络通讯,那本文所讲的要领的结果就会差许多;

4.与封装器夹杂的硬件加密模块很少能构建出更庞杂的平安模子;


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明商用硬件Token装备软件完成中的Envelope破绽剖析
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址