电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

IDA的通用解压插件使用和原理

11页
  • 卖家[上传人]:ni****g
  • 文档编号:482531021
  • 上传时间:2023-11-08
  • 文档格式:DOC
  • 文档大小:559.50KB
  • / 11 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 1、使用IDA的通用解压插件从4.9版开始,IDA就集成了Universal PE Unpacker通用解压插件,其源代码可以在IDA Pro SDK中找到。这个小教程将会演示如何使用这个插件,并简单介绍其内部工作原理。一个压缩的应用程序下面是当我们执行这个可执行程序的运行结果:非常简单的程序,但是,如果我们使用IDA来打开它,会出现下面的警告提示:IDA检测到异常的输入段,并提示我们文件可能被压缩了如果我们看一下它的输入表窗口,我们就会发现:我们的程序只导入了kernel32.dll中的3个函数。我们可以看到在加压缩壳的程序种常用到的2个动态链接库函数LoadLibraryA和GetProcAddress,它们通常用于恢复程序的输入表。使用通用PE Universal Unpacker在插件的子菜单种选择Universal PE unpacker,开始解压:你会看到插件的选项对话框:在这个对话框中,我们可以配置一个的地址范围,当程序运行到这个区域(原始的程序入口点区域),它会挂起程序的执行。你也可以指定一个文件用于保存解压的资源。按过确定按钮后,插件开始运行,它启动了我们的程序,并自己解

      2、压,直到它运行到我们设定的地址范围内。这时解压已经结束,依照对话框中的提示,我们保存了当前的内存快照。你会注意到,我们遇到了两个断点,这个我们最后再去讨论它。为了重新构造原始的程序输入表,插件创建了一个新段:解压完成后,我们在start()函数处可以看到更多我们熟悉的代码结构。我们还可以进一步改进,让这个反汇编结果尽可能的更完美一些!使用签名如果我们查看解压后的程序的字符串窗口,我们可以看出我们的程序是使用Virsual C+编译的,我们可以应用相应的FLIRT(快速库识别恢复技术)的库签名。应用签名库后,最终的反汇编结果如下:是不是更好了!插件分析下面我们仔细研究一下这个插件,看它是如何使用SDK的调试API来完成这些工作的。主要的操作就是启动这个进程,然后根据调试器捕捉到的一些事件,进行相应的处理,直到我们确认程序已经完全被解压。我们先设定一个句柄用于接收调试器的事件,并启动这个程序直到它到达入口点。if ( !hook_to_notification_point(HT_DBG, callback, NULL) )warning(Could not hook to notifica

      3、tion pointn);return;/ Lets start the debuggerif ( !run_to(inf.beginEA) )warning(Sorry, could not start the process);unhook_from_notification_point(HT_DBG, callback, NULL);事件将会被送到我们声明的句柄,定义如下:static int idaapi callback(void * /*user_data*/,int notification_code,va_list va)switch ( notification_code )case dbg_process_start:.case dbg_library_load:.case dbg_run_to:.case dbg_bpt:.case dbg_trace:.case dbg_process_exit:.return 0;当我们通过一个函数run_to()来开始我们的进程时,我们将会收到一个相应的事件dbg_run_to,它表示run_to()命令被正确的执行。现在我

      4、们来到压缩文件的入口点,在GetProcAddress()这个函数上设定一个断点,(假定这个解压代码在重构原始输入表之前结束):case dbg_run_to: / Parameters: thread_id_t tiddbg-stopped_at_debug_event(true);gpa = get_name_ea(BADADDR, kernel32_GetProcAddress);.else if( !add_bpt(gpa) )bring_debugger_to_front();warning(Sorry, can not set bpt to kernel32.GetProcAddress);goto FORCE_STOP;else+stage;set_wait_box(Waiting for a call to GetProcAddress();continue_process();break;当程序运行到GetProcAddress()断点,我们收到一个dbg_bpt事件,我们可以从堆栈中提取出这个地址,然后删除这个断点,并在返回地址设定第二个断点,以便能在GetProc

      5、Address()函数返回时立刻中止。case dbg_bpt: / A user defined breakpoint was reached./ Parameters: thread_id_t tid/ ea_t breakpoint_ea/*tid_t tid =*/ va_arg(va, tid_t);ea_t ea = va_arg(va, ea_t);.if ( ea = gpa )regval_t rv;if ( get_reg_val(esp, &rv) )ea_t esp = rv.ival;invalidate_dbgmem_contents(esp, 1024);ea_t ret = get_long(esp);.if ( !del_bpt(gpa) | !add_bpt(ret) )error(Can not modify breakpoint);还记得我们之前在运行解压插件时碰到的两个断点吗?中断在0x7C80AC28和0x00040C68D,第一个是我们的GetProcAddress()断点,而第而个是在返回地址上的断点。在下面的反汇编窗口中,你可以看到进入

      6、GetProcAddress()断点的那个调用指令,现在我们要继续运行直到解压程序恢复了程序寄存器的原始内容,然后跳到解压后的程序的真实入口点:我们在第二个断点之后开始单步跟踪,直到指令执行到我们之前设定的地址范围。del_bpt(ea);if ( !is_library_entry(ea) )deb(IDA_DEBUG_PLUGIN, %a: reached unpacker code, switching to trace moden,ea);enable_step_trace(true);.set_wait_box(Waiting for the unpacker to finish);elsewarning(%a: bpt in library code, ea); / how can it be?add_bpt(gpa);在每一步指令执行时,我们判断其地址是否在我们之前设定的范围之内。如果我们运行到了那个区域,重新分析这些解压后的代码,调整入口点,重建输入表,保存资源然后最后来一张内存快照!case dbg_trace: / A step occured (one instr

      7、uction was executed). This event/ notification is only generated if step tracing is enabled./ Parameter: none/*tid_t tid =*/ va_arg(va, tid_t);ea_t ip = va_arg(va, ea_t);if ( oep_area.contains(ip) )/ stop the trace modeenable_step_trace(false);/ reanalyze the unpacked codeset_wait_box(Reanalyzing the unpacked code);do_unknown_range(oep_area.startEA, oep_area.endEA, false);auto_make_code(ip);noUsed(oep_area.startEA, oep_area.endEA);auto_mark_range(oep_area.startEA, oep_area.endEA, AU_FINAL);/ mark the programs entry pointmove_entry(ip);set_wait_box();.set_wait_box(Recreating the import table);invalidate_dbgmem_config();.create_impdir();set_wait_box(Storing resources to resource.res);if ( resfile0 != 0 )extract_resource(resfile);set_wait_box();if ( take_memory_snapshot(true) )goto FORCE_STOP;这样,就在IDA数据库中得到了进程的内存映像,我们可以象通常那样来分析这些解压后的代码了。现在就去看看那些在SDK中的源代码吧!去了解一下这个插件的所有实现细节。风暴 2007-09-29 QQ:719110750

      《IDA的通用解压插件使用和原理》由会员ni****g分享,可在线阅读,更多相关《IDA的通用解压插件使用和原理》请在金锄头文库上搜索。

      点击阅读更多内容
    最新标签
    监控施工 信息化课堂中的合作学习结业作业七年级语文 发车时刻表 长途客运 入党志愿书填写模板精品 庆祝建党101周年多体裁诗歌朗诵素材汇编10篇唯一微庆祝 智能家居系统本科论文 心得感悟 雁楠中学 20230513224122 2022 公安主题党日 部编版四年级第三单元综合性学习课件 机关事务中心2022年全面依法治区工作总结及来年工作安排 入党积极分子自我推荐 世界水日ppt 关于构建更高水平的全民健身公共服务体系的意见 空气单元分析 哈里德课件 2022年乡村振兴驻村工作计划 空气教材分析 五年级下册科学教材分析 退役军人事务局季度工作总结 集装箱房合同 2021年财务报表 2022年继续教育公需课 2022年公需课 2022年日历每月一张 名词性从句在写作中的应用 局域网技术与局域网组建 施工网格 薪资体系 运维实施方案 硫酸安全技术 柔韧训练 既有居住建筑节能改造技术规程 建筑工地疫情防控 大型工程技术风险 磷酸二氢钾 2022年小学三年级语文下册教学总结例文 少儿美术-小花 2022年环保倡议书模板六篇 2022年监理辞职报告精选 2022年畅想未来记叙文精品 企业信息化建设与管理课程实验指导书范本 草房子读后感-第1篇 小数乘整数教学PPT课件人教版五年级数学上册 2022年教师个人工作计划范本-工作计划 国学小名士经典诵读电视大赛观后感诵读经典传承美德 医疗质量管理制度 2
    关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
    手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
    ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.