首页
社区
课程
招聘
[原创] windbg---powershell---sos-iex下断点获取执行脚本(找不到相关windows api的情况)
发表于: 2020-11-19 10:58 5384

[原创] windbg---powershell---sos-iex下断点获取执行脚本(找不到相关windows api的情况)

2020-11-19 10:58
5384

该文章内容可忽略,这个方法更好用: https://bbs.pediy.com/thread-261262.htm

该方法适用于不知道恶意脚本会调用哪些关键的 api

sos 在此:
https://docs.microsoft.com/zh-cn/dotnet/framework/tools/sos-dll-sos-debugging-extension

加载 sos:

一开始不知道 怎么给 iex 下断,去 msdn 查一下相关信息:
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/invoke-expression?view=powershell-7
了解到所在模块为 Microsoft.PowerShell.Utility

name2ee 可以获取一些方法、类的结构和地址

我们通过 name2ee 找一下具体的模块:

应该就是这个 dll:

在电脑搜索这个 dll,用 dnSpy 打开,定位到 Microsoft.PowerShell.Commands->InvokeExpressionCommand,里面有一个 ProcessRecord 方法,所以最终我们要下断的方法是:

本来以为可以用 bpmd 命令直接下断,结果断不下来,所以还是用 name2ee 找到函数地址,以后就不用做上面的准备工作了,可以直接执行下面的命令:

得到:

JITTED Code Address 就是我们要下断的地址,下断:

断下来之后,怎么找到命令呢?
执行 !dso,找到所有的 Object,复制出来,搜索 Microsoft.PowerShell.Commands.InvokeExpressionCommand 得到:

dump Object

得到:

继续dump _command 对应的 value

得到:

可能多次触发断点,每次断点可能还有多个 InvokeExpressionCommand Object,一般最后一次断点的第 1 个 InvokeExpressionCommand 对应的 _command value dump 出来的 string 是这种方法能做到的最好的效果

这种方法的优点是足够精确且通用,缺点就是略繁琐,如果能找到其他相关的 api 断点,就不需要用这种方法了

感谢yz

 
.load sos
.load sos
 
Usage: !Name2EE module_name item_name
  or    !Name2EE module_name!item_name
       use * for module_name to search all loaded modules
Examples: !Name2EE  mscorlib.dll System.String.ToString
          !Name2EE *!System.String
Usage: !Name2EE module_name item_name
  or    !Name2EE module_name!item_name
       use * for module_name to search all loaded modules
Examples: !Name2EE  mscorlib.dll System.String.ToString
          !Name2EE *!System.String
!name2ee * iex
!name2ee * iex
Module: 000007fef0711000 (Microsoft.PowerShell.Commands.Utility.dll)
Module: 000007fef0711000 (Microsoft.PowerShell.Commands.Utility.dll)
Microsoft.PowerShell.Commands.InvokeExpressionCommand.ProcessRecord
Microsoft.PowerShell.Commands.InvokeExpressionCommand.ProcessRecord
!name2ee Microsoft.PowerShell.Commands.Utility.dll Microsoft.PowerShell.Commands.InvokeExpressionCommand.ProcessRecord
!name2ee Microsoft.PowerShell.Commands.Utility.dll Microsoft.PowerShell.Commands.InvokeExpressionCommand.ProcessRecord
Module: 000007fef03e1000 (Microsoft.PowerShell.Commands.Utility.dll)
Token: 0x0000000006000476
MethodDesc: 000007fef03fd918
Name: Microsoft.PowerShell.Commands.InvokeExpressionCommand.ProcessRecord()
JITTED Code Address: 000007fef0548af0
Module: 000007fef03e1000 (Microsoft.PowerShell.Commands.Utility.dll)
Token: 0x0000000006000476
MethodDesc: 000007fef03fd918
Name: Microsoft.PowerShell.Commands.InvokeExpressionCommand.ProcessRecord()
JITTED Code Address: 000007fef0548af0
bp 000007fef0548af0

[峰会]看雪.第八届安全开发者峰会10月23日上海龙之梦大酒店举办!

最后于 2022-5-14 23:34 被qux编辑 ,原因: 有更好的方法
收藏
免费 4
支持
分享
最新回复 (4)
雪    币: 581
活跃值: (1142)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
有例子吗?这个好像是针对iex后面的cmdlet进行还原?
那和这个方法是否一样呢?“IEX用于将字符串作为命令执行,当去掉IEX后,执行后就会显示原本的字符串”
https://www.sohu.com/a/250861994_354899
2022-5-7 15:27
0
雪    币: 12868
活跃值: (5553)
能力值: ( LV5,RANK:77 )
在线值:
发帖
回帖
粉丝
qux
3
lracker 有例子吗?这个好像是针对iex后面的cmdlet进行还原? 那和这个方法是否一样呢?“IEX用于将字符串作为命令执行,当去掉IEX后,执行后就会显示原本的字符串” https://www.sohu ...
对,确实是针对iex,这个方法只是不需要手动去修改执行了,如果遇到层数太多的情况,这个方法还是有用的。例子就是自己多套几次iex试试
2022-5-11 07:26
0
雪    币: 581
活跃值: (1142)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
噢。那我这边还有一个解决方法。https://bbs.pediy.com/thread-261262.htm
直接开启PowerShell日志即可。查看PowerShell日志就能看到去混淆后的命令。
2022-5-11 11:17
1
雪    币: 12868
活跃值: (5553)
能力值: ( LV5,RANK:77 )
在线值:
发帖
回帖
粉丝
qux
5
lracker 噢。那我这边还有一个解决方法。https://bbs.pediy.com/thread-261262.htm 直接开启PowerShell日志即可。查看PowerShell日志就能看到去混淆后的命令 ...
这方法比我写的简单通用多了,感谢!
2022-5-12 19:52
0
游客
登录 | 注册 方可回帖
返回
//