MASM32编程完善SysInfo遇到奇怪故障,真切感受全局变量和局部变量之别……

简介: MASM32编程完善SysInfo遇到奇怪故障,真切感受全局变量和局部变量之别……

SysInfo主要是通过WMI来获取系统信息的,但是WMI获取的操作系统信息中没有Windows操作系统是32位还是64位的内容,所以需要另外想办法编程获取,比较常见的方法是调用Windows API函数GetNativeSystemInfo()或IsWow64Process()。之前分别用MASM32和VC分别编写了调用GetNativeSystemInfo()的代码。

今天把32or64.asm中的相关代码移植到SysInfo中来显示,主要是把32or64.asm中的相关代码改为一个函数showOsType(),原来的一些全局变量相应改成函数内部的局部变量,代码如下:

g_szOsType                  db    "系统类型:", 0
    g_sz32Bit                   db    "32位",0
    g_sz64Bit                   db    "64位",0
    g_szGetNativeSystemInfo     db    "GetNativeSystemInfo", 0
    g_szkernel32Dll             db    "kernel32.dll", 0
    g_szFailGetModuleHandle     db    "GetModuleHandle失败", 0
    g_szFailGetProcAddress      db    "GetProcAddress失败", 0
    g_szFailGetNativeSystemInfo db    "GetNativeSystemInfo失败", 0

showOsType proc
    LOCAL lpSI: dword
    LOCAL lpfnGetNativeSystemInfo: _LPFNGetNativeSystemInfo

    invoke editCatStr, OFFSET g_szOsType

    invoke GetModuleHandle, OFFSET g_szkernel32Dll
    .if    eax==NULL
        push OFFSET g_szFailGetModuleHandle 

    .else
        invoke GetProcAddress, eax, OFFSET g_szGetNativeSystemInfo
        .IF eax==NULL
            push   OFFSET g_szFailGetProcAddress ; for call editCatStr()
        .ELSE
            mov    lpfnGetNativeSystemInfo, eax 

            invoke lpfnGetNativeSystemInfo, ADDR lpSI                               

            lea    eax, lpSI
            movzx eax, (_SYSTEM_INFO ptr [eax]).wProcessorArchitecture
            .if (eax==PROCESSOR_ARCHITECTURE_IA64) || (eax==PROCESSOR_ARCHITECTURE_AMD64) || (eax==PROCESSOR_ARCHITECTURE_ARM64)
                push OFFSET g_sz64Bit
            .else
                push OFFSET g_sz32Bit
            .endif
        .ENDIF
    .endif

    call editCatStr ;invoke editCatStr, eax
    
    ret
showOsType endp

修改的程序汇编连接正常,运行时可以正常显示Windows操作系统类型是32位还是64位的,但显示完这行信息后停滞了一下,随后SysInfo窗口就没有任何提示地自动关闭了。

image.png

用OllyDbg跟踪了代码运行情况,代码运行正常,可以获得正确的操作系统类型信息,但是在函数执行结束返回时出现了访问异常。

还是第一次遇到这种情况,为了弄清楚原因,把showOsType()代码拿出来单独测试,代码如下:

;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; FileName: WinBit.asm
; Function: Show windows bit with API GetNativeSystemInfo
;   Author: PurpleEndurer
;   DevEnv: Windows 10  + MASM32
; 
; Log:
;---------------------------------------------------------------
;  20221216 Created
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
.586
.model     flat, stdcall
option     casemap:none
include    \masm32\include\windows.inc
include    \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
include    \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
 
;sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
;proto
;sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
_GetNativeSystemInfo     TYPEDEF proto :DWORD
_LPFNGetNativeSystemInfo TYPEDEF Ptr _GetNativeSystemInfo
 
showOsType           proto
 
;sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
;.const
;sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
;PROCESSOR_ARCHITECTURE_INTEL   equ 0      ;x86
;PROCESSOR_ARCHITECTURE_ARM     equ 5      ;ARM
;PROCESSOR_ARCHITECTURE_IA64    equ 6      ;基于 Intel Itanium 的
;PROCESSOR_ARCHITECTURE_AMD64   equ 9      ;x64 (AMD 或 Intel)
PROCESSOR_ARCHITECTURE_ARM64    equ 12     ;ARM64
;PROCESSOR_ARCHITECTURE_UNKNOWN equ 0ffffh ;未知体系结构。
 
 
;sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
;.data
;sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
  

 
;sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
.code
;sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss

    g_szOsType                  db    "系统类型:", 0
    g_sz32Bit                   db    "32位",0
    g_sz64Bit                   db    "64位",0
    g_szGetNativeSystemInfo     db    "GetNativeSystemInfo", 0
    g_szkernel32Dll             db    "kernel32.dll", 0
    g_szFailGetModuleHandle     db    "GetModuleHandle失败", 0
    g_szFailGetProcAddress      db    "GetProcAddress失败", 0
    g_szFailGetNativeSystemInfo db    "GetNativeSystemInfo失败", 0

