IDC腳本編寫demo

爲了自動到被調試點,不用每次手動跟過去,所以使用腳本,下面是使用例子,以後的改改就好

// @file oci_test_on_vs2010.idc
// @brief debug for oci_test_on_vs2010.exe

#include <idc.idc>

#define PROG_FOR_DEBUG "oci_test_on_vs2010.exe"
#define MY_IDC_VER "IDC for " PROG_FOR_DEBUG " v1.0.0.1"
#define LINE_80 "--------------------------------------------------------------------------------"
#define MY_CONDITION_FOR_STARTING_THE_IDC "use ida load object program\n" \
    "clear all breakpoint\n" \
    "make sure F2 break on do_oci_task() :: OCIStmtExecute()\n" \
    "F9 run program\n" \
    "F7 into OCIStmtExecute_0 proc near\n" \
    "F8 step to \"jmp     cs:__imp_OCIStmtExecute\"\n" \
    "F2 breakpoint on \"jmp     cs:__imp_OCIStmtExecute\"\n" \
    "then load oci_test_on_vs2010.idc"

    /*
    .text:00007FF778194D6A OCIStmtExecute_0 proc near              ; CODE XREF: do_oci_task(OCIEnv *,OCIServer *,OCIError *,OCISvcCtx *,OCISession *)+213↑p
    .text:00007FF778194D6A jmp     cs:__imp_OCIStmtExecute // when run here, can load oci_test_on_vs2010.idc
    .text:00007FF778194D6A OCIStmtExecute_0 endp
    */

#define REG_IP "RIP"

// sub function must declare befoe main()
static fn_show_offset_addr(str_tip, ull_addr_now, ull_addr_offset)
{
    auto ull_addr_rc;

    ull_addr_rc = ull_addr_now + ull_addr_offset;
    msg("offset addr 0x%X : %s\r\n",  ull_addr_rc, str_tip);

    return ull_addr_rc;
}

static fn_f7()
{
    StepInto();
    wait_for_next_event(WFNE_SUSP | WFNE_CONT, -1);
}

static fn_f8()
{
    StepOver();
    wait_for_next_event(WFNE_SUSP | WFNE_CONT, -1);
}

static fn_go()
{
    wait_for_next_event(WFNE_SUSP | WFNE_CONT, -1);
}

static fn_show_current_line_info()
{
    auto l_addr;
    auto str_name;
    auto str_dasm_code;

    l_addr = GetRegValue(REG_IP);
    str_name = Name(l_addr);
    str_dasm_code = generate_disasm_line(l_addr, GENDSM_FORCE_CODE);

    msg("%s\n", LINE_80);
    msg("0x%X : %s :: %s\n", l_addr, str_name, str_dasm_code);
}

static fn_get_current_dasm_code()
{
    auto l_addr;
    auto str_dasm_code;

    l_addr = GetRegValue(REG_IP);
    str_dasm_code = generate_disasm_line(l_addr, GENDSM_FORCE_CODE);

    return str_dasm_code;
}

static fn_get_current_addr()
{
    auto l_addr;

    l_addr = GetRegValue(REG_IP);

    return l_addr;
}

static fn_show_help()
{
    auto i_index;

    // clear debug output area
    for (i_index = 0; i_index < 25; i_index++) {
        msg("\n");
    }

    msg("%s\n", LINE_80);
    msg("%s\n", MY_IDC_VER);
    msg("debug for %s\n", PROG_FOR_DEBUG);
    msg("%s\n", MY_CONDITION_FOR_STARTING_THE_IDC);
    msg("%s\n", LINE_80);
}

static fn_add_bp(l_addr)
{
    add_bpt(l_addr);
}

static fn_remove_bp(l_addr)
{
    del_bpt(l_addr);
}

