吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 13017|回复: 28
收起左侧

[原创] IDA学习经验和实战记录--手过花指令(2)

  [复制链接]
涛之雨 发表于 2019-1-5 15:13
本帖最后由 涛之雨 于 2019-1-8 19:03 编辑

直接从CSDN搬过来,阅读体验不是很好,
也可以点击》这里《 阅读原文。
上一次因为图片挂了,导致阅读效果欠佳,在此说声抱歉,
这次也是。。。。。抱歉(已@H大。。。)
目前CSDN在审核,所以吾爱是首发哈哈{:301_988:}
本来准备在考完期末考试后,慢慢学习,然后发出来。
结果一上论坛,看到H大的回复。。。。
赶紧我就过来学习、发帖了{:301_971:}
H大久等了。。。抱歉。我也是现学现来写记录
自己也不是很会

===========================正文开始========================

希望大家可以看一下例子,然后下载一下原文件,自己尝试去花。
我听完教程,感觉好像是会了,其实自己发记录的时候,还是有些地方会做错,所以希望大家也能练习一下
最好能举一反三。。。。(好吧。目前还没有呢。。)

上一节(接着上一次自学)

声明

再次声明:上一次和这一次IDA的去花指令不是教程,
只是本人在学习IDA看教程时做的一些笔记和思考
方法版权归原教程发布者所有。
原发布者网站:(现在已经挂了,就不发出来了)

附上一次链接

CSDN链接(推荐)
吾爱破解论坛(已重排版)

分析原理

花指令的干扰

因为在花指令的干扰下,无法用OD、IDA之类的软件直接分析
(当然可以通过大神已经编写好的插件脱花指令,如果你强调这个没有去花插件快、便捷。那么恭喜你,可以直接关掉页面了,这篇不适合你,这只是为了一起分析、一起学习、一起进步,而不是教你如何使用去花插件。)
所以我们要手动分析,
但是问题来了,就算手动分析了一处,两处,三处,一个软件里花可能有上百出处,
就算全部分析完了,也需要一处处去掉
所以需要写一个脚本,帮助自己快速分析花指令。所以需要写一个脚本,帮助自己快速分析花指令。
那么如何让程序自动识别和去掉花指令呢

去掉花指令

原理

花指令原理之前已经说过了,就是来回的跳转,然后插入一些垃圾机器码比如单独看起来无效的E8、EB、0等等垃圾数据,使反编译软件无法分析,那么就要分两步去除花指令了。
第一步:

  • 识别哪些是有用的数据,哪些是垃圾数据。

第二步:

  • 把垃圾数据用nop(0x90h)填充。
如何识别垃圾数据

1-1.png
如图1-1,是上次手动修改的内容
就是有花导致反汇编无法继续分析的一个地方,

1-2.png
如图1-2
经过过程梳理(看蓝色箭头)
发现其实中间所有的部分都可以nop掉,并不影响程序的运行,
1-3.png
如图1-3,
依次按D将其转换为数据

同理,分析出需要nop掉的下面的部分
(有人会说灰色部分也是花对吧。但是这个不影响反编译,而且为了匹配更多的花,舍弃一句无关紧要的代码不去除也无伤大雅。当然也可以通过和我一起学习后,自己DIY,这个都好说)
1-4.png

1-5.png
如图1-4、1-5、1-6
注:红色是标签,蓝色箭头是跳转流程,绿色是有用的代码
依然整理一下
1-4-1.png

1-5-1.png
图1-4-1、1-5-1、1-6-1
(1-6和1-6-1貌似忘记截图了,懒得补了,反正下面有整理的代码)
代码整理如下:

