wscript.exe
或者cscript.exe
)根据微软官方文档,AmsiScanBuffer
函数应该返回HRESULT
类型值,这是一个整数值,用来表示操作是否成功。在我们的例子中,如果该函数成功,那么就应当返回S_OK
(0x00000000
),否则应该返回HRESULT
错误代码。这个函数的主要功能是返回需要扫描的内容是否存在问题,这也是result
变量会作为参数传递给AmsiScanBuffer
函数的原因所在。这个变量的类型为AMSI_RESULT
枚举类型。对应的枚举原型如下所示:1typedef enum AMSI_RESULT {2AMSI_RESULT_CLEAN,3AMSI_RESULT_NOT_DETECTED,4AMSI_RESULT_BLOCKED_BY_ADMIN_START,5AMSI_RESULT_BLOCKED_BY_ADMIN_END,6AMSI_RESULT_DETECTED7};Copied!在函数执行过程中,待分析的内容会被发送到反恶意软件服务,后者会返回1
到32762
(含)之间的一个整数。整数值越大,则代表风险越高。如果证书大于或等于32762
,那么就会将其判断为恶意数据,加以阻止。随后系统会根据返回的整数值来更新AMSI_RESULT
变量值。默认情况下,该变量处于“正常”(“无害”)值状态,因此,如果我们修改了函数指令,使其永远不会将待分析的内容发送给反恶意软件服务,并且返回S_OK
HRESULT
结果值,那么这些内容就会被当成无害数据。在汇编语言中,EAX
(32位)以及RAX
(64位)寄存器始终包含函数的返回值。因此,如果EAX
/RAX
寄存器值等于0,并且如果执行了ret
汇编指令,那么该函数就会返回S_OK
HRSULT
,不会将待分析数据发送给反恶意软件服务。
10:025> dq 000000fb`169ce4182000000fb`169ce418 00000000`00008000 00000000`000000003000000fb`169ce428 00000000`00000001 000002d6`892c7a304000000fb`169ce438 000002d6`892c7f00 000002d6`892c7af05000000fb`169ce448 000002d6`892c7fc8 000002d6`892c39786000000fb`169ce458 00007ffa`fea6b645 00007ffa`ff42eb287000000fb`169ce468 00007ffb`3003f4b3 000002d6`a0b996908000000fb`169ce478 00007ffb`2d28b58e 00000000`ffffffff9000000fb`169ce488 000002d6`98b69ac0 00000000`00000000Copied!