1. 程式人生 > 其它 >IDA ,ida pro的 IDC 指令碼語言教程列表

IDA ,ida pro的 IDC 指令碼語言教程列表

該程式在 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 - 成功 }