前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >利用DPAPI加密shellcode

利用DPAPI加密shellcode

作者头像
鸿鹄实验室
发布2021-10-12 16:38:23
6270
发布2021-10-12 16:38:23
举报
文章被收录于专栏:鸿鹄实验室鸿鹄实验室

DPAPI是啥?这里就不多说了,用处呢?主要就是用来解微软系的凭据啥的。

但微软给出了DPAPI的开发文档,我们也可以用它来加解密数据。

可以去看之前的文章:获取已控机器本地保存的RDP密码

加密函数:

https://docs.microsoft.com/en-us/windows/win32/api/dpapi/nf-dpapi-cryptprotectdata

代码语言:javascript
复制
DPAPI_IMP BOOL CryptProtectData(
  DATA_BLOB                 *pDataIn,
  LPCWSTR                   szDataDescr,
  DATA_BLOB                 *pOptionalEntropy,
  PVOID                     pvReserved,
  CRYPTPROTECT_PROMPTSTRUCT *pPromptStruct,
  DWORD                     dwFlags,
  DATA_BLOB                 *pDataOut
);

解密函数:

https://docs.microsoft.com/en-us/windows/win32/api/dpapi/nf-dpapi-cryptunprotectdata

代码语言:javascript
复制
DPAPI_IMP BOOL CryptUnprotectData(
  DATA_BLOB                 *pDataIn,
  LPWSTR                    *ppszDataDescr,
  DATA_BLOB                 *pOptionalEntropy,
  PVOID                     pvReserved,
  CRYPTPROTECT_PROMPTSTRUCT *pPromptStruct,
  DWORD                     dwFlags,
  DATA_BLOB                 *pDataOut
);

其中的DATA_BLOB和CRYPTPROTECT_PROMPTSTRUCT 为内置的结构体:

https://docs.microsoft.com/en-us/previous-versions/windows/desktop/legacy/aa381414(v=vs.85)

代码语言:javascript
复制
typedef struct _CRYPTOAPI_BLOB {
  DWORD cbData;
  BYTE  *pbData;
} CRYPT_INTEGER_BLOB, *PCRYPT_INTEGER_BLOB, CRYPT_UINT_BLOB, *PCRYPT_UINT_BLOB, CRYPT_OBJID_BLOB, *PCRYPT_OBJID_BLOB, CERT_NAME_BLOB, CERT_RDN_VALUE_BLOB, *PCERT_NAME_BLOB, *PCERT_RDN_VALUE_BLOB, CERT_BLOB, *PCERT_BLOB, CRL_BLOB, *PCRL_BLOB, DATA_BLOB, *PDATA_BLOB, CRYPT_DATA_BLOB, *PCRYPT_DATA_BLOB, CRYPT_HASH_BLOB, *PCRYPT_HASH_BLOB, CRYPT_DIGEST_BLOB, *PCRYPT_DIGEST_BLOB, CRYPT_DER_BLOB, PCRYPT_DER_BLOB, CRYPT_ATTR_BLOB, *PCRYPT_ATTR_BLOB;

cbData为大小、pbData为数据。

https://docs.microsoft.com/en-us/windows/win32/api/dpapi/ns-dpapi-cryptprotect_promptstruct

代码语言:javascript
复制
typedef struct _CRYPTPROTECT_PROMPTSTRUCT {
  DWORD   cbSize;
  DWORD   dwPromptFlags;
  HWND    hwndApp;
  LPCWSTR szPrompt;
} CRYPTPROTECT_PROMPTSTRUCT, *PCRYPTPROTECT_PROMPTSTRUCT;

至于调用就比较简单了,先声明一个此类的结构体,然后调用加密函数来加密它

得到加密后的值。

关于参数值,可以直接将鼠标移动过来,自己看含义。

然后就是调用解密函数对其解密,然后VirtualAlloc、RtlMoveMemory、CreateThread、WaitForSingleObject加载即可。

当然C#中也有相关的库可以实现对应操作:

代码语言:javascript
复制
using System.Security.Cryptography;
byte[] entropy = { };
byte[] encryptedText = ProtectedData.Protect(buf, null, DataProtectionScope.LocalMachine);

由于其dpapi为本地dpapi,其他机器都解不了,所以有一定的反沙箱效果,缺点就是只能先在目标机器上获取一下加密的值才能做后续操作。效果还算可以啦:

当然啦,官方给出了的DPAPI也不是只能加密字符的,内存也是可以的,也就是变相的绕过一些杀软的内存扫描啦。

更多精彩推荐,请关注我们

请严格遵守网络安全法相关条例!此分享主要用于学习,切勿走上违法犯罪的不归路,一切后果自付!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-10-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 鸿鹄实验室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档