showOsType proc
    LOCAL lpSI: dword
    LOCAL lpfnGetNativeSystemInfo: _LPFNGetNativeSystemInfo

    invoke GetModuleHandle, OFFSET g_szkernel32Dll
    .if    eax==NULL
        mov eax, OFFSET g_szFailGetModuleHandle 
    .else
        invoke GetProcAddress, eax, OFFSET g_szGetNativeSystemInfo
        .IF eax==NULL
            mov eax, OFFSET g_szFailGetProcAddress
        .ELSE
            mov   lpfnGetNativeSystemInfo, eax

            invoke lpfnGetNativeSystemInfo, ADDR lpSI
                               
            lea   eax, lpSI
            movzx eax, (SYSTEM_INFO ptr [eax]).wProcessorArchitecture
            .if (eax==PROCESSOR_ARCHITECTURE_IA64) || (eax==PROCESSOR_ARCHITECTURE_AMD64) || (eax==PROCESSOR_ARCHITECTURE_ARM64)
                mov eax, OFFSET g_sz64Bit   ; push OFFSET g_sz64Bit
            .else
                mov eax, OFFSET g_sz32Bit   ; push OFFSET g_sz32Bit
            .endif
        .ENDIF
    .endif

push eax
      invoke MessageBox, NULL, eax, OFFSET g_szOsType, MB_OK
pop eax
    ret
showOsType endp


main  proc
      invoke showOsType
      invoke MessageBox, NULL, eax, OFFSET g_szOsType, MB_OK
      invoke ExitProcess, NULL
 main endp
 
end main

代码汇编连接成功,运行时正常显示showOsType()中

invoke MessageBox, NULL, eax, OFFSET g_szOsType, MB_OK

image.png

然后就出现问题了:

E xception 000006BA . exception is non-continuable

image.png

main()函数中的

invoke MessageBox, NULL, eax, OFFSET g_szOsType, MB_OK

1.

并没有得到执行,显示出信息框来。

开始百思不得其解,后面重新研究了GetNativeSystemInfo的参数说明:

参数

[out] lpSystemInfo

指向接收信息的  SYSTEM_INFO 结构的指针。

我代码中传递GetNativeSystemInfo()的参数dword类型变量lpSI,其值没有初始化,而不是指向一个SYSTEM_INFO结构的地址(指针)。这样GetNativeSystemInfo函数返回的SYSTEM_INFO结构信息数据覆盖了函数返回信息数据,导致函数结束返回时跳到了错误的地址,引发异常。

原来如此,看来lpSI定义为全局变量没有出现问题纯属侥幸。写代码一定要看清楚函数原型和说明。

参考:

GetNativeSystemInfo 函数 (sysinfoapi.h)


相关文章
|
存储 编解码 缓存
Qt开发技术:Qt绘图系统(一)绘图系统介绍
Qt开发技术:Qt绘图系统(一)绘图系统介绍
Qt开发技术:Qt绘图系统(一)绘图系统介绍
|
4月前
|
数据采集 Web App开发 数据可视化
Python爬虫分析B站番剧播放量趋势:从数据采集到可视化分析
Python爬虫分析B站番剧播放量趋势:从数据采集到可视化分析b
|
SQL 安全 网络协议
2022年浙江省职业院校技能大赛信息安全管理与评估 理论题答案
2022年浙江省职业院校技能大赛信息安全管理与评估 理论题答案
|
11月前
|
人工智能 运维 安全
阿里云先知安全沙龙(上海站) ——终端安全对抗及防护
终端安全现状面临多重挑战,包括传统签名技术失效、新型无文件攻击频发、专业人才匮乏、分支机构安全管理不足等。企业终端覆盖不全、日志缺失、策略更新依赖厂商,导致运营排查困难。钓鱼攻击手法愈发精细,静态和动态对抗加剧,攻击者利用正常权限入侵,窃取凭据。Web3技术发展使加密货币成为新目标,职业黑客盯上个人钱包和交易公司。防护升级需涵盖预防、检测、响应和运营四个阶段,借助AI和威胁情报降低告警量,提升整体安全水平。
|
API Windows
[原创]MASM32新手指南
[原创]MASM32新手指南
|
Ubuntu Linux 虚拟化
如何在windows 11中安装WSLG(WSL2)
如何在windows 11中安装WSLG(WSL2)
988 0
|
存储 SQL HIVE
金融审批数仓(离线)--DWD层、ADS层
金融审批数仓(离线)--DWD层、ADS层
405 4
|
机器学习/深度学习 PyTorch 算法框架/工具
使用Python实现卷积神经网络(CNN)
使用Python实现卷积神经网络(CNN)的博客教程
1574 1
|
存储 定位技术 API
c语言——俄罗斯方块
c语言——俄罗斯方块
328 0
|
安全 网络安全 Windows
永恒之蓝(ms17_010)漏洞攻击原理与防护加固
通过nmap检测到目标服务器开放445端口,疑似存在MS17_010(永恒之蓝)漏洞。利用MSF的eternalblue模块成功入侵,获得system权限,证实漏洞存在。随后,通过禁用并停止Server服务进行加固。再次尝试攻击,显示加固有效,攻击失败。
1731 0