IDC脚本编写demo

11 篇文章 0 订阅

为了自动到被调试点,不用每次手动跟过去,所以使用脚本,下面是使用例子,以后的改改就好

// @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();


}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值