本帖最后由 连晋 于 2019-5-2 17:02 编辑
之前逛论坛的时候 看到了一个帖子 帖子地址 [可疑样本] 勒索病毒 提交了病毒样本 求分析
下载样本大概看了一下 很简单 很适合我这种新人学习 所以就打算动手写一份 样本分析发上来
病毒逻辑很简单 重点是遇到问题的解决思路 以及 这是我第一次分析PC 病毒样本 以此留恋
点击此处可到B站查看视频详细版本分析 (我还做了其他的视频哦)
首先拿到样本 名字为 阴阳师外挂(电脑版).zip 两次解压之后 得到 阴阳师外挂(电脑版).exe
查壳 得出为 upx 压缩壳 直接用 工具脱壳
脱壳完毕 运行试试
Emmm 正常运行 nice 我们的机器 成功的被锁了
这一步该怎么办 ?
试试 ctrl + alt +delete 任务管理器 不行 几秒钟后 就被 关闭了 任务管理器
尝试按了一下 win键 windows 的菜单栏居然还可以打开
瞬间明白了 其实这个病毒是创建了一个 窗口 最大化 铺满电脑屏幕 并且位置 一直为 最前
并且我在之前 尝试 打开 任务管理器 的时候 发现 任务管理器 可以启动 但是 过了几秒就 又被关闭了
注意 这里是 没有禁止启动 任务管理器 而是 任务管理器 启动以后 就 隔了几秒终止 任务管理器
此处有2个想法 在我心里浮现
第一 这个病毒 作者水平可能还没我这么菜的人高
第二点 这个软件 很可能是E语言写的 (事实证明 看OD丢进去看也确实是E写的 )
说明 整个 病毒 最少有 1个时钟事件 用来不停的终止 任务管理器 的进程 并且把自己设为 窗口 最前
接下来开始构思解决方案
并且基于 以下几点
1. 我从来没分析过PC病毒样本 足以说明我 各方面都不行
2. 我2周之前连OD 怎么用也不知道 大部分快捷键都是 骚猪教我的 @感冒的猪baby
3. 汇编指令 它认识我 我不认识它
4. 病毒是通过 E语言来实现的 窗口 每隔一段时间就 置前
碰巧发现 精易编程助手可以 强制窗口置前
所以接下来 运行 精易编程助手 把 置顶 勾上
然后再去运行病毒样本
尝试 按alt+tab ----》 成功 精易编程助手 成功出现在屏幕上面
接下来 拖动 左上角的放大镜 选择 病毒程序 然后 修改它的 窗口大小
用 E debug 调试 得出 有2个时钟周期事件 和 一个按钮事件
00401377 和 00401479 应该就是 终止任务管理器 和窗口一直置前 的 时钟周期任务了
OD 进端首 ret 即可
接下来去分析 按键事件 004010B9
打开OD 附加 病毒 ctrl+g 跳转到 004010B9
004010B9 /. 55 push ebp
004010BA |. 8BEC mov ebp,esp
004010BC |. 81EC 30000000 sub esp,0x30
004010C2 |. 6A FF push -0x1
004010C4 |. 6A 08 push 0x8
004010C6 |. 68 37000116 push 0x16010037
004010CB |. 68 01000152 push 0x52010001
004010D0 |. E8 A8140000 call 1.0040257D ; 取识别码
004010D5 |. 83C4 10 add esp,0x10
004010D8 |. 8945 FC mov [local.1],eax
004010DB |. 68 04000080 push 0x80000004
004010E0 |. 6A 00 push 0x0
004010E2 |. 8B45 FC mov eax,[local.1]
004010E5 |. 85C0 test eax,eax
004010E7 |. 75 05 jnz short 1.004010EE
004010E9 |. B8 9C604800 mov eax,1.0048609C
004010EE |> 50 push eax
004010EF |. 68 01000000 push 0x1
004010F4 |. BB 50284000 mov ebx,1.00402850
004010F9 |. E8 67140000 call 1.00402565
004010FE |. 83C4 10 add esp,0x10
00401101 |. 8945 F8 mov [local.2],eax
00401104 |. 8B5D FC mov ebx,[local.1]
00401107 |. 85DB test ebx,ebx
00401109 |. 74 09 je short 1.00401114
0040110B |. 53 push ebx
0040110C |. E8 66140000 call 1.00402577
00401111 |. 83C4 04 add esp,0x4
00401114 |> DB45 F8 fild [local.2]
00401117 |. DD5D F0 fstp qword ptr ss:[ebp-0x10]
0040111A |. DD45 F0 fld qword ptr ss:[ebp-0x10]
0040111D |. DC0D 9D604800 fmul qword ptr ds:[0x48609D]
00401123 |. DD5D E8 fstp qword ptr ss:[ebp-0x18]
00401126 |. DD45 E8 fld qword ptr ss:[ebp-0x18]
00401129 |. DC25 A5604800 fsub qword ptr ds:[0x4860A5]
0040112F |. DD5D E0 fstp qword ptr ss:[ebp-0x20]
00401132 |. 68 01060080 push 0x80000601
00401137 |. FF75 E4 push [local.7]
0040113A |. FF75 E0 push [local.8]
0040113D |. 68 01000000 push 0x1
00401142 |. BB 50284000 mov ebx,1.00402850
00401147 |. E8 19140000 call 1.00402565
0040114C |. 83C4 10 add esp,0x10
0040114F |. 68 01030080 push 0x80000301
00401154 |. 6A 00 push 0x0
00401156 |. 50 push eax
00401157 |. 68 01000000 push 0x1
0040115C |. BB 302A4000 mov ebx,1.00402A30
00401161 |. E8 FF130000 call 1.00402565
00401166 |. 83C4 10 add esp,0x10
00401169 |. 8945 D8 mov [local.10],eax
0040116C |. 6A FF push -0x1
0040116E |. 6A 08 push 0x8
00401170 |. 68 07000116 push 0x16010007
00401175 |. 68 01000152 push 0x52010001
0040117A |. E8 FE130000 call 1.0040257D
0040117F |. 83C4 10 add esp,0x10
00401182 |. 8945 D4 mov [local.11],eax
00401185 |. 8B45 D8 mov eax,[local.10]
00401188 |. 50 push eax
00401189 |. FF75 D4 push [local.11]
0040118C |. E8 8BFEFFFF call 1.0040101C
00401191 |. 83C4 08 add esp,0x8
00401194 |. 83F8 00 cmp eax,0x0
00401197 |. B8 00000000 mov eax,0x0
0040119C |. 0f94c0 sete al
0040119F |. 8945 D0 mov [local.12],eax
004011A2 |. 8B5D D4 mov ebx,[local.11]
004011A5 |. 85DB test ebx,ebx
004011A7 |. 74 09 je short 1.004011B2
004011A9 |. 53 push ebx
004011AA |. E8 C8130000 call 1.00402577
004011AF |. 83C4 04 add esp,0x4
004011B2 |> 8B5D D8 mov ebx,[local.10]
004011B5 |. 85DB test ebx,ebx
004011B7 |. 74 09 je short 1.004011C2
004011B9 |. 53 push ebx
004011BA |. E8 B8130000 call 1.00402577
004011BF |. 83C4 04 add esp,0x4
004011C2 |> 837D D0 00 cmp [local.12],0x0
004011C6 |. 0F84 E0000000 je 1.004012AC ; 确定按钮关键跳
004011CC |. 68 04000080 push 0x80000004
............ 此处省略
004012AC |> 8BE5 mov esp,ebp
004012AE |. 5D pop ebp
004012AF \. C3 retn
在OD 中结合看这几处代码
我也是一个一个查手册才知道的 是 什么 意思
|. E8 66140000 call 1.00402577
00401111 |. 83C4 04 add esp,0x4
00401114 |> DB45 F8 fild [local.2]
00401117 |. DD5D F0 fstp qword ptr ss:[ebp-0x10] // [ebp-0x10] 值 为 程序显示的识别码
0040111A |. DD45 F0 fld qword ptr ss:[ebp-0x10]
0040111D |. DC0D 9D604800 fmul qword ptr ds:[0x48609D] // dd 0x48609D 值为 433.00000000
00401123 |. DD5D E8 fstp qword ptr ss:[ebp-0x18]
00401126 |. DD45 E8 fld qword ptr ss:[ebp-0x18]
00401129 |. DC25 A5604800 fsub qword ptr ds:[0x4860A5] // dd 0x4860A5 值为 75.00000000
0040112F |. DD5D E0 fstp qword ptr ss:[ebp-0x20]
00401132 |. 68 01060080 push 0x80000601
00401137 |. FF75 E4 push [local.7]
最终得出
(识别码 乘以 433)再减去 75 = 解锁密码
额 有小伙伴问是怎么得出 这个结果的 其实有我的锅存在 怪我太菜 没写详细 最后贴出来的 这部分 代码里面 的变量的 值
经过 @smile1110 老哥提醒 特地 补充了一下帖子
并且过程中遇到一些不懂的问题 感谢 @asd9988 大佬的热心帮助
我没有 贴出来
首先
00401117 中 [ebp-0x10] 为程序显示的 识别码
0040111D fmul qword ptr ds:[0x48609D] // dd 0x48609D 值为 433.00000000 fmul 是 ST0的值和 [0x48609D] 相乘 得就是 程序识别码 X 433
00401129 fsub qword ptr ds:[0x4860A5] // dd 0x4860A5 值为 75.00000000 fsub 是 ST0的值减 [0x4860A5] 就是 (程序识别码 X 433)-75
所以最终 算法 应该是 (识别码 乘以 433)再减去 75 = 解锁密码
啥是ST0 ?
看图。。。。
吃水不忘挖井人 如果你觉得这个帖子对你有用的话
麻烦点一下 免费的热心和 CB 这也是对我以后再次发帖的鼓励
|