==================1=======================
E8                byte_4560FA     db 0E8h
0A                                db  0Ah
00                                db    0
00                                db    0
00                                db    0
E8                                db 0E8h
EB                byte_456100     db 0EBh
0C                                db  0Ch
00                                db    0
00                                db    0
E8                                db 0E8h
F6                                db 0F6h
FF                                db 0FFh
FF                                db 0FFh
FF                                db 0FFh
==================2=======================
74                                db 74h
04                                db    4
75                                db 75h
02                                db    2
EB                                db 0EBh
02                                db    2
EB                                db 0EBh
01                                db    1
81                                db 81h
==================3=======================
50                byte_45613A     db 50h
E8                                db 0E8h
02                                db    2
00                                db    0
00                                db    0
00                                db    0
29                                db 29h
5A                                db 5Ah
58                                db 58h
6B                                db 6Bh
C0                                db 0C0h
03                                db    3
E8                                db 0E8h
02                                db    2
00                                db    0
00                                db    0
00                                db    0
29                                db 29h
5A                                db 5Ah
83                                db 83h
C4                                db 0C4h
04                                db    4
==================4=======================
EB                                db 0EBh
01                                db    1
68                                db 68h
EB                                db 0EBh
02                                db    2
CD                byte_4561A6     db 0CDh
20                                db  20h
EB                                db 0EBh
01                                db    1
E8                                db 0E8h
如何修改程序数据

这就需要用到IDA的脚本功能
详情见下面详细讲解

认识IDC

什么是IDC

既然IDA是神器,那么一定能自动批量去花对吧。
这句话既是对的又是错的
因为IDC本身不能去花,但是它有用户自己写代码的接口
IDA的脚本很像C语言,但是有一定出入

IDA的脚本语言叫做IDC,之所以取这个名称,可能是因为它的语法与C语言的语法非常相似。
> 引自浅谈IDA脚本在漏洞挖掘中的应用

可以参考的文件

IDA权威指南电子书)(去水印重制) 下载 提取码: qcqc
二维码如下 qrcode.jpg

第一次使用IDC(大佬请略过)

ida可能很多人都知道,也都用过,但是估计有不少人都是第一次使用IDC(包括本人)
首先打开文件(File)-脚本命令(script commend)(注:版本不同可能名称也不同)
2-1.png

如图2-1
当然也可以通过底下的快捷按钮【python】
改成IDC后直接输入。
当然,也可以直接用py。
这里仅做介绍。
2-2.png
如图2-2

输入Message("我是涛之雨。来自吾爱破解和CSDN论坛。");
run一下,就会出现效果
(图中忘记打分号了,懒得补了*2)
2-3.png
如图2-3

至于为什么打Message而不是MsgBox之类的,很简单,这个不是直接调用系统api,而是IDC封装好的api。

修改

既然使用过IDC了就可以直接修改数据了
在系统中,数据和命令都是一样的,只是一个是用来执行的,一个是用来读写的,没有本质上的区别
刚才的图中,除了script commend,还有一个script file(注:版本不同可能名称也不同)
commend和下面的那个文本框是为了短小简单快捷的脚本而设的
像我们下面要干的事的是这个解决不了的
所以要点script file打开.idc文件来执行复杂的命令

使用IDC修改

为了使脚本更加简单,就没必要把所有的垃圾call和jmp都给nop掉(当然,要是直接都给nop掉也没关系)

相关函数介绍

FindBinary:搜索数组

IDA Pro 权威指南 :图3-1
3-1.png
从一个给定的地址搜索一个指定的数据项
3-3.png
eg.图3-2
注:下文中的传入参数0X03一般都是写的这个(教程上是这么说的)

MinEA:给定的地址

3-2.png

PatchByte、PatchWord、PatchDword:打补丁

3-4.png
3-5.png
3-6.png
IDA Pro 权威指南 :图3-4、3-5、3-6

实现(脚本源码)

注意:保存格式为.idc

#include <idc.idc>
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);
        }
}

去花测试

效果

4-0.png
去花之前  

4-1.png

4-2.png
去花之后

存在的问题

  1. 有些显示是90,有些显示是nop,不美观

  2. nop太多,不便于分析nop太多,不便于分析

    改进

  3. 使用MakeUnknown把刚才修改的地方隐藏

  4. 调用IDA的内置函数AnalyzeArea,从最小地址到最大地址重新分析调用IDA的内置函数AnalyzeArea,从最小地址到最大地址重新分析

4-3.png
成品演示截图

刚刚学习ida,很多东西都不会,没事,大家可以一起学习么。。。。
注:在不同的程序中,花的类型不一定相同,这也是OD去花插件的弊端,因为花随时可以更新,但是插件不一定能及时更新
因此使用还需要参考哲学思想:

具体问题具体分析

下一节:(估计要二十几号更新)代码的修复

目标:

把部分花没去干净的地方去掉,

而且IDA的分析有些地方是有问题的

比如sub eax,[esp-8+arg_4]
其实就是sub eax,esp

去掉多余的跳转

之前部分多余的跳转被当做有效的部分保留下来了,
但是其实是花没去干净,过几句指令就是一个跳转,很不方便分析,而且会影响分析速度。
下一节见吧

附:最终成品代码

#include <idc.idc>
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);
        }

}
1-4-2.png
3-5.png

免费评分

参与人数 12吾爱币 +17 热心值 +12 收起 理由
cunzher + 3 + 1 用心讨论,共获提升!
笙若 + 1 + 1 谢谢@Thanks!
xdsec_bin + 1 + 1 用心讨论,共获提升!
chenjingyes + 1 + 1 :lol很适合逆向初学者 谢谢楼主分享
空不了 + 1 + 1 热心回复!
QuanMax + 1 我很赞同!
boyving + 2 + 1 谢谢@Thanks!
独行风云 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
姚小宝 + 2 + 1 热心回复!
pxhb + 1 + 1 谢谢@Thanks!
CrazyNut + 3 + 1 用心讨论,共获提升!
zhgkay + 1 + 1 用心讨论,共获提升!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 涛之雨 发表于 2019-1-7 00:56
xdsec_bin 发表于 2019-1-7 00:17
谢谢分享~
话说我个人觉得脚本可以用IDA python写,官方给的文档也挺全的,而且学py的人也比较多

嗯。这只是我看教程时写的笔记。顺手分享一下。
py的话确实是很多人会用的但是不知道怎么在ida里调用(因为教程里没说。)
或许以后会尝试用py写一下。然后也分享出来。(只是或许。。。)
也欢迎大佬写一下然后分享啊
 楼主| 涛之雨 发表于 2019-1-8 12:17
lunaaero 发表于 2019-1-7 19:13
好像有些图看不了

如果图有问题截图回复。
看到我会重新传图片的
然后可以点csdn的链接看
说实话还不是很熟悉论坛的md编辑器。
 楼主| 涛之雨 发表于 2019-1-5 15:14
不是妖精 发表于 2019-1-5 15:17
技术贴    谢谢

灰灰creak 发表于 2019-1-5 15:20
好多图都挂了嘛,能修复下么
噗呲就进了丶 发表于 2019-1-5 15:25
66666666666666666666666
 楼主| 涛之雨 发表于 2019-1-5 15:26
灰灰creak 发表于 2019-1-5 15:20
好多图都挂了嘛,能修复下么

360截图1617111297140130.png
???我这边看到的是正常的啊

点评

[attachimg]1334303[/attachimg]大佬看不到图  详情 回复 发表于 2019-1-5 15:29
CrazyNut 发表于 2019-1-5 15:29
涛之雨 发表于 2019-1-5 15:26
???我这边看到的是正常的啊

QQ截图20190105152908.png 大佬看不到图
陌小全 发表于 2019-1-5 15:34
好像有些图看不了
 楼主| 涛之雨 发表于 2019-1-5 15:40

已经用论坛的上传图片功能手动插入了
马上去找H大诉苦。。。。
gxkyrftx 发表于 2019-1-5 15:43
写的很好,优秀或者精华,嘻嘻嘻
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 10:36

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表