IDA学习经验和实战记录 |
您所在的位置:网站首页 › 什么是IDA › IDA学习经验和实战记录 |
IDA学习经验和实战记录--手过花指令(2)
上一节(接着上一次自学)声明附上一次链接
分析原理花指令的干扰去掉花指令原理如何识别垃圾数据如何修改程序数据
认识IDC什么是IDC第一次使用IDC(大佬请略过)修改
使用IDC修改相关函数介绍FindBinary:搜索数组MinEA:给定的地址PatchByte、PatchWord、PatchDword:打补丁
实现(脚本源码)
去花测试效果存在的问题改进
下一节(刚发现教程还有一课)代码的修复目标
附:最终成品代码
上一节(接着上一次自学)
声明
再次声明:上一次和这一次IDA的去花指令不是教程, 只是本人在学习IDA看教程时做的一些笔记和思考 方法版权归原教程发布者所有。 原发布者网站:(现在已经挂了,就不发出来了) 附上一次链接CSDN链接(推荐) 吾爱破解论坛(为重排版,效果不是很理想) 分析原理 花指令的干扰因为在花指令的干扰下,无法用OD、IDA之类的软件直接分析 (当然可以通过大神已经编写好的插件脱花指令,如果你强调这个没有去花插件快、便捷。那么恭喜你,可以直接关掉页面了,这篇不适合你,这只是为了一起分析、一起学习、一起进步,而不是教你如何使用去花插件。) 所以我们要手动分析, 但是问题来了,就算手动分析了一处,两处,三处,一个软件里花可能有上百出处, 就算全部分析完了,也需要一处处去掉 所以需要写一个脚本,帮助自己快速分析花指令。所以需要写一个脚本,帮助自己快速分析花指令。 那么如何让程序自动识别和去掉花指令呢 去掉花指令 原理花指令原理之前已经说过了,就是来回的跳转,然后插入一些垃圾机器码比如单独看起来无效的E8、EB、0等等垃圾数据,使反编译软件无法分析,那么就要分两步去除花指令了。 第一步: 识别哪些是有用的数据,哪些是垃圾数据。第二步: 把垃圾数据用nop(0x90h)填充。 如何识别垃圾数据
同理,分析出需要nop掉的下面的部分 (有人会说灰色部分也是花对吧。但是这个不影响反编译,而且为了匹配更多的花,舍弃一句无关紧要的代码不去除也无伤大雅。当然也可以通过和我一起学习后,自己DIY,这个都好说) 这就需要用到IDA的脚本功能 详情见下面详细讲解 认识IDC 什么是IDC既然IDA是神器,那么一定能自动批量去花对吧。 这句话既是对的又是错的 因为IDC本身不能去花,但是它有用户自己写代码的接口 IDA的脚本很像C语言,但是有一定出入 IDA的脚本语言叫做IDC,之所以取这个名称,可能是因为它的语法与C语言的语法非常相似。 引自浅谈IDA脚本在漏洞挖掘中的应用 可以参考的文件 IDA权威指南电子书)(去水印重制) 下载 提取码: qcqc 二维码如下 ida可能很多人都知道,也都用过,但是估计有不少人都是第一次使用IDC(包括本人) 首先打开文件(File)-脚本命令(script commend)(注:版本不同可能名称也不同) 输入Message("我是涛之雨。来自吾爱破解和CSDN论坛。"); run一下,就会出现效果 (图中忘记打分号了,懒得补了*2) 至于为什么打Message而不是MsgBox之类的,很简单,这个不是直接调用系统api,而是IDC封装好的api。 修改既然使用过IDC了就可以直接修改数据了 在系统中,数据和命令都是一样的,只是一个是用来执行的,一个是用来读写的,没有本质上的区别 刚才的图中,除了script commend,还有一个script file(注:版本不同可能名称也不同) commend和下面的那个文本框是为了短小简单快捷的脚本而设的 像我们下面要干的事的是这个解决不了的 所以要点script file打开.idc文件来执行复杂的命令 使用IDC修改为了使脚本更加简单,就没必要把所有的垃圾call和jmp都给nop掉(当然,要是直接都给nop掉也没关系) 相关函数介绍 FindBinary:搜索数组IDA Pro 权威指南 :图3-1
注意:保存格式为.idc #include static main() { PatchJunkCode(); } static PatchJunkCode() { auto x,FBin,ProcRange; FBin = "E8 0A 00 00 00 E8 EB 0C 00 00 E8 F6 FF FF FF"; // 目 标 = "E8 0A 00 00 00 90 EB 0C 90 90 90 90 90 90 90"; //花指令1的特征码 for (x = FindBinary(MinEA(),0x03,FBin);x != BADADDR;x = FindBinary(x,0x03,FBin)) { x=x+5; //返回的x是第一个E8的地址, //加上5是第二个E8的地址 PatchByte (x,0x90);//nop掉 x = x + 3; //00 PatchByte (x,0x90); x++; //00 E8 PatchWord (x,0x9090); x =x +2 ; //F6 FF FF FF PatchDword (x,0x90909090); } //以下同理,就不再进行分析了 FBin = "74 04 75 02 EB 02 EB 01 81"; // 目 标 = "74 04 75 02 90 90 EB 01 90"; // 花指令2的特征码 for (x = FindBinary(MinEA(),0x03,FBin);x != BADADDR;x = FindBinary(x,0x03,FBin)) { x = x + 4; //EB 02 PatchWord (x,0x9090); x = x + 4; //81 PatchByte (x,0x90); } FBin = "50 E8 02 00 00 00 29 5A 58 6B C0 03 E8 02 00 00 00 29 5A 83 C4 04"; // 目 标 = "50 E8 02 00 00 00 90 90 58 6B C0 03 E8 02 00 00 00 90 90 83 C4 04"; // 花指令3的特征码 for (x = FindBinary(MinEA(),0x03,FBin);x != BADADDR;x = FindBinary(x,0x03,FBin)) { x = x + 6;//29 5A PatchWord (x,0x9090); x = x + 11; //29 5A PatchWord (x,0x9090); } // 花指令4的特征码 FBin = "EB 01 68 EB 02 CD 20 EB 01 E8"; // 目 标 = "EB 01 90 EB 02 90 90 EB 01 90"; for (x = FindBinary(MinEA(),0x03,FBin);x != BADADDR;x = FindBinary(x,0x03,FBin)) { x = x+2; //68 PatchByte (x,0x90); x = x+3; //CD 20 PatchWord (x,0x9090); x = x+4; //E8 PatchByte (x,0x90); } } 去花测试 效果
![]() 【脚本去花指令全剧终】 注:在不同的程序中,花的类型不一定相同,这也是OD去花插件的弊端,因为花随时可以更新,但是插件不一定能及时更新 因此使用还需要参考哲学思想: 具体问题具体分析 下一节(刚发现教程还有一课)代码的修复 目标 把部分花没去干净的地方去掉,修复IDA部分地方分析的错误 IDA的分析有些地方是有问题的 比如sub eax,[esp-8+arg_4] 其实就是sub eax,esp去掉多余的跳转 之前部分多余的跳转被当做有效的部分保留下来了, 但是其实是花没去干净,过几句指令就是一个跳转,很不方便分析,而且会影响分析速度。下一节见吧 附:最终成品代码 #include static main() { auto x,FBin,ProcRange; HideJunkCode(); PatchJunkCode(); AnalyzeArea (MinEA(),MaxEA()); } static PatchJunkCode() { auto x,FBin,ProcRange; FBin = "E8 0A 00 00 00 E8 EB 0C 00 00 E8 F6 FF FF FF"; //花指令1的特征码 for (x = FindBinary(MinEA(),0x03,FBin);x != BADADDR;x = FindBinary(x,0x03,FBin)) { x=x+5; //E8 PatchByte (x,0x90); x = x + 3; //00 PatchByte (x,0x90); x++; //00 E8 PatchWord (x,0x9090); x =x +2 ; //F6 FF FF FF PatchDword (x,0x90909090); } FBin = "74 04 75 02 EB 02 EB 01 81"; // 花指令2的特征码 for (x = FindBinary(MinEA(),0x03,FBin);x != BADADDR;x = FindBinary(x,0x03,FBin)) { x = x + 4; //EB 02 PatchWord (x,0x9090); x = x + 4; //81 PatchByte (x,0x90); } FBin = "50 E8 02 00 00 00 29 5A 58 6B C0 03 E8 02 00 00 00 29 5A 83 C4 04"; // 花指令3的特征码 for (x = FindBinary(MinEA(),0x03,FBin);x != BADADDR;x = FindBinary(x,0x03,FBin)) { x = x + 6;//29 5A PatchWord (x,0x9090); x = x + 11; //29 5A PatchWord (x,0x9090); } FBin = "EB 01 68 EB 02 CD 20 EB 01 E8"; for (x = FindBinary(MinEA(),0x03,FBin);x != BADADDR;x = FindBinary(x,0x03,FBin)) { x = x+2; //68 PatchByte (x,0x90); x = x+3; //CD 20 PatchWord (x,0x9090); x = x+4; //E8 PatchByte (x,0x90); } } static HideJunkCode() { auto x,y,FBin; FBin = "E8 0A 00 00 00 E8 EB 0C 00 00 E8 F6 FF FF FF"; for (x = FindBinary(MinEA(),0x03,FBin);x != BADADDR;x = FindBinary(x,0x03,FBin)) { MakeUnknown (x,0x17,1); //x起始地址,y结束地址 y = x + 0x17; HideArea (x,y,atoa(x),atoa(x),atoa(y),-1); } FBin = "74 04 75 02 EB 02 EB 01 81"; for (x = FindBinary(MinEA(),0x03,FBin);x != BADADDR;x = FindBinary(x,0x03,FBin)) { MakeUnknown (x,0x09,1); //x起始地址,y结束地址 y = x + 0x09; HideArea (x,y,atoa(x),atoa(x),atoa(y),-1); } FBin = "50 E8 02 00 00 00 29 5A 58 6B C0 03 E8 02 00 00 00 29 5A 83 C4 04"; for (x = FindBinary(MinEA(),0x03,FBin);x != BADADDR;x = FindBinary(x,0x03,FBin)) { MakeUnknown (x,0x17,1); //x起始地址,y结束地址 y = x + 0x17; HideArea (x,y,atoa(x),atoa(x),atoa(y),-1); } FBin = "EB 01 68 EB 02 CD 20 EB 01 E8"; for (x = FindBinary(MinEA(),0x03,FBin);x != BADADDR;x = FindBinary(x,0x03,FBin)) { MakeUnknown (x,0x09,1); //x起始地址,y结束地址 y = x + 0x9; HideArea (x,y,atoa(x),atoa(x),atoa(y),-1); } } |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |