IDC脚本:模拟手工操作到达被调试点

前言

对cm进行调试,手工进行可以了(已经找到了被调试点,也能从应用层最初的断点一步一步的爬过去),因为地址随机化,导致每次都要按照调试笔记,去执行一组循环操作(F2, F9, F7 or F8),经过10几步才到达被调试点, 用时至少5分钟。如果要反复调试一个点,有时手一抖,过了调试点,先将自己搞疯了…。

本来想着好久没搞IDA脚本,先用C语言写一个小程序,输入地址,算出偏移,先去IDA中g那个算好的地址。用了一两天,被折磨的终于忍不住了。

还是要写个IDA脚本, 逃不掉的。
用IDC写起来简单,就花了2个小时,写了一个。
写完用起来,一身轻松。
只需要对应用层的API下第一个断点,F9跑起,F8到了第三方DLL, 载入脚本,一键就到了被调试点。

运行效果

--------------------------------------------------------------------------------
IDC for oci_test_on_vs2010.exe v1.0.0.1
debug for oci_test_on_vs2010.exe
use ida load object program
clear all breakpoint
make sure F2 break on do_oci_task() :: OCIStmtExecute()
F9 run program
F7 into OCIStmtExecute_0 proc near
F8 step to "jmp cs:__imp_OCIStmtExecute"
F2 breakpoint on "jmp cs:__imp_OCIStmtExecute"
then load oci_test_on_vs2010.idc
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
0x7FF778194D6A : OCIStmtExecute_0 :: jmp     cs:__imp_OCIStmtExecute
ok : debug now, will go to oran11_nioqrc() :: call    near ptr oran11_nsbrecv
please wait a moment ...
PDBSRC: loading symbols for 'D:\app\LostSpeed\product\11.2.0\client_1\bin\oci.dll'...
offset addr 0x18000443D : call    rax

PDBSRC: loading symbols for 'D:\app\LostSpeed\product\11.2.0\client_1\bin\oraclient11.dll'...
--------------------------------------------------------------------------------
0x3294B00 : oraclient11_OCIStmtExecute :: xchg    ax, ax
offset addr 0x3294B41 : call    near ptr oraclient11_kpuexec

7FF920BC42C0: thread has started (tid=9072)
--------------------------------------------------------------------------------
0x33DAD30 : oraclient11_kpuexec :: xchg    ax, ax
offset addr 0x33DD351 : call    near ptr oraclient11_kpurcsc

--------------------------------------------------------------------------------
0x345B292 : oraclient11_kpurcsc :: xchg    ax, ax
offset addr 0x345B323 : call    near ptr oraclient11_upirtrc

--------------------------------------------------------------------------------
0x34FAE96 : oraclient11_upirtrc :: xchg    ax, ax
offset addr 0x34FAF0D : oraclient11.dll:0000000003C9AF0D call    near ptr unk_3CB4B9E

--------------------------------------------------------------------------------
0x3514B9E : loc_3514B9E :: xchg    ax, ax
offset addr 0x3515213 : oraclient11.dll:0000000003B25213 call    qword ptr [rax+20h]

PDBSRC: loading symbols for 'D:\app\LostSpeed\product\11.2.0\client_1\bin\oran11.dll'...
--------------------------------------------------------------------------------
0x49B85C0 : oran11_nioqwa :: push    r15
offset addr 0x49B85F5 : oran11.dll:0000000003D185F5 call    r14

--------------------------------------------------------------------------------
0x49B85F8 :  :: test    eax, eax
offset addr 0x49B85F5 : oran11.dll:0000000003D185F5 call    r14

PDBSRC: loading symbols for 'D:\app\LostSpeed\product\11.2.0\client_1\bin\oracommon11.dll'...
--------------------------------------------------------------------------------
0x477D496 : oracommon11_ttcdrv :: xchg    ax, ax
offset addr 0x477DA6B : oracommon11.dll:000000000442DA6B call    qword ptr [rsi+10h]

--------------------------------------------------------------------------------
0x499438A : oran11_nioqrc :: push    r15
offset addr 0x49944C6 : oran11.dll:00000000049044C6 call    near ptr oran11_nsbsend

offset addr 0x4994595 : oran11.dll:0000000004904595 call    near ptr oran11_nsbrecv

offset addr 0x4994506 : oran11_nsbsend pure data : oran11.dll:00000000054A4506 mov     [rbx+20h], rcx

--------------------------------------------------------------------------------
0x49944C6 :  :: call    near ptr oran11_nsbsend
please debug, nice to meet you :)

IDC脚本

// @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");
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值