第五章--过程
5.3 本书附带的链接库
Irvine32.lib
过程 | 说明 |
---|---|
CloseFile | 关闭之前已经打开的磁盘文件 |
Clrscr | 清除控制台窗口,并将光标置于左上角 |
CreateOutputFile | 为输出模式下的写操作创建一个新的磁盘文件 |
Crlf | 在控制台窗口中写一个行结束的序列 |
Delay | 程序执行暂停指定的 n 毫秒 |
DumpMem | 以十六进制形式,在控制台窗口写一个内存块 |
DumpRegs | 以十六进制形式显示 EAX、EEX、ECX、EDX、ESI、EDI、EBP、ESP、EFLAGS 和 EIP 寄存器。也显示最常见的 CPU 状态标志位 |
GetCommandTail | 复制程序命名行参数(称为命令尾)到一个字节数组 |
GetDateTime | 从系统获取当前日期和时间 |
GetMaxXY | 返回控制台窗口缓冲器的行数和列数 |
GetMseconds | 返回从午夜开始经过的毫秒数 |
GetTextColor | 返回当前控制台窗口的前景色和背景色 |
Gotoxy | 将光标定位到控制台窗口内指定的位置 |
IsDigit | 如果 AL 寄存器中包含了十进制数字(0-9)的 ASCII 码,则零标志位置 1 |
MsgBox | 显示一个弹出消息框 |
MsgBoxAsk | 在弹出消息框中显示 yes/no 问题 |
OpenlnputFile | 打开一个已有磁盘文件进行输入操作 |
ParseDecimal32 | 将一个无符号十进制整数字符串转换为 32 位二进制数 |
Parselnteger32 | 将一个有符号十进制整数字符串转换为 32 位二进制数 |
Random32 | 在 0〜FFFFFFFFh 范围内,生成一个 32 位的伪随机整数 |
Randomize | 用一个值作为随机数生成器的种子 |
RandomRange | 在特定范围内生成一个伪随机整数 |
ReadChar | 等待从键盘输入一个字符,并返回该字符 |
ReadDec | 从键盘读取一个无符号 32 位十进制整数,用回车符结束 |
ReadFromFile | 将一个输入磁盘文件读入缓冲区 |
ReadHex | 从键盘读取一个 32 位十六进制整数,用回车符结束 |
Readlnt | 从键盘读取一个有符号 32 位十进制整数,用回车符结束 |
ReadKey | 无需等待输入即从键盘输入缓冲区读取一个字符 |
ReadString | 从键盘读取一个字符串,用回车符结束 |
SetTextColor | 设置控制台输出字符的前景色和背景色 |
Str_compare | 比较两个字符串 |
Str_copy | 将源字符串复制到目的字符串 |
Str_length | 用 EAX 返回字符串长度 |
Str_trim | 从字符串删除不需要的字符 |
Str_ucase | 将字符串转换为大写字母 |
WaitMsg | 显示信息并等待按键操作 |
WriteBin | 用 ASCII 二进制格式,向控制台窗口写一个无符号 32 位整数 |
WriteBinB | 用字节、字或双字格式向控制台窗口写一个二进制整数 |
WriteChar | 在控制台窗口写一个字符 |
WriteDec | 用十进制格式,向控制台窗口写一个无符号 32 位整数 |
WriteHex | 用十六进制格式,向控制台窗口写一个 32 位整数 |
WriteHexB | 用十六进制格式,向控制台窗口写一个字节、字或双字整数 |
Writelnt | 用十进制格式,向控制台窗口写一个有符号 32 位整数 |
WriteStackFrame | 向控制台窗口写当前过程的堆栈帧 |
WriteStackFrameName | 向控制台窗口写当前过程的名称和堆栈帧 |
WriteString | 向控制台窗口写一个以空字符结束的字符串 |
WriteToFile | 将缓冲区内容写入一个输出文件 |
WriteWindowsMsg | 显示一个字符串,包含 MS-Windows 最近一次产生的错误 |
5.3.2 过程的描述
Clrsrc
TITLE TEST PROJECT INCLUDE Irvine32.inc .code main PROC call DumpRegs;显示寄存器值 call Clrscr;清屏 call WaitMsg exit main ENDP END main
CreateOutputFile
TITLE TEST PROJECT INCLUDE Irvine32.inc .data filename BYTE "newfile.txt",0 handle DWORD ? ;通过EDX传递要创建的文件名的偏移地址 ;通过EAX返回是否创建成功 .code main PROC mov edx,OFFSET filename call CreateOutputFile cmp eax,INVALID_HANDLE_VALUE je file_error mov hadle,eax call WaitMsg exit main ENDP END main
Random32
TITLE TEST PROJECT INCLUDE Irvine32.inc .code main PROC call Randomize;初始化种子值,使用当前的时间作为种子值 mov ecx,10 S: call Random32;产生随机数,并保存到eax call DumpRegs call WaitMsg call Clrscr loop S call WaitMsg exit main ENDP END main
DumpMem(显示一块内存区域)
TITLE TEST PROJECT INCLUDE Irvine32.inc .data array DWORD 65,66,67,68,69,70,71,72 .code main PROC mov esi,OFFSET array ;起始地址 mov ecx,LENGTHOF array ;元素数目 mov ebx,TYPE array ;格式双子,设置元素尺寸 call DumpMem call WaitMsg exit main ENDP END main
GetMaxXY:返回控制台窗口缓冲区的大小
TITLE TEST PROJECT INCLUDE Irvine32.inc .data rows BYTE ? cols BYTE ? .code main PROC call GetMaxXY mov rows,dh;存放缓存区的行数 mov cols,dl;存放缓存区的列数 mov esi,OFFSET rows ;起始地址 mov ecx,LENGTHOF rows ;元素数目 add ecx,LENGTHOF cols mov ebx,TYPE rows ;格式双子,设置元素尺寸 call DumpMem call WaitMsg exit main ENDP END main
MsgBox
TITLE TEST PROJECT INCLUDE Irvine32.inc ;EBX传递标题栏中的偏移地址 ;EDX传递要显示内容的偏移地址 .data caption db "Dialog Title",0 content BYTE "Hello! This is a flag!", 0dh,0ah;0dh--回车,0ah--换行 BYTE "flag{I_L0ve_CTF!}",0 .code main PROC mov ebx,OFFSET caption mov edx,OFFSET content call MsgBox call WaitMsg exit main ENDP END main
MsgBoxAsk:带有是否选项
TITLE TEST PROJECT INCLUDE Irvine32.inc ;EBX传递标题栏中的偏移地址 ;EDX传递要显示内容的偏移地址 .data caption db "Dialog Title",0 content BYTE "Hello! This is a flag!", 0dh,0ah;0dh--回车,0ah--换行 BYTE "flag{I_L0ve_CTF!}",0 .code main PROC mov ebx,OFFSET caption mov edx,OFFSET content call MsgBoxAsk call WaitMsg exit main ENDP END main
OpenInputFile
TITLE TEST PROJECT INCLUDE Irvine32.inc .data filename BYTE "myfile.txt",0 val DWORD 1 errorinfo BYTE "Open file Error!",0 .code main PROC mov edx,OFFSET filename ;edx包含要打开文件的偏移地址 call OpenInputFile cmp eax,INVALID_HANDLE_VALUE je file_error mov val,eax ;eax包含有效的文件句柄 mov esi,OFFSET val mov ecx,LENGTHOF val mov ebx,TYPE val call DumpMem call WaitMsg exit file_error: mov ebx,0 mov edx,OFFSET errorinfo call MsgBox call WaitMsg exit main ENDP END main
ParseDecimal32
TITLE TEST PROJECT INCLUDE Irvine32.inc ;将无符号整数字符串转换为一个32位的二进制数 ;非数字字符前面的所有数字都将被转换 ;开头空格将被忽略 .data buffer BYTE "8193" bufsize = ($ -buffer) .code main PROC mov edx,OFFSET buffer;edx传递字符串偏移地址 mov ecx,bufsize;ecx传递字符串大小 call ParseDecimal32 call DumpRegs call WaitMsg exit main ENDP END main
Random32
TITLE TEST PROJECT INCLUDE Irvine32.inc ;伪随机数 randVal DWORD ? .code main PROC call Random32 mov randVal,eax mov esi,OFFSET randVal mov ecx,LENGTHOF randVal mov ebx,TYPE randVal call DumpMem call WaitMsg exit main ENDP END main
Randomize
TITLE TEST PROJECT INCLUDE Irvine32.inc ;伪随机数 .data randVal DWORD ? .code main PROC call Randomize;时间种子 mov ecx,10 Flag: push ecx call Random32 mov randVal,eax mov esi,OFFSET randVal mov ecx,LENGTHOF randVal mov ebx,TYPE randVal call DumpMem call WaitMsg call Clrscr pop ecx loop Flag exit main ENDP END main
ReadKey
AL中包含按键的ASCII或者0(0表示特殊按键)
AH返回按键的扫描码
DX返回按键的虚拟键码
EBX返回键盘的标志位
EAX和EDX高16位将被破坏
TITLE TEST PROJECT INCLUDE Irvine32.inc ;伪随机数 .data char BYTE ? .code main PROC S: mov eax,10;10毫秒等待 call Delay call ReadKey jz S mov char,AL mov esi,OFFSET char mov ecx,LENGTHOF char mov ebx,TYPE char call DumpMem call WaitMsg exit main ENDP END main
ReadString
TITLE TEST PROJECT INCLUDE Irvine32.inc .data buffer BYTE 21 DUP(0) bytecount DWORD ? .code main PROC mov edx,OFFSET buffer;输入缓存区 mov ecx,SIZEOF buffer;指定最多读取的字符数 call ReadString;读取输入字符串 mov bytecount,eax;保存读取字符的数量 mov esi,OFFSET bytecount mov ecx,LENGTHOF bytecount mov ebx,TYPE bytecount call DumpMem call WaitMsg exit main ENDP END main
SetTextColor
SetTextColor 过程(仅在 Irvine32 链接库中)设置输出文本的前景色和背景色。调用 SetTextColor 时,给 EAX 分配一个颜色属性。下列预定义的颜色常数都可以用于前景色和背景色:
black = 0 | red = 4 | gray = 8 | lightRed = 12 |
blue = 1 | magenta = 5 | lightBlue = 9 | light Magenta = 13 |
green = 2 | brown = 6 | light Green = 10 | yellow = 14 |
cyan = 3 | lightGray = 7 | lightCyan = 11 | white = 15 |
TITLE TEST PROJECT INCLUDE Irvine32.inc .code main PROC mov eax,red + (blue * 16);蓝底红字 call SetTextColor call WaitMsg exit main ENDP END main
5.3.4 本节习题
1.ReadString
2.WaitMsg
3.
mov eax,700
call Delay
4.WriteDec
5.GotoXY
... ...
11
TITLE TEST PROJECT INCLUDE Irvine32.inc .data Info BYTE "Please input you ID:",0ah,0dh,0 buffer BYTE 19 DUP(?) bufsize = ($ - buffer) .code main PROC mov edx,OFFSET Info call WriteString mov edx,OFFSET buffer mov ecx,bufsize call ReadString call WriteString call WaitMsg exit main ENDP END main