首页
社区
课程
招聘
[原创]在ShellCode里面使用异常处理(Win32位平台)
发表于: 2023-7-13 19:14 16269

[原创]在ShellCode里面使用异常处理(Win32位平台)

2023-7-13 19:14
16269


上次发帖介绍了一下64位Shellcode异常处理的(链接:https://bbs.kanxue.com/thread-277595-1.htm),有朋友发消息说想看一下32位的,所以抽空做了一点尝试。



Win32的异常处理最经典的是Matt Pietrek写的文章,这是一篇翻译的:https://www.cnblogs.com/sunkang/archive/2011/04/29/2038817.html


32位的异常挂接比较简单,下面的代码是从上文复制过来的:

原理其实就是将自己的异常处理函数挂接到TEB的异常列表里面。




但Win32如果想在ShellCode里面使用自己的异常处理,其实还是很困难的,原因在于Safe SEH。比如说上面的代码,如果使用VS2017编译为release版本,默认情况下,异常回调根本不会触发。所以比如说你将ShellCode注入到记事本,异常函数根本不会触发,记事本闪崩。网上也有一些解决方案,比如说使用向量异常接管,但这也失去了SEH的意义。详细介绍可以参考这篇文章:https://hackmag.com/uncategorized/exceptions-for-hardcore-users/ ,代码下载:

https://github.com/Teq2/SEH-Over-VEH。当然,如果你是自己的Loader,那么可以通过修改编译选项来解决,但也失去了Shellcode的意义---因为写成Dll然后内存加载更好。



[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (5)
雪    币: 456
活跃值: (917)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
感谢分享,做个记号
2023-7-13 19:54
0
雪    币: 461
活跃值: (2808)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
写得非常好,那么,arm64的异常是不是在路上了??
2023-7-13 19:59
0
雪    币: 30032
活跃值: (2577)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
saloyun 写得非常好,那么,arm64的异常是不是在路上了??[em_71]
只懂Win:)
2023-7-13 21:33
0
雪    币: 461
活跃值: (2808)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
bestbird 只懂Win:)
windows的arm64也出来很多年了呀,大佬写文分析一下吧
2023-7-14 16:25
0
雪    币: 30032
活跃值: (2577)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
saloyun windows的arm64也出来很多年了呀,大佬写文分析一下吧[em_1]

找不到arm64的机器,因为我只有一台电脑。不过你可以试试附件里面的win64目录下的TEST。因为我看了一下Delphi的system.pas,里面有编译定义:

  {$IFDEF CPUX86}
        {$DEFINE ARITH_PUREPASCAL_EXT80}
  {$ENDIF CPUX86}
  {$IFDEF CPUX64}
    {$IFDEF MSWINDOWS}
        {$DEFINE ARITH_PUREPASCAL_EXT64}
    {$ENDIF MSWINDOWS}
    {$IFDEF LINUX}
        {$DEFINE ARITH_USE_LIBM}
    {$ENDIF LINUX}
  {$ENDIF CPUX64}
  {$IFDEF CPUARM}
        {$DEFINE ARITH_USE_LIBM}
  {$ENDIF CPUARM}

还有一个是初始化的函数:

procedure _InitializeControlWord;
begin
{$IF defined(IOS) and defined(CPUX86)} // iOS Simulator
  TestSSE := $3; // All Intel Mac supports SSE2.
  FPUExceptionMaskBits := (Default8087CW and $003F) or ((DefaultMXCSR and $1F80) shr 7) or $8000;
{$ELSEIF defined(CPUX86) and defined(ASSEMBLER)} // Win32 or OSX32
  TestSSE := GetBriefSSEType;
  DefaultMXCSR := GetMXCSR and $FFC0;  // Remove flag bits;
{$ELSEIF defined(CPUX64) and defined(MSWINDOWS)} // Win64
  TestSSE := $3; // SSE & SSE2 are available on X64
  Default8087CW := Get8087CW and $1F3F; // Remove reserved bits.
{$ELSEIF defined(CPUX64) and defined(ARITH_USE_LIBM)} // Linux64
  TestSSE := $3; // SSE & SSE2 are available on X64
  FPExceptionMaskBits := DefaultFPEnv;
{$ENDIF}
end;

而异常处理函数里面,只是分为32位和64位的,其中32位是纯汇编的。所以你可以试试附件,唯一有可能不一样的地方是里面使用了一条指令:

LDMXCSR DefaultMXCSR。Delphi本身支持一套代码编译出Win、linux、Andriod、IOS,但对于Win,只有Win32和Win64可以选择,没有ARM64的选项,所以要么它本身就支撑(包括异常),要么连编译的64 bit EXE都跑不起来。不过我隐约记得,64位的异常表结构,好像是分CPU的。

2023-7-14 17:01
0
游客
登录 | 注册 方可回帖
返回
//