该程序在 0x40 段创建一个段并注释 BIOS 数据区。您应该加载并执行此文件以查看 BIOS 数据区变量的名称。
//------------------------------------------------ ------------------------- 静态 CW(关闭,名称,cmt){ 自动 x; x = [ 0x40, 关闭 ]; MakeWord(x); MakeName(x,name); MakeRptCmt(x,cmt); }
//------------------------------------------------ ------------------------- 静态 CD(关闭,名称,cmt){ 自动 x; x = [ 0x40, 关闭 ]; MakeDword(x); MakeName(x,name); MakeRptCmt(x,cmt); }
//------------------------------------------------ ------------------------- 静态CB(关闭,名称,cmt){ 自动 x; x = [ 0x40, 关闭 ]; MakeByte(x); MakeName(x,name); MakeRptCmt(x,cmt); }
//------------------------------------------------ ------------------------- 静态 CmtBdata() { CW(0x000,"com_port_1","第一个串行I/O端口的基本I/O地址"); CW(0x002,"com_port_2","第二个串行I/O端口的基本I/O地址"); CW(0x004,"com_port_3","第三个串行I/O端口的基本I/O地址"); CW(0x006,"com_port_4","第4个串行I/O端口的基本I/O地址");
CW(0x008,"prn_port_1","第一个并行 I/O 端口的基本 I/O 地址"); CW(0x00A,"prn_port_2","第二个并行I/O端口的基本I/O地址"); CW(0x00C,"prn_port_3","第三个并行I/O端口的基本I/O地址"); CW(0x00E,"prn_port_4","第4个并行I/O端口的基本I/O地址");
CW(0x010,"equip_bits", "设备安装信息位\n" "15 14 13 12 11 10 9 8\n" "\ / 游戏 \ /\n" "# RS-232 的打印端口#\n" "端口 0-3 使用端口 0-4\n" "\n" "7 6 5 4 3 2 1 0\n" "\ / \ / \ / 数学 |\n" "# 视频模式 RAM uP 无\n" “磁盘 - 启动时 00=16K dsk\n” "ettes 00=EGA/VGA 01=32K 驱动器\n" " 1-4 01=CGA-40 10=48K 如果 0\n" “如果位 10=CGA-80 11=64K\n” "0 = 1 11=MDA-80 (旧电脑)\n" "\n" "注意:位 13=PC 笔记本电脑上的调制解调器\n" " 位 2 = MCA 和其他鼠标上的鼠标");
CB(0x012,“manufactr_test”,“制造测试字节\n” "在测试模式下,位 0 = 1\n" "MCA 系统使用其他位\n" " 在 POST 操作期间"); CW(0x013,"base_ram_size", "基本内存大小 (0-640)");
CB(0x015,"mtest_scratchpad", "[AT] {制造测试便笺}\n" "[Compaq Deskpro 386] 以前的扫描码"); CB(0x016,"error_codes", "[AT] {制造测试便笺}\n" "[PS/2 Mod 30] {BIOS 控制标志}\n" "[Compaq Deskpro 386] 按键响度 (00h-7Fh)"); CB(0x017,“keybd_flags_1”,“键盘标志位\n” " 7 6 5 4 3 2 1 0\n" “ins-cap num scrl alt ctl lef rig\n” "sert --toggles--- --shifts down--"); CB(0x018,“keybd_flags_2”,“键盘标志位\n” " 7 6 5 4 \n" "插入大写数字滚动\n" "------现在郁闷------\n" "\n" " 3 2 1 0\n" " 暂停系统左右\n" " 锁定请求 -alt-down-"); CB(0x019,“keybd_alt_num”,“Alt-nnn 键盘工作区”); CW(0x01A,"keybd_q_head", "指向键盘缓冲区中下一个字符的指针"); CW(0x01C,"keybd_q_tail", "指向键盘缓冲区中第一个空闲槽的指针"); CW(0x01E,"keybd_queue", "键盘循环缓冲区"); MakeArray([0x40,0x01E], 16); CB(0x03E,“dsk_recal_stat”,“重新校准软盘驱动器位\n” " 3 2 1 0\n" “驱动器 3 驱动器 2 驱动器 1 驱动器 0\n” "\n" "位 7 = 中断标志"); CB(0x03F,"dsk_motor_stat", "电机运行状态&磁盘写入\n" " 位 7=1 磁盘写入正在进行中\n" " 位 6&5 = 驱动器选择 0 到 3\n" " 3 2 1 0\n" " drive-3 drive-2 drive-1 drive-0\n" " --------- 1=电机开启-----------"); CB(0x040,"dsk_motor_timer", "电机定时器,在 0,关闭电机"); CB(0x041,"dsk_ret_code", "控制器返回码\n" " 00h = 好的\n" " 01h = 错误的命令或参数\n" " 02h = 找不到地址标记\n" " 03h = 无法写入,受保护的 dsk\n" " 04h = 未找到扇区\n" " 08h = DMA 溢出\n" " 09h = DMA 尝试超过 64K 限制\n" " 10h = 磁盘读取错误 CRC\n" " 20h = 控制器故障\n" " 40h = 搜索失败\n" " 80h = 超时,无响应");
CB(0x042,"dsk_status_1", "状态字节-磁盘控制器芯片\n" " 注意:从\n 返回 7 个信息字节 " 控制器保存在这里。参考\n" " 到 NEC uPD 765 芯片手册\n" " 具体信息,视情况而定\n" " 在之前发出的命令上。"); CB(0x043,“dsk_status_2”,“”); CB(0x044,“dsk_status_3”,“”); CB(0x045,“dsk_status_4”,“”); CB(0x046,“dsk_status_5”,“”); CB(0x047,“dsk_status_6”,“”); CB(0x048,“dsk_status_7”,“”);
CB(0x049,"video_mode", "当前显示模式"); CW(0x04A,"video_columns", "列数"); CW(0x04C,"video_buf_size", "以字节为单位的视频缓冲区大小\n" " 注意:大小可以四舍五入为\n" " 最近的 2K 边界。对于\n" " 示例,80x25 模式=4000 字节,\n" " 但值可能是 4096。"); CW(0x04E,"video_pageoff", "活动的视频页面偏移\n" " 页,从当前\n 开始" "视频片段。"); CW(0x050,"vid_curs_pos0", "光标位置页 0\n" “第 15-8 位=行,第 7-0 位=列”); CW(0x052,"vid_curs_pos1", "光标位置第 1 页\n" “第 15-8 位=行,第 7-0 位=列”); CW(0x054,"vid_curs_pos2", "光标位置第 2 页\n" “第 15-8 位=行,第 7-0 位=列”); CW(0x056,"vid_curs_pos3", "光标位置第 3 页\n" “第 15-8 位=行,第 7-0 位=列”); CW(0x058,"vid_curs_pos4", "光标位置第 4 页\n" “第 15-8 位=行,第 7-0 位=列”); CW(0x05A,"vid_curs_pos5", "光标位置第 5 页\n" “第 15-8 位=行,第 7-0 位=列”); CW(0x05C,"vid_curs_pos6", "光标位置第 6 页\n" “第 15-8 位=行,第 7-0 位=列”); CW(0x05E,"vid_curs_pos7", "光标位置第 7 页\n" “第 15-8 位=行,第 7-0 位=列”); CW(0x060,"vid_curs_mode", "活动光标,开始和结束行\n" " 起始行的第 12 到 8 位\n" "第 4 到 0 位用于结束行"); CB(0x062,“视频页面”,“当前页面”); CW(0x063,"video_port", "视频控制器基本 I/O 地址"); CB(0x065,“video_mode_reg”,“硬件模式寄存器位”); CB(0x066,"video_color", "CGA 模式下的颜色设置"); CW(0x067,"gen_use_ptr", "通用偏移指针"); CW(0x069,"gen_use_seg", "通用段指针"); CB(0x06B,“gen_int_occurd”,“发生未使用的中断\n” " 值保存\n 的 IRQ 位 7-0" "发生的中断"); CW(0x06C,"timer_low", "定时器,低字,每 55 毫秒 cnts"); CW(0x06E,"timer_high", "定时器,高字"); CB(0x070,"timer_rolled", "定时器溢出,设置为 1 时\n" “已经超过 24 小时”); CB(0x071,"keybd_break", "如果按下中断键则设置位 7"); CW(0x072,"warm_boot_flag", "启动(重置)类型\n" " 1234h=热启动,无内存测试\n" " 4321h=启动并保存内存"); CB(0x074,"hdsk_status_1", "硬盘状态\n" " 00h = 好的\n" " 01h = 错误的命令或参数\n" " 02h = 找不到地址标记\n" " 03h = 无法写入,受保护的 dsk\n" " 04h = 未找到扇区\n" " 05h = 重置失败\n" " 07h = 活动失败\n" " 08h = DMA 溢出\n" " 09h = DMA 尝试超过 64K 限制\n" " 0Ah = 坏扇区标志\n" " 0Bh = 删除坏道\n" " 0Dh = 错误的扇区数,格式\n" " 0Eh = 删除了控制数据地址\n" "标记\n" " 0Fh = DMA 超出限制\n" " 仲裁级别\n" " 10h = 错误的 CRC 或 ECC,磁盘读取\n" " 11h = 错误的 ECC 更正数据\n" " 20h = 控制器故障\n" " 40h = 搜索失败\n" " 80h = 超时,无响应\n" " AAh = 未准备好\n" " BBh = 发生错误,未定义\n" " CCh = 写错误,选择了 dsk\n" " E0h = 错误寄存器 = 0\n" " FFh = 磁盘检测失败"); CB(0x075,"hdsk_count", "硬盘驱动器数量"); CB(0x076,“hdsk_head_ctrl”,“头部控制(仅限XT)”); CB(0x077,"hdsk_ctrl_port", "硬盘控制端口(仅限XT)"); CB(0x078,"prn_timeout_1", "倒数计时器等待打印机\n" “响应(打印机 1)”); CB(0x079,"prn_timeout_2", "倒数计时器等待打印机\n" “响应(打印机 2)”); CB(0x07A,"prn_timeout_3", "倒数计时器等待打印机\n" “响应(打印机 3)”); CB(0x07B,"prn_timeout_4", "倒数计时器等待打印机\n" “响应(打印机 4)”); CB(0x07C,"rs232_timeout_1", "倒数计时器等待 RS-232 (1)"); CB(0x07D,"rs232_timeout_2", "倒数计时器等待 RS-232 (2)"); CB(0x07E,"rs232_timeout_3", "倒数计时器等待 RS-232 (3)"); CB(0x07F,"rs232_timeout_4", "倒数计时器等待 RS-232 (4)"); CW(0x080,"keybd_begin", "指向keybd队列开始的指针"); CW(0x082,"keybd_end", "Ptr to end of keyboard queue"); CB(0x084,"video_rows", "显示的字符行数 - 1"); CW(0x085,"video_pixels", "每个字符的像素数 * 8"); CB(0x087,"video_options", "显示适配器选项\n" " 位 7 = 清除 RAM\n" " 位 6,5 = 适配器上的内存\n" " 00 - 64K\n" " 01 - 128K\n" " 10 - 192K\n" " 11 - 256K\n" " 位 4 = 未使用\n" " 如果 EGA/VGA 处于活动状态,则位 3 = 0\n" " 位 2 = 等待显示启用\n" " 位 1 = 1 - 单声道监视器\n" " = 0 - 彩色监视器\n" " bit 0 = 0 - 处理光标,CGA"); CB(0x088,"video_switches", "从适配器切换设置位\n" " 位 7-4 = 功能连接器\n" " 位 3-0 = 选项开关"); CB(0x089,"video_1_save", "视频保存区 1-EGA/VGA 控制\n" " 位 7 = 200 行模式\n" " 位 6,5 = 未使用\n" " 位 4 = 400 行模式\n" " 位 3 = 没有调色板加载\n" " 位 2 = 单声道监视器\n" " 位 1 = 灰度\n" " 位 0 = 未使用"); CB(0x08A,"video_2_save", "视频保存区 2");
CB(0x08B,"dsk_data_rate", "磁盘的最后数据速率\n" " 位 7 & 6 = 00 表示 500K 位/秒\n" " = 01 表示 300K 位/秒\n" " = 10 表示 250K 位/秒\n" " = 11 为 1M 位/秒\n" “第 5 位和第 4 位 = 步进率” "操作开始时的费率\n" " 位 3 & 2 = 00 表示 500K 位/秒\n" " = 01 表示 300K 位/秒\n" " = 10 表示 250K 位/秒\n" " = 11 为 1M 位/秒"); CB(0x08C,"hdsk_status_2", "硬盘状态"); CB(0x08D,"hdsk_error", "硬盘错误"); CB(0x08E,"hdsk_complete", "当硬盘控制器的\n" " 任务完成,这个字节是\n" “设置为 FFh(来自中断 76h)”); CB(0x08F,"dsk_options", "磁盘控制器信息\n" " 位 6 = 1 驱动器 1 类型已确定\n" " 5 = 1 Drv 1 是多速率\n" " 4 = 1 Drv 1 更改检测\n" " 2 = 1 驱动器 0 类型已确定\n" " 1 = 1 Drv 0 是多速率\n" " 0 = 1 Drv 0 变化检测"); CB(0x090,"dsk0_media_st", "软盘驱动器 0 的媒体状态\n" " 7 6 5 4\n" " 数据传输速率为两种媒体\n" " 00=500K bit/s 步长已知\n" " 01=300K 比特/秒\n" " 10=250K 比特/秒\n" " 11=1M 比特/秒\n" " 3 2 1 0\n" " 未使用 ----- 驱动器状态-----\n" " 位软盘驱动器状态\n" " 000= 360K in 360K, ?\n" " 001= 360K in 1.2M, ?\n" " 010= 1.2M in 1.2M, ?\n" " 011= 360K 中的 360K,好的\n" " 100 = 360K in 1.2M, ok\n" " 101= 1.2M 中的 1.2M,好的\n" " 111= 720K 中的 720K,好的\n" " 或 1.44M 中的 1.44M\n" “(状态未用于 2.88)”); CB(0x091,"dsk1_media_st", "软盘驱动器 1 的介质状态\n" “(见 dsk0_media_st)”); CB(0x092,"dsk0_start_st", "驱动器 0 的启动状态"); CB(0x093,"dsk1_start_st", "驱动器 1 的启动状态"); CB(0x094,“dsk0_柱面”,“驱动器 0 的当前轨道号”); CB(0x095,“dsk1_柱面”,“驱动器 1 的当前轨道号”); CB(0x096,"keybd_flags_3", "特殊键盘类型和模式\n" " bit 7 读取键盘 ID\n" " 最后 6 个字符是第一个 ID 字符\n" " 5 强制数字锁\n" " 4 101/102 键键盘\n" " 3 右 alt 键向下\n" " 2 右 ctrl 键下\n" " 1 E0h 隐藏代码最后\n" " 0 E1h 隐藏代码最后"); CB(0x097,“keybd_flags_4”,“键盘标志(高级keybd)\n” " 7 6 5 4 3 2 1 0\n" "xmit char Resend Ack \ /\n" “错误是 ID Rec'd Rec'd LED”);
CW(0x098,"timer_waitoff", "等待完成标志的 Ptr 偏移量"); CW(0x09A,"timer_waitseg", "Ptr 段等待完成标志"); CW(0x09C,"timer_clk_low", "定时器低字,1 微秒时钟"); CW(0x09E,"timer_clk_high", "定时器高字"); CB(0x0A0,"timer_clk_flag", "定时器标志 00h = 后确认\n" " 01h = 忙\n" " 80h = 已发布"); CB(0x0A1,"lan_bytes", "局域网字节(7)"); MakeArray([0x40,0xA1],7);
CD(0x0A8,"video_sav_tbl", "指向更多保存表的指针\n" "视频系统指针\n" " 保存表格\n" " 偏移类型指针\n" “ 啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊\n” " 0 dd 视频参数\n" " 4 dd Parms 保存区域\n" " 8 dd Alpha 字符集\n" " 0Ch dd 图形字符集\n" " 10h dd 第二次保存 ptr 表\n" " 14h dd 保留 (0:0)\n" " 18h dd 保留 (0:0)\n" "\n" " 第二个保存表(来自上面的 ptr)\n" " 偏移类型函数和指针\n" “ 啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊\n” "该表中有 0 个 dw 字节\n" " 2 dd 组合码 tbl\n" " 6 dd 第二个字母字符集\n" " 0Ah dd 用户调色板 tbl\n" " 0Eh dd 保留 (0:0)\n" " 12h dd 保留 (0:0)\n" " 16h dd 保留 (0:0)"); CW(0x0CE,"days_since1_80", "自 1-Jan-1980 计数器以来的天数"); MakeArray(0x4AC,0xCE-0xAC); }
//------------------------------------------------ ------------------------- 静态主(){ 如果(!SegCreate(0x400,0x4D0,0x40,0,0,2)){ Warning("无法创建 BIOS 数据段。"); 返回; } SegRename(0x400,"bdata"); SegClass(0x400,"BIOSDATA"); CmtBdata(); } 如果以下列方式启动 IDA 反汇编程序,则该程序会强制 IDA 反汇编程序处于“批处理”分析模式:ida -Sanalysis.idc 文件。
静态主(){ 自动 x,y;
Message("正在等待自动分析结束...\n"); 等待();
x = SegStart(BeginEA()); y = SegEnd(BeginEA()); Message("正在分析区域 %08X - %08X...\n",x,y); 分析面积(x,y); 等待(); // 等待代码段分析完成
Message("\n\n------ 正在创建输出文件.... --------\n"); WriteTxt("ida.out",0,0xFFFFFFFF); Message("全部完成,正在退出...\n"); 退出(0);// 退出操作系统,错误代码 0 - 成功 }