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

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

2020-11-19 10:58
5624

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

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

sos 在此:
447K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6V1L8$3y4K6i4K6u0W2L8h3W2U0M7X3!0K6L8$3k6@1i4K6u0W2j5$3!0E0i4K6u0r3P5X3S2Q4x3X3c8U0L8W2)9J5c8X3c8G2N6r3&6W2N6q4)9J5c8X3k6J5j5h3#2W2N6$3!0J5K9#2)9J5c8Y4c8G2L8$3I4K6i4K6u0r3M7$3!0K6i4K6u0V1k6r3I4D9i4K6u0V1M7$3!0K6i4K6u0V1k6r3g2T1N6h3N6Y4K9h3&6Y4i4K6u0V1k6i4S2@1k6h3&6K6K9h3!0F1

加载 sos:

一开始不知道 怎么给 iex 下断,去 msdn 查一下相关信息:
6f4K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6V1L8$3y4K6i4K6u0W2L8h3W2U0M7X3!0K6L8$3k6@1i4K6u0W2j5$3!0E0i4K6u0r3k6h3&6Q4x3X3c8#2M7#2)9J5c8Y4m8G2N6$3g2J5M7$3S2W2L8r3I4Q4x3V1k6E0L8$3c8#2L8r3g2Q4x3V1k6E0K9h3y4J5L8%4y4G2k6Y4c8Q4x3X3g2H3L8%4N6W2M7Y4y4Z5k6h3I4D9i4K6u0W2N6i4c8A6L8r3W2@1P5g2)9J5c8X3W2F1N6X3!0C8k6g2)9J5k6r3g2^5M7s2u0W2M7%4y4A6L8$3&6Q4x3@1k6$3K9h3g2%4i4K6y4p5M7r3!0%4k6i4u0K6K9r3g2D9L8q4)9J5k6o6M7`.
了解到所在模块为 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

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

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