`
mixer_a
  • 浏览: 364365 次
社区版块
存档分类
最新评论

【原创】在MASM32中使用自己的STUB

 
阅读更多
这是我测试PE格式的STUB的源代码,可显示当前所用操作操作系统版本。

dos下的stub部分源代码---调用DOS中断服务程序

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
; FileName: os_type.asm
; function: Reports current operation system type
; Author : Purple Endurer
; Version : 0.1
;
; OS Name Offset of INT 08h Offset of INT 43h
; -------------------------------------------------------
; MS DOS 7.00 001Fh 5710h
; MS DOS 7.10 18DEh 6EE5h
; UCDOS 1AF3h
; UCDOS98 1AEBh 6E20h
; MSDOS mode 0000h
; PDOS95 0A50h 6E20h
;
; Date Summary
; -------------------------------------------------------
; 2002.04.07 Created from software paper 95P125
; 2002.06.11 Show version if os is MS-DOS
; 2002.08.07 Convert it to DOS EXE format to be stub
; program in PE format execute file
; 2004.02.09 Added the condition asm var 'UseStack'
; Question:
; Why can this program run normally with stack segment,
; though there is push and pop instruction in bin2dec proc?

UseStack equ 0
data segment
strMSDOS db "MS DOS "
cMajorVer db ' '
db '.'
cMinorVer db " $"

strUCDOS db "UCDOS"
cUCDOSVer db " 98特别版$"

strPDOS95 db "Windows95中文DOS方式PDOS95$"
data ends

if UseStack
sseg segment stack
db 10 dup(?)
sseg ends
endif
code segment
;--------------------------------------
if UseStack
assume cs: code, ds: data, ss: sseg
else
assume cs: code, ds: data
endif

main proc
start:
mov ax, data
mov ds, ax

if UseStack
mov ax, sseg
mov ss, ax
endif

mov ah, 30h ; Get Version
int 21h
add al, '0'
mov cMajorVer, al
mov bx, offset cMinorVer
call bin2dec

mov ax, 3508h
int 21h

mov dx, offset strMSDOS
mov ah, 09h
int 21h

cmp bx, 1fh
je @end ;Here is DOS 7.00 only
cmp bx, 18deh
je @End ;Here is DOS 7.10 only

mov dx, offset strUCDOS
cmp bx, 1aebh
je @Report

cmp bx, 1af3h
jne @next2
mov cUCDOSVer, '$'
jmp @report

@next2:

mov dx, offset strPDOS95
cmp bx, 0a50h
jne @End
@Report:
;mov ah, 09h
int 21h
@End:
mov ax, 4c00h
int 21h
main endp

; ========================================================
; Input : AH = the Binary will be translated)
; BX = First offset of memory us to store the result
; Output: BX = First offset of memory stored the result
; --------------------------------------------------------
bin2dec proc
push dx
mov dl, 10
@LoopDiv:
mov al, ah
xor ah, ah
div dl ; (AL) <- (AX) / (DL) (AH) <- (AX) % (DL)
add al, '0'
mov [bx], al
inc bx
cmp ah, 10
jg @LoopDiv

add ah, '0'
mov [bx], ah
pop dx
ret
bin2dec endp
;=========================================
code ends
end main

WINDOWS下的源代码--调用 API 函数GetVersionEx()

;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;FileName: StubDemo.asm
; Fuction: Demo how to use the custome stub of PE exe files.
; Author: Purple Endurer

; Date Summary
; -------------------------------------------------------
; 2002.04.07 Created!
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

.386
.model flat, stdcall
option casemap:none
include /masm32/include/windows.inc
include /masm32/include/kernel32.inc
include /masm32/include/user32.inc
includelib /masm32/lib/user32.lib
includelib /masm32/lib/kernel32.lib

bDetailInfo equ 0

.data
szMsgBoxTitle db "当前操作系统",0

if bDetailInfo ;?????? bDetailInfo
szWin31 db "Win32s on Windows 3.1 ", 0
szWin9x db "Win32 on Windows 95 ", 0
else
szWin31 db "Windows 3.1 ", 0
szWin9x db "Windows 95 ", 0
endif ;?????? bDetailInfo

szWinNT db "Windows NT ", 0

szFormat4OsVer db "%lu.%lu.%lu", 0
szGetOsInfoFail db "取操作系统信息失败!", 0

.data?
OsVer OSVERSIONINFO <>
szOsVerInfo db 255 dup (?)
szOsVerInfoTmp db 255 dup (?)

.code
start:
mov OsVer.dwOSVersionInfoSize, SIZEOF OSVERSIONINFO
invoke GetVersionEx, ADDR OsVer

.if eax
mov eax, OsVer.dwPlatformId

;Identifies the build number of the operating
;system in the low-order word For Win9X

.if eax == VER_PLATFORM_WIN32s
mov esi, OFFSET szWin31
and OsVer.dwBuildNumber, 0FFFFh

.elseif eax == VER_PLATFORM_WIN32_WINDOWS
mov esi, OFFSET szWin9x
and OsVer.dwBuildNumber, 0FFFFh

.else ; eax ==VER_PLATFORM_WIN32_NT
mov esi, OFFSET szWinNT
.endif

invoke lstrcpy, ADDR szOsVerInfo, esi

invoke wsprintf, ADDR szOsVerInfoTmp,/
ADDR szFormat4OsVer, OsVer.dwMajorVersion,/
OsVer.dwMinorVersion, OsVer.dwBuildNumber

invoke lstrcat, ADDR szOsVerInfo, ADDR szOsVerInfoTmp
invoke lstrcat, ADDR szOsVerInfo, ADDR OsVer.szCSDVersion
mov edi, OFFSET szOsVerInfo
mov esi, MB_OK OR MB_ICONINFORMATION
.else
mov edi, OFFSET szGetOsInfoFail
mov esi, MB_OK OR MB_ICONWARNING
.endif

invoke MessageBox, NULL, edi, addr szMsgBoxTitle, esi

invoke ExitProcess,NULL

end start

到命令行,把我们自己定义的stub连接进来

命令是:

/masm32/bin/link /stub:<filename.exe> /subsystem:windows <objectname.obj>

本例中使用的命令是:

/masm32v6/WORKS/my_stub>/masm32/bin/link /stub:stub.exe /subsystem:windows stubdemo.obj

尽管会看到下面的警告信息,但程序仍然是可以正常运行的。

Microsoft (R) Incremental Linker Version 5.12.8078
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

stub.exe : warning LNK4060: stub file missing full MS-DOS header; rebuild stub with /KNOWEAS 16-bit LINK option

分享到:
评论

相关推荐

    Masm32使用指南

    ### Masm32使用指南详解 #### 一、概述 Masm32 是一套用于 Windows 平台的 32 位汇编语言开发工具,它不仅提供了编译器、链接器等基本工具,还包含了丰富的库文件以及文档资料,非常适合初学者入门汇编语言编程。...

    Masm32使用教程

    - **新建源文件**:在QEditor中使用`File -&gt; New`或相应的快捷键新建一个文件,然后指定文件名和扩展名(例如:TEST.ASM)。需要注意的是,根据不同的需求,文件扩展名可能有所不同(如.RC用于资源文件)。 ##### 3...

    masm32v11r免安装文件

    2. `uetxt.bin`、`ueint.bin`、`qeint.bin`、`qetxt.bin`:这些可能是MASM32中的二进制库文件,它们包含了预编译的函数或代码段,供程序员在项目中调用。 3. `topgun.chm`:这是Microsoft的帮助文件格式,可能包含了...

    MASM32 SDK

    在汇编编程领域,MASM32 SDK是一个广泛使用的工具包,尤其对于新手和经验丰富的开发者来说,它都是一个非常实用的平台。 **1. MASM32解释** MASM,全称Microsoft Macro Assembler,是由微软公司开发的一种宏汇编器...

    masm32安装缺少的lib库文件

    在给出的压缩包文件名列表中,除了kernel32.Lib和User32.Lib,还有其他一些重要的库文件,如AdvAPI32.Lib(提供高级Windows API功能,如注册表操作)、masm32.lib(可能是MASM32自己的库,包含汇编语言相关的帮助...

    masm32位汇编及指令集

    在编写汇编语言时,还需要注意变量和标号的命名规范,以及如何在子程序中使用局部变量和参数。同时,需要掌握如何使用条件测试语句和循环语句来控制程序的流程。 总而言之,MASM 32位汇编及指令集的知识点十分丰富...

    masm32绿色版

    在使用MASM32时,首先需要将解压后的文件夹添加到系统路径中,确保命令行可以找到汇编器和相关工具。然后,可以使用MASM32的编译器(ml.exe)来编译源代码,链接器(link.exe)将编译后的对象文件链接成可执行文件。...

    64位系统可用 masm masm32 汇编工具

    标题 "64位系统可用 masm masm32 汇编工具" 提到的是在Windows 8 64位操作系统环境下使用的汇编语言编译工具,主要包括两个组件:ML.exe 和 MASM32。这里我们将深入探讨这两个组件以及它们在汇编编程中的角色。 1. ...

    masm32 v8(win32 asm)

    这个版本是MASM32系列的一个重要迭代,它在早期版本的基础上进行了改进和增强,为开发者提供了更丰富的功能和更友好的开发体验。 MASM(Microsoft Macro Assembler)是微软公司推出的一种宏汇编器,它是Windows平台...

    MASM32汇编语言

    MASM32是一款针对32位操作系统的汇编语言开发工具,它在底层编程领域具有重要的地位,尤其对于那些需要高效、精确控制硬件资源的开发者来说,MASM32是他们的首选。汇编语言是一种低级编程语言,它直接对应于计算机的...

    masm32软件 win32汇编 MASM32是面向WIN32程序开发的

    MASM32是面向WIN32程序开发的,MASM611是面向DOS的,MASM32不使用中断调用了,而是使用微软的应用程序开发接口API和其他高级开发语言差不多了。而MASM611才是使用中断。 解压后大约15M 而压缩后才3.4M 分享学习的...

    masm32 sdk nmake

    masm32 SDK 软件包,一些工具的集合,很棒!

    MASM32批处理命令

    ::使用方法:将.asm源文件拖到此批处理文件上,在源文件目录生成.exe文件 ::错误提示: ::1.Masm32编译器地址存在同名程序 ::2.compile或link出错 set Masm32Dir=E:\Program Files\masm32 cd /d %Masm32Dir%\bin ...

    MASM32v11版本中kernel32.inc和Kernel32.lib修正版。

    MASM32 V11版本中的kernel32.inc和Kernel32.lib中的Module32First / Module32Next and Process32First / Process32Next这两对函数信息存在bug。按照Microsoft MSDN,这两对函数的ANSI版本不是Module32FirstA / ...

    masm32 (v10)

    ### 使用MASM32 v10进行开发 1. **安装**:在压缩包文件中,`install.exe`是安装程序。运行该程序,按照向导提示进行安装,过程中会将必要的文件和组件部署到系统中。 2. **启动IDE**:安装完成后,可以从开始菜单...

    汇编工具masm32

    描述中提到MASM32在Win7环境下兼容,这意味着它可能不支持最新的Windows操作系统特性,但对于学习和开发32位Windows应用来说已经足够。由于汇编语言的性质,用户需谨慎处理代码以确保安全,避免缓冲区溢出等常见...

    masm32汇编手册

    2. **MASM32工具集**:详述MASM32套件中的各种工具,如汇编器(ml.exe)、链接器(link.exe)、宏汇编器等,以及它们的使用方法和参数设置。 3. **32位编程模型**:解释Windows 32位程序的内存模型,如段选择子、...

    MASM32.zip

    在MASM32环境下,开发者编写汇编程序通常会使用汇编源代码文件(扩展名为.asm)。源代码中,程序员用指令来描述计算任务,如数据移动、算术运算和流程控制等。MASM32的汇编器负责将这些源代码翻译成机器码,然后链接...

    Win10系统VS2022开发环境中X86Win32汇编MASM32环境配置和一些.docx

    在Win10系统中配置VS2022开发环境,以便使用MASM32进行X86 Win32汇编开发。以下是详细的配置过程和一些需要注意的知识点: 一、安装VS2022 首先,需要安装VS2022,下载Community版本即可。 二、安装MASM32 下载...

Global site tag (gtag.js) - Google Analytics