static main()
{
    auto l_addr;
    auto l_addr_tmp;
    auto str_dasm_code;

    fn_show_help();
    fn_show_current_line_info();

    str_dasm_code = fn_get_current_dasm_code();
    if (str_dasm_code != "jmp     cs:__imp_OCIStmtExecute") {
        msg("error!!!\n");
        fn_show_current_line_info();
    } else {
        msg("ok : debug now, will go to oran11_nioqrc() :: call    near ptr oran11_nsbrecv\n");
        msg("please wait a moment ...\n");

        // step 1
        fn_f8();

        // step 2
        l_addr = fn_get_current_addr();
        l_addr = fn_show_offset_addr("call    rax", l_addr, 0xb5);
        fn_add_bp(l_addr);
        fn_go();
        fn_remove_bp(l_addr);
        fn_f7();
        fn_show_current_line_info();

        // step 3
        l_addr = fn_get_current_addr();
        l_addr = fn_show_offset_addr("call    near ptr oraclient11_kpuexec", l_addr, 0x41);
        fn_add_bp(l_addr);
        fn_go();
        fn_remove_bp(l_addr);
        fn_f7();
        fn_show_current_line_info();

        // step 4
        l_addr = fn_get_current_addr();
        l_addr = fn_show_offset_addr("call    near ptr oraclient11_kpurcsc", l_addr, 0x2621);
        fn_add_bp(l_addr);
        fn_go();
        fn_remove_bp(l_addr);
        fn_f7();
        fn_show_current_line_info();

        // step 5
        l_addr = fn_get_current_addr();
        l_addr = fn_show_offset_addr("call    near ptr oraclient11_upirtrc", l_addr, 0x91);
        fn_add_bp(l_addr);
        fn_go();
        fn_remove_bp(l_addr);
        fn_f7();
        fn_show_current_line_info();

        // step 6
        l_addr = fn_get_current_addr();
        l_addr = fn_show_offset_addr("oraclient11.dll:0000000003C9AF0D call    near ptr unk_3CB4B9E", l_addr, 0x0000000003B0AF0D - 0x0000000003B0AE96);
        fn_add_bp(l_addr);
        fn_go();
        fn_remove_bp(l_addr);
        fn_f7();
        fn_show_current_line_info();

        // step 7
        l_addr = fn_get_current_addr();
        l_addr = fn_show_offset_addr("oraclient11.dll:0000000003B25213 call    qword ptr [rax+20h]", l_addr, 0x0000000003B25213 - 0x0000000003B24B9E);
        fn_add_bp(l_addr);
        fn_go();
        fn_remove_bp(l_addr);
        fn_f7();
        fn_show_current_line_info();

        // step 8
        l_addr = fn_get_current_addr();
        l_addr_tmp = l_addr;
        l_addr = fn_show_offset_addr("oran11.dll:0000000003D185F5 call    r14", l_addr, 0x0000000003D185F5 - 0x0000000003D185C0);
        fn_add_bp(l_addr);
        fn_go();
        fn_remove_bp(l_addr);
        fn_f8();
        fn_show_current_line_info();

        // step 9
        // call r14 要經過2次才行, 然後f7進去
        l_addr = l_addr_tmp;
        l_addr = fn_show_offset_addr("oran11.dll:0000000003D185F5 call    r14", l_addr, 0x0000000003D185F5 - 0x0000000003D185C0);
        fn_add_bp(l_addr);
        fn_go();
        fn_remove_bp(l_addr);
        fn_f7();
        fn_show_current_line_info();

        // step 10
        l_addr = fn_get_current_addr();
        l_addr = fn_show_offset_addr("oracommon11.dll:000000000442DA6B call    qword ptr [rsi+10h]", l_addr, 0x000000000442DA6B - 0x000000000442D496);
        fn_add_bp(l_addr);
        fn_go();
        fn_remove_bp(l_addr);
        fn_f7();
        fn_show_current_line_info();

        // step 11
        // 到地方了, 對需要調試的地址下最後的斷點
        l_addr = fn_get_current_addr();
        l_addr = fn_show_offset_addr("oran11.dll:00000000049044C6 call    near ptr oran11_nsbsend", l_addr, 0x00000000049044C6 - 0x000000000490438A);
        fn_add_bp(l_addr);

        l_addr = fn_get_current_addr();
        l_addr = fn_show_offset_addr("oran11.dll:0000000004904595 call    near ptr oran11_nsbrecv", l_addr, 0x0000000004904595 - 0x000000000490438A);
        fn_add_bp(l_addr);

        l_addr = fn_get_current_addr();
        l_addr = fn_show_offset_addr("oran11_nsbsend pure data : oran11.dll:00000000054A4506 mov     [rbx+20h], rcx", l_addr, 0x00000000054A4506 - 0x00000000054A438A);
        fn_add_bp(l_addr);

        fn_go();
        fn_show_current_line_info();

        // over, 用腳本一鍵到達調試地點的任務結束
        // 已經對多處要調試的點,都下好了斷點
        // 已經運行到了其中一個斷點上,停住了,等待調試
        msg("please debug, nice to meet you :)\n");
    }
}
// @file oci_test_on_vs2010.idc
// @brief debug for oci_test_on_vs2010.exe

