精华 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直播授课