作者amjads (秀树)
看板ASM
标题Re: [问题] Intel的指令机械码
时间Sun Mar 18 09:51:24 2007
※ 引述《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)
1F:推 jeunder:乾脆直接融合在一起就好了, 连解码的片段都可以省了. 03/18 13:57
2F:→ jeunder:只是自体会随着融合次数的增加, 而逐渐的肥大, 所以重组 03/18 13:59
3F:→ jeunder:简化的手段是必要的. 03/18 14:03
4F:→ jeunder:[闲聊] 你这家伙, 还在不务正业啊? :p 03/18 14:05
5F:→ amjads:全部融合的话, 工程浩大啊~ 03/18 15:12
6F:→ amjads:[闲聊] 我是刚逛完 CAD/CAM 之後, 无意间看到有 ASM 这区 03/18 15:18
7F:→ amjads:刚好又不小心看到两个人好像是曾相识的, 就过来凑一下热闹 03/18 15:20