Re: [問題] Intel的指令機械碼

看板ASM (組合語言)作者 (秀樹)時間17年前 (2007/03/18 09:51), 編輯推噓1(106)
留言7則, 2人參與, 最新討論串8/8 (看更多)
※ 引述《zha0 (zha0)》之銘言: : ※ 引述《amjads (秀樹)》之銘言: : : 我的想法: 那就不要垃圾指令... 從頭到尾都不要了... : : 直接在宿主的開頭的程式碼取一段來分析, 並將解碼程式與其相結合, 我印象中 : 之前還滿多人在寫 LDE (Length Disassembler Engine) 最小好像 1xx~2xx bytes 這種東西很好寫, 將指令集歸納成一張表格就搞定了... 缺點是程式流程沒辦法判斷, 必須要另外再寫一組指令模擬... : : 在 64 位元的環境下很好做到! 但是要附上兩個 tab 紀錄分解組裝的位址... : : 程式一開始會先 run 解碼與宿主的結合體, 等解碼完畢後, 在將該區域修改的部 : : 份在改回來, 在轉出控制權... : PE : TLS Callback, ELF : PIC, PIE : 看完上面的感覺好像?程式碼的每個指令都插到宿主去,還是我認知有錯 XD 沒錯 :) : 因為想用 OEP (Entry-Point Obscuring) 插程式碼,宿主程式碼如果一大, : 因該會很懶得,去追,跟去柝出來 >__< 所以最終的目的還是要強迫對方使用指令模擬來應付 : 插入的每一個指令都是用來填入記憶体,把整個 infect+insert code 都填出來, : 然後再跳過去執行。 ( 如果遇到 NX, XD 因該會死 ) 這裡你就跟我想得不一樣了... 我是指將解碼指令"徹底"的融入宿主之內, 連設初值或是迴圈都用宿主中現成的指令, 舉例來說: ******************** Program Entry Point ******** 00401000 A1E3604100 mov eax, dword ptr [004160E3] 00401005 C1E002 shl eax, 02 00401008 A3E7604100 mov dword ptr [004160E7], eax 0040100D 57 push edi 0040100E 51 push ecx 0040100F 33C0 xor eax, eax 00401011 BF7C8A4100 mov edi, 00418A7C <------ 這些初值都可以利用 00401016 B9C80A4200 mov ecx, 00420AC8 0040101B 3BCF cmp ecx, edi 0040101D 7605 jbe 00401024 0040101F 2BCF sub ecx, edi 00401021 FC cld 00401022 F3 repz 00401023 AA stosb 00401024 59 pop ecx 00401025 5F pop edi 到目前為止沒用到的暫存器有: ebx edx esi ... 隨便找一個來用 就用 ebx 來做偏移位址吧 00401026 6A00 push 00000000 00401028 E83EBD0000 call 0040CD6B 0040102D 59 pop ecx 上面三行改掉 mov ebx,bd3ee800h (5bytes) 初值對方幫我們弄好了 L1: add eax,ebx (2bytes) inc ebx (1bytes) 0040102E 68AC604100 push 004160AC 00401033 6A00 push 00000000 00401035 E8C84A0100 Call 00415B02 再改 sub byte ptr [ebx+????????h],60h (7bytes) cmp ebx,????????h (6bytes) 0040103A A3EB604100 mov dword ptr [004160EB], eax 0040103F 6A00 push 00000000 又改 jbe L1 (2bytes) sub eax,esi test eax,eax 00401041 E9B6430100 jmp 004153FC 改改改 jmp xxxxxxxx 跳到我想到的地方 等我們的小東西執行完後, 再將原先改的部分 改回來, 再接著執行原宿主 :) 00401046 E9BBBD0000 jmp 0040CE06 0040104B 33C0 xor eax, eax 0040104D A0D8604100 mov al, byte ptr [004160D8] 00401052 C3 ret 00401053 A1EB604100 mov eax, dword ptr [004160EB] 00401058 C3 ret 為了讓 trace 更困難, call 的指令可以儘量不去變動, 只改其位址就行了... 怎麼樣讓指令看起來不垃圾呢? 用三組以上的暫存器來做, 當 Reg 1 值成立後修改 Reg2 , 當 Reg 2 值成立後修改 Reg3, 利用這些樣板原則產生的垃圾指令, 就不會無意義了... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.112.171.185 ※ 編輯: amjads 來自: 59.112.171.185 (03/18 10:06)

03/18 13:57, , 1F
乾脆直接融合在一起就好了, 連解碼的片段都可以省了.
03/18 13:57, 1F

03/18 13:59, , 2F
只是自體會隨著融合次數的增加, 而逐漸的肥大, 所以重組
03/18 13:59, 2F

03/18 14:03, , 3F
簡化的手段是必要的.
03/18 14:03, 3F

03/18 14:05, , 4F
[閒聊] 你這傢伙, 還在不務正業啊? :p
03/18 14:05, 4F

03/18 15:12, , 5F
全部融合的話, 工程浩大啊~
03/18 15:12, 5F

03/18 15:18, , 6F
[閒聊] 我是剛逛完 CAD/CAM 之後, 無意間看到有 ASM 這區
03/18 15:18, 6F

03/18 15:20, , 7F
剛好又不小心看到兩個人好像是曾相識的, 就過來湊一下熱鬧
03/18 15:20, 7F
文章代碼(AID): #15_9iTq8 (ASM)
文章代碼(AID): #15_9iTq8 (ASM)