#include <idc.idc>

#define REG_IP "RIP"

// sub function must declare befoe main()
static fn_show_offset_addr(str_tip, ull_addr_now, ull_addr_offset)
{
    auto ull_addr_rc;

    ull_addr_rc = ull_addr_now + ull_addr_offset;
    msg("offset addr 0x%X : %s\r\n",  ull_addr_rc, str_tip);

    return ull_addr_rc;
}

static fn_f7()
{
    StepInto();
    wait_for_next_event(WFNE_SUSP | WFNE_CONT, -1);
}

static fn_f8()
{
    StepOver();
    wait_for_next_event(WFNE_SUSP | WFNE_CONT, -1);
}

static fn_f9()
{
    wait_for_next_event(WFNE_SUSP | WFNE_CONT, -1);
}

static fn_show_current_line_info()
{
    auto l_addr;
    auto str_name;
    auto str_dasm_code;

    l_addr = GetRegValue(REG_IP);
    str_name = Name(l_addr);
    str_dasm_code = generate_disasm_line(l_addr, GENDSM_FORCE_CODE);

    //msg("%s\n", LINE_80);
    msg("0x%X : %s :: %s\n", l_addr, str_name, str_dasm_code);
}

static fn_get_current_dasm_code()
{
    auto l_addr;
    auto str_dasm_code;

    l_addr = GetRegValue(REG_IP);
    str_dasm_code = generate_disasm_line(l_addr, GENDSM_FORCE_CODE);

    return str_dasm_code;
}

static fn_get_current_addr()
{
    auto l_addr;

    l_addr = GetRegValue(REG_IP);

    return l_addr;
}

static fn_show_help()
{
    auto i_index;

    // clear debug output area
    for (i_index = 0; i_index < 25; i_index++) {
        msg("\n");
    }

}

static fn_add_bp(l_addr)
{
    add_bpt(l_addr);
}

static fn_del_bp(l_addr)
{
    del_bpt(l_addr);
}

static runto(l_addr)
{
	fn_add_bp(l_addr);
	fn_f9();
	fn_del_bp(l_addr);
}

static main()
{
	//step1 fork
	runto(0x40FD40);
	RAX=0;
	fn_f8();
	
	//step2 jmp
	runto(0x4102AF);
	ZF=1;
	fn_f8();
	
	//step3 fork
	runto(0x41F5E2);
	RAX=0;
	fn_f8();
	
	//step4 sleep
	runto(0x411C2D);
	RDI=0;

	//step5 int3
	fn_f8();
	fn_f9();
	
	//step6 uuid
	//fn_add_bp(0x413210);
	runto(0x41320B);
	
	//fn_f7();


}

 

發佈了168 篇原創文章 · 獲贊 17 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章