首页
社区
课程
招聘
又说 IDA 边界修改插件
2004-11-18 22:04 19470

又说 IDA 边界修改插件

2004-11-18 22:04
19470
精华 5中提到 IDA工具使用都是关于修改边界的,试了试其中 bpx大虾的插件法,总不成功。检查后发现
是 IDA升级后提供的 api已经通过序列号调用,再无MakeBorder这样的 id 了。于是试着从应有一定“可
持续性”出发,编了一个有相似功能的插件(其主要思想是替换 ExtTextOutA),不当之处请各位大侠多
多指正。就算是抛砖引玉吧。

以下是这个插件的主要代码,包括:
自编两个函数 Checker 和 BorderPatcher,两个修改了内容的函数 init 和 term
[color=#0000D0]static[/color] [color=#0000D0]char[/color] *strSeg={[color=#808080]"; ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※  "[/color]};
[color=#0000D0]static[/color] [color=#0000D0]char[/color] *strSub={[color=#808080]"; 〓〓〓〓〓〓〓  S U B R O U T I N E 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓  "[/color]};
[color=#0000D0]static[/color] [color=#0000D0]char[/color] *strBor={[color=#808080]"; ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━  "[/color]};
[color=#0000D0]static[/color] [color=#0000D0]char[/color] *strStar={[color=#808080]" ; ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆  "[/color]};

[color=#0000D0]static[/color] bool idaapi Checker([color=#0000D0]int[/color] Para)
{
bool t;
    t=[color=#0000D0]FALSE[/color];
[color=#0000D0]_asm[/color]{
    [color=#0000D0]lodsd[/color]
    [color=#0000D0]cmp[/color] [color=#FF0000]ax[/color],203Bh
    [color=#0000D0]jnz[/color] [color=#0000D0]short[/color] retur
    [color=#0000D0]lodsd[/color]
    [color=#0000D0]cmp[/color] [color=#FF0000]eax[/color],Para
    [color=#0000D0]jnz[/color] [color=#0000D0]short[/color] retur
    [color=#0000D0]lodsd[/color]
    [color=#0000D0]cmp[/color] [color=#FF0000]eax[/color],Para
    [color=#0000D0]jnz[/color] [color=#0000D0]short[/color] retur
    }
    t=[color=#0000D0]TRUE[/color];
retur:
    [color=#0000D0]return[/color] t;
}
[color=#0000D0]static[/color] [color=#0000D0]void[/color] idaapi BorderPatcher([color=#0000D0]HDC[/color], [color=#0000D0]int[/color], [color=#0000D0]int[/color], [color=#0000D0]UINT[/color], [color=#0000D0]CONST[/color] RECT *,[color=#0000D0]LPCSTR[/color] lpstr, [color=#0000D0]UINT[/color] len, [color=#0000D0]CONST[/color] INT *)
{
[color=#0000D0]_asm[/color]{    [color=#0000D0]push[/color] [color=#FF0000]esi[/color]
        [color=#0000D0]push[/color] [color=#FF0000]edi[/color]
        [color=#0000D0]push[/color] [color=#FF0000]ecx[/color]
        [color=#0000D0]sub[/color] [color=#FF0000]esp[/color],20h
        [color=#0000D0]lea[/color] [color=#FF0000]esi[/color],[[color=#FF0000]ebp[/color]+8]
        [color=#0000D0]mov[/color] [color=#FF0000]edi[/color],[color=#FF0000]esp[/color]
        [color=#0000D0]mov[/color] [color=#FF0000]ecx[/color],8
        [color=#0000D0]rep[/color] [color=#0000D0]movsd[/color]                [color=#008000]//传递原调用Ext参数[/color]
        [color=#0000D0]mov[/color] [color=#FF0000]esi[/color], lpstr

        [color=#0000D0]cmp[/color] len,50h
        [color=#0000D0]jbe[/color] [color=#0000D0]short[/color] next_1
        [color=#0000D0]mov[/color] [[color=#FF0000]esi[/color]+12h],20h
        [color=#0000D0]jmp[/color] [color=#0000D0]short[/color] Call_ExtTextOut
next_1:
        [color=#0000D0]cmp[/color] len,40h
        [color=#0000D0]jl[/color] Call_ExtTextOut
        [color=#0000D0]lodsd[/color]
        [color=#0000D0]cmp[/color] [color=#FF0000]ax[/color], 3B20h
        [color=#0000D0]jnz[/color] [color=#0000D0]short[/color] CheckSub
        [color=#0000D0]rol[/color] [color=#FF0000]eax[/color],8
        [color=#0000D0]cmp[/color] [color=#FF0000]al[/color],0BAh
        [color=#0000D0]jnz[/color] [color=#0000D0]short[/color] next_2
        [color=#0000D0]mov[/color] byte ptr [[color=#FF0000]esi[/color]-1],20h
        [color=#0000D0]jmp[/color] Call_ExtTextOut
next_2:
        [color=#0000D0]lodsd[/color]
        [color=#0000D0]cmp[/color] [color=#FF0000]eax[/color], 0cdcdcdcdh
        [color=#0000D0]jnz[/color] [color=#0000D0]short[/color] CheckSub
        [color=#0000D0]mov[/color] [color=#FF0000]eax[/color],strStar            [color=#008000]//Title border 替换[/color]
        [color=#0000D0]jmp[/color] Patche

CheckSub:
        [color=#0000D0]mov[/color]    [color=#FF0000]esi[/color], lpstr
        [color=#0000D0]push[/color] 0DBDBDBDBh
        [color=#0000D0]call[/color] Checker
        [color=#0000D0]test[/color] [color=#FF0000]al[/color],[color=#FF0000]al[/color]
        [color=#0000D0]mov[/color]    [color=#FF0000]esi[/color], lpstr
        [color=#0000D0]jz[/color] [color=#0000D0]short[/color] CheckBor
        [color=#0000D0]mov[/color] [color=#FF0000]eax[/color],strSub            [color=#008000]//函数border 替换[/color]
        [color=#0000D0]jmp[/color] Patche

CheckBor:
        [color=#0000D0]push[/color] 0C4C4C4C4h
        [color=#0000D0]call[/color] Checker
        [color=#0000D0]test[/color] [color=#FF0000]al[/color],[color=#FF0000]al[/color]
        [color=#0000D0]jz[/color] [color=#0000D0]short[/color] CheckSeg
        [color=#0000D0]mov[/color] [color=#FF0000]eax[/color],strBor            [color=#008000]//逻辑边界替换[/color]
        [color=#0000D0]jmp[/color] Patche

CheckSeg:
        [color=#0000D0]mov[/color]    [color=#FF0000]esi[/color], lpstr
        [color=#0000D0]push[/color] 0CDCDCDCDh
        [color=#0000D0]call[/color] Checker
        [color=#0000D0]test[/color] [color=#FF0000]al[/color],[color=#FF0000]al[/color]
        [color=#0000D0]jz[/color] [color=#0000D0]short[/color] Call_ExtTextOut
        [color=#0000D0]mov[/color] [color=#FF0000]eax[/color],strSeg            [color=#008000]//段边界替换[/color]
Patche:        
        [color=#0000D0]mov[/color] [[color=#FF0000]esp[/color]+14h],[color=#FF0000]eax[/color]
Call_ExtTextOut: 
        [color=#0000D0]call[/color] ExtTextOutEntry
        [color=#0000D0]pop[/color] [color=#FF0000]ecx[/color]
        [color=#0000D0]pop[/color] [color=#FF0000]edi[/color]
        [color=#0000D0]pop[/color] [color=#FF0000]esi[/color]
    }
}
[color=#0000D0]int[/color] idaapi init([color=#0000D0]void[/color])
{
[color=#0000D0]_asm[/color]{
    [color=#0000D0]push[/color] [color=#FF0000]esi[/color]
    [color=#0000D0]push[/color] [color=#FF0000]edi[/color]
    [color=#0000D0]push[/color] [color=#FF0000]edx[/color]
    [color=#0000D0]push[/color] [color=#FF0000]ecx[/color]
    [color=#0000D0]push[/color] [color=#FF0000]eax[/color]
    [color=#0000D0]mov[/color] [color=#FF0000]edi[/color],[[color=#FF0000]ebp[/color]+4]                 [color=#008000]//得到调用返回地址(idag中)[/color]
    [color=#0000D0]mov[/color] [color=#FF0000]ecx[/color],-1
    [color=#0000D0]mov[/color] [color=#FF0000]al[/color],0e8h
    [color=#0000D0]cld[/color]
again:
    [color=#0000D0]repnz[/color] [color=#0000D0]scasb[/color]                    [color=#008000]//查找 call[/color]
    [color=#0000D0]jnz[/color] over
    [color=#0000D0]mov[/color] [color=#FF0000]edx[/color],[[color=#FF0000]edi[/color]]
    [color=#0000D0]cmp[/color] [color=#FF0000]edx[/color],200000h
    [color=#0000D0]jae[/color] [color=#0000D0]short[/color] again
    [color=#0000D0]cmp[/color] [color=#FF0000]edx[/color],0
    [color=#0000D0]jb[/color] [color=#0000D0]short[/color] again
    [color=#0000D0]lea[/color] [color=#FF0000]edx[/color],[[color=#FF0000]edi[/color]+[color=#FF0000]edx[/color]-2]            [color=#008000]//获取调用目标地址[/color]
    [color=#0000D0]cmp[/color] word ptr[[color=#FF0000]edx[/color]],25ffh            [color=#008000]//是 jmp [xxxxxxx] ?[/color]
    [color=#0000D0]jnz[/color] [color=#0000D0]short[/color] again
    [color=#0000D0]mov[/color] [color=#FF0000]edi[/color],[[color=#FF0000]edx[/color]+2]                [color=#008000]//得到 IAT[/color]
    [color=#0000D0]and[/color] [color=#FF0000]edi[/color],0fffff000h        
    [color=#0000D0]jmp[/color] [color=#0000D0]short[/color] $+7
    [color=#0000D0]call[/color] ExtTextOutA
    [color=#0000D0]call[/color] $+5
    [color=#0000D0]pop[/color] [color=#FF0000]eax[/color]
    [color=#0000D0]sub[/color] [color=#FF0000]eax[/color],9
    [color=#0000D0]add[/color] [color=#FF0000]eax[/color],[[color=#FF0000]eax[/color]]
    [color=#0000D0]mov[/color] [color=#FF0000]eax[/color],[[color=#FF0000]eax[/color]+4]                [color=#008000]//得到 ExtTextOutA RAV[/color]
    [color=#0000D0]mov[/color] [color=#FF0000]ecx[/color],800h
    [color=#0000D0]repnz[/color] [color=#0000D0]scasd[/color]                    [color=#008000]//搜索 ExtTextOutA RAV 在 IAT中的位置[/color]
    [color=#0000D0]jnz[/color] [color=#0000D0]short[/color] over
    [color=#0000D0]sub[/color] [color=#FF0000]edi[/color],4            
    [color=#0000D0]mov[/color] ExtTextOutEntry,[color=#FF0000]eax[/color]        [color=#008000]//保存 ExtTextOutA RAV[/color]
    [color=#0000D0]mov[/color] ExtTextOutIAT,[color=#FF0000]edi[/color]        [color=#008000]//保存其指针[/color]
    [color=#0000D0]mov[/color] [color=#FF0000]eax[/color],offset BorderPatcher
    [color=#0000D0]stosd[/color]                        [color=#008000]//移花接木:用 BorderPatcher替换指针[/color]
over:
    [color=#0000D0]pop[/color] [color=#FF0000]eax[/color]
    [color=#0000D0]pop[/color] [color=#FF0000]edx[/color]
    [color=#0000D0]pop[/color] [color=#FF0000]ecx[/color]
    [color=#0000D0]pop[/color] [color=#FF0000]edi[/color]
    [color=#0000D0]pop[/color] [color=#FF0000]esi[/color]
    }
  [color=#0000D0]return[/color] PLUGIN_KEEP;
}
[color=#0000D0]void[/color] idaapi term([color=#0000D0]void[/color])
{
  unhook_from_notification_point(HT_UI, sample_callback);
  set_user_defined_prefix(0, [color=#0000D0]NULL[/color]);
[color=#0000D0]_asm[/color]{
    [color=#0000D0]push[/color] [color=#FF0000]edi[/color]
    [color=#0000D0]push[/color] [color=#FF0000]eax[/color]
    [color=#0000D0]mov[/color] [color=#FF0000]eax[/color],ExtTextOutEntry
    [color=#0000D0]mov[/color] [color=#FF0000]edi[/color],ExtTextOutIAT
    [color=#0000D0]stosd[/color]                        [color=#008000]//恢复指针[/color]
    [color=#0000D0]pop[/color] [color=#FF0000]eax[/color]
    [color=#0000D0]pop[/color] [color=#FF0000]edi[/color]
    }  

}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
点赞7
打赏
分享
最新回复 (17)
雪    币: 890
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
fly 85 2004-11-18 22:08
2
0
辛苦  :D
雪    币: 392
活跃值: (909)
能力值: ( LV9,RANK:690 )
在线值:
发帖
回帖
粉丝
cyclotron 17 2004-11-18 22:08
3
0
支持!
雪    币: 266
活跃值: (269)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
jingulong 5 2004-11-18 22:15
4
0
IDA ver 4.7.0.830 plugin
附件:border.rar
雪    币: 1159
活跃值: (1700)
能力值: ( LV12,RANK:770 )
在线值:
发帖
回帖
粉丝
fxyang 19 2004-11-19 08:35
5
0
感谢!
雪    币: 323
活跃值: (579)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
springkang[DFCG 11 2004-11-19 08:59
6
0
:D 强烈支持中。。。
雪    币: 266
活跃值: (269)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
jingulong 5 2004-11-19 09:15
7
0
*bpx写成upx,赶紧改

*大伙的支持就是俺的力量,感动中 :D

*fly上班也来混
雪    币: 513
活跃值: (2228)
能力值: ( LV9,RANK:2130 )
在线值:
发帖
回帖
粉丝
loveboom 53 2004-11-19 09:29
8
0
谢谢,支持!对了,你上次的说帐号的事,解决了?
雪    币: 70
活跃值: (110)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
采臣·宁 1 2004-11-19 10:10
9
0
嗯。关键就是找到信息输出的函数。这个插件应该可以解决更高版本的问题。比较通用。
雪    币: 266
活跃值: (269)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
jingulong 5 2004-11-19 10:16
10
0
最初由 loveboom 发布
谢谢,支持!对了,你上次的说帐号的事,解决了?


重新申请了一个,谢谢哈
雪    币: 83395
活跃值: (198475)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
linhanshi 2004-11-19 13:10
11
0
支持!!!
雪    币: 2890
活跃值: (3437)
能力值: (RANK:215 )
在线值:
发帖
回帖
粉丝
china 5 2004-11-19 16:19
12
0
偶后天就要结婚了,在忙也得来给老大顶一下。
雪    币: 1159
活跃值: (1700)
能力值: ( LV12,RANK:770 )
在线值:
发帖
回帖
粉丝
fxyang 19 2004-11-19 17:27
13
0
最初由 china 发布
偶后天就要结婚了,在忙也得来给老大顶一下。

恭喜!喜糖的不能少:)
雪    币: 266
活跃值: (269)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
jingulong 5 2004-11-19 17:31
14
0
最初由 china 发布
偶后天就要结婚了......


恭喜!恭喜!恭喜!

:) :) :)
:D :D :D
雪    币: 702
活跃值: (3086)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
meilin 1 2004-11-20 08:51
15
0
谢谢,不过我的iadpro刚烧了一张盘,晕,把这个好东西丢下了,只好下次再烧一个了:)
雪    币: 2890
活跃值: (3437)
能力值: (RANK:215 )
在线值:
发帖
回帖
粉丝
china 5 2004-11-20 09:54
16
0
嘿嘿,送哪里啊,要不等你们来泰山的时候,我再补吧。
雪    币: 256
活跃值: (230)
能力值: ( LV12,RANK:770 )
在线值:
发帖
回帖
粉丝
qiweixue 19 2004-11-20 11:04
17
0
最初由 china 发布
偶后天就要结婚了,在忙也得来给老大顶一下。


你小日子活的滋润啊~

什么时候~~~~~~~;)
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
1806 2004-12-10 21:31
18
0
下一个,慢慢消化吧
游客
登录 | 注册 方可回帖
返回