Re: [問題] Intel的指令機械碼
※ 引述《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
03/18 14:05, 4F
→
03/18 15:12, , 5F
03/18 15:12, 5F
→
03/18 15:18, , 6F
03/18 15:18, 6F
→
03/18 15:20, , 7F
03/18 15:20, 7F
討論串 (同標題文章)
ASM 近期熱門文章
PTT數位生活區 即時熱門文章