又說 IDA 邊界修改外掛

看雪資料發表於2015-11-15

精華 5中提到 IDA工具使用都是關於修改邊界的,試了試其中 bpx大蝦的外掛法,總不成功。檢查後發現
是 IDA升級後提供的 api已經通過序列號呼叫,再無MakeBorder這樣的 id 了。於是試著從應有一定“可
持續性”出發,編了一個有相似功能的外掛(其主要思想是替換 ExtTextOutA),不當之處請各位大俠多
多指正。就算是拋磚引玉吧。

以下是這個外掛的主要程式碼,包括:
自編兩個函式 Checker 和 BorderPatcher,兩個修改了內容的函式 init 和 term(編譯好的檔案下載)

程式碼:
static char *strSeg={"; ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※  "}; static char *strSub={"; 〓〓〓〓〓〓〓  S U B R O U T I N E 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓  "}; static char *strBor={"; ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━  "}; static char *strStar={" ; ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆  "}; static bool idaapi Checker(int Para) { bool t;     t=FALSE; _asm{     lodsd     cmp ax,203Bh     jnz short retur     lodsd     cmp eax,Para     jnz short retur     lodsd     cmp eax,Para     jnz short retur     }     t=TRUE; retur:     return t; } static void idaapi BorderPatcher(HDCintintUINTCONST RECT *,LPCSTR lpstr, UINT len, CONST INT *) { _asm{    push esi         push edi         push ecx         sub esp,20h         lea esi,[ebp+8]         mov edi,esp         mov ecx,8         rep movsd                //傳遞原呼叫Ext引數         mov esi, lpstr         cmp len,50h         jbe short next_1         mov [esi+12h],20h         jmp short Call_ExtTextOut next_1:         cmp len,40h         jl Call_ExtTextOut         lodsd         cmp ax, 3B20h         jnz short CheckSub         rol eax,8         cmp al,0BAh         jnz short next_2         mov byte ptr [esi-1],20h         jmp Call_ExtTextOut next_2:         lodsd         cmp eax, 0cdcdcdcdh         jnz short CheckSub         mov eax,strStar            //Title border 替換         jmp Patche CheckSub:         mov    esi, lpstr         push 0DBDBDBDBh         call Checker         test al,al         mov    esi, lpstr         jz short CheckBor         mov eax,strSub            //函式border 替換         jmp Patche CheckBor:         push 0C4C4C4C4h         call Checker         test al,al         jz short CheckSeg         mov eax,strBor            //邏輯邊界替換         jmp Patche CheckSeg:         mov    esi, lpstr         push 0CDCDCDCDh         call Checker         test al,al         jz short Call_ExtTextOut         mov eax,strSeg            //段邊界替換 Patche:                 mov [esp+14h],eax Call_ExtTextOut:          call ExtTextOutEntry         pop ecx         pop edi         pop esi     } } int idaapi init(void) { _asm{     push esi     push edi     push edx     push ecx     push eax     mov edi,[ebp+4]                 //得到呼叫返回地址(idag中)     mov ecx,-1     mov al,0e8h     cld again:     repnz scasb                    //查詢 call     jnz over     mov edx,[edi]     cmp edx,200000h     jae short again     cmp edx,0     jb short again     lea edx,[edi+edx-2]            //獲取呼叫目標地址     cmp word ptr[edx],25ffh            //是 jmp [xxxxxxx] ?     jnz short again     mov edi,[edx+2]                //得到 IAT     and edi,0fffff000h             jmp short $+7     call ExtTextOutA     call $+5     pop eax     sub eax,9     add eax,[eax]     mov eax,[eax+4]                //得到 ExtTextOutA RAV     mov ecx,800h     repnz scasd                    //搜尋 ExtTextOutA RAV 在 IAT中的位置     jnz short over     sub edi,4                 mov ExtTextOutEntry,eax        //儲存 ExtTextOutA RAV     mov ExtTextOutIAT,edi        //儲存其指標     mov eax,offset BorderPatcher     stosd                        //移花接木:用 BorderPatcher替換指標 over:     pop eax     pop edx     pop ecx     pop edi     pop esi     }   return PLUGIN_KEEP; } void idaapi term(void) {   unhook_from_notification_point(HT_UI, sample_callback);   set_user_defined_prefix(0, NULL); _asm{     push edi     push eax     mov eax,ExtTextOutEntry     mov edi,ExtTextOutIAT     stosd                        //恢復指標     pop eax     pop edi     }   }

相關文章