很多高手,都说dos中com文件很好脱。不知道是我不得此法还是什么...
本人就遇到一个国人写的程序,是一个硬盘网络对拷工具demo版。
工具如何,不是这里重点!工具不能在ms-dos上进入程序界面。
要用dos的网卡驱动,才能进入程序界面不过不影响脱壳...
这个是未知壳,或叫未知编码吧?
我按照本人翻译的debug 脱壳法,不行。
再参考飞刀浪子的UCDOS 7.0的KNL.COM程序脱壳还是不行...
以下是一些高手总结:
THE UNDERTAKER -=BANDA=-
Com文件在内存映像中没有可位定的项目。只有合适区分标志器(SS,ES,DS = CS)。
Com文件大小在64k之间。
最大可变偏移量在0000 - FFFF
当它执行之时,Com文件是比较Exe文件更苗条更快速(打赌你也不知道它这点)。
Com文件不像Exe文件有,header(文件头) checksum(校验和)。
Com文件开始在100h范围,紧接在上述的PSP=Personal Software Process(为软件人员进行软件开发提
供了一个规范的个人过程框架=可编程序的信号处理机 )。
在这时加载com文件。ES,DS,SS,CS(标志器)指针向PSP。然后SP(栈指针)再指向
同样可能存在高级的内存中,负数2 bytes (SP = FFFE)。
事实上MS-DOS压入一个零的word(双字节)在这个stack(堆栈)之后的入口处。
飞刀浪子
脱这些壳,重要的就是要严密监视SI、DI、ES、CX,其他的要看情况
忘记是哪两位:
com:
ax=cx=dx=0000
If CS=DS=ES=SS,SP=FFFE,the we reach the OEP of a .COM
文件长度在bx
高位在cx
把100开始,bx长的东东写入文件 bx=4480
W cs:ip dx test.com
一般就是g 100
本人跟踪过程:
tr netcopy.com
刚载入:
AX=0000 BX=0000 CX=0000 DX=2BB4 SP=FFFE BP=0000 SI=0100 DI=0000
DS=2BB4 ES=2BB4 SS=2BB4 CS=2BB4 IP=0100 o d I S z a p c t
2BB4:0000 CD 20 00 9F 00 9A F0 FE-1D F0 75 85 F2 0B 6D 01 ?.?氿?饀咈.m.
2BB4:0010 11 0A 78 01 11 0A 11 0A-01 01 01 00 02 FF FF FF ..x..........
2BB4:00FC 0000 ADD [BX+SI],AL
2BB4:00FE 0000 ADD [BX+SI],AL
2BB4:0100 E9BFA8 JMP A9C2
2BB4:0103 FF01 INC [WORD DI+BX]
2BB4:0105 FF03 INC [WORD BP+DI]
2BB4:0107 FF07 INC [WORD BX]
2BB4:0109 FF0F DEC [WORD BX]
2BB4:010B FF1F CALL FAR [WORD BX]
2BB4:010D FF3F INVALID [WORD BX]
2BB4:010F FF7FFF INVALID [WORD BX-01]
2BB4:0112 FF00 INC [WORD BX+SI]
2BB4:0114 55 PUSH BP
2BB4:0115 8BEC MOV BP,SP
2BB4:0117 83C4E8 ADD SP,-18
2BB4:011A 6660 PUSHAD
2BB4:011C 1E PUSH DS
感觉这段进行解码或解壳:
AX=0000 BX=0000 CX=0000 DX=2BB4 SP=FFFE BP=0000 SI=0100 DI=0000
DS=2BB4 ES=2BB4 SS=2BB4 CS=2BB4 IP=A9C2 o d I S z a p c t
2BB4:0000 CD 20 00 9F 00 9A F0 FE-1D F0 75 85 F2 0B 6D 01 ?.?氿?饀咈.m.
2BB4:0010 11 0A 78 01 11 0A 11 0A-01 01 01 00 02 FF FF FF ..x..........
2BB4:A9C2 6660 PUSHAD
2BB4:A9C4 1E PUSH DS
2BB4:A9C5 06 PUSH ES
2BB4:A9C6 8CC8 MOV AX,CS
2BB4:A9C8 8ED8 MOV DS,AX
2BB4:A9CA 8EC0 MOV ES,AX
2BB4:A9CC 8CC8 MOV AX,CS
2BB4:A9CE 050010 ADD AX,1000
2BB4:A9D1 33FF XOR DI,DI
2BB4:A9D3 8CCB MOV BX,CS
2BB4:A9D5 BE9A02 MOV SI,029A
2BB4:A9D8 8CC9 MOV CX,CS
2BB4:A9DA 81C10050 ADD CX,5000
2BB4:A9DE 8CCA MOV DX,CS
2BB4:A9E0 81C20060 ADD DX,6000
2BB4:A9E4 E82D57 CALL 0114
2BB4:A9E7 8CC8 MOV AX,CS
2BB4:A9E9 050030 ADD AX,3000
2BB4:A9EC 33FF XOR DI,DI
2BB4:A9EE 8CCB MOV BX,CS
2BB4:A9F0 BE1020 MOV SI,2010
2BB4:A9F3 8CC9 MOV CX,CS
2BB4:A9F5 81C10050 ADD CX,5000
2BB4:A9F9 8CCA MOV DX,CS
2BB4:A9FB 81C20060 ADD DX,6000
2BB4:A9FF E81257 CALL 0114
2BB4:AA02 8CC8 MOV AX,CS
2BB4:AA04 050040 ADD AX,4000
2BB4:AA07 A39602 MOV [0296],AX
2BB4:AA0A C70698020000 MOV [WORD 0298],0000
2BB4:AA10 33FF XOR DI,DI
2BB4:AA12 8CCB MOV BX,CS
2BB4:AA14 BE7042 MOV SI,4270
2BB4:AA17 8CC9 MOV CX,CS
2BB4:AA19 81C10050 ADD CX,5000
2BB4:AA1D 8CCA MOV DX,CS
2BB4:AA1F 81C20060 ADD DX,6000
2BB4:AA23 E8EE56 CALL 0114
2BB4:AA26 8CC8 MOV AX,CS
2BB4:AA28 050010 ADD AX,1000
2BB4:AA2B 50 PUSH AX
2BB4:AA2C 33C0 XOR AX,AX
2BB4:AA2E 50 PUSH AX
AX=6BB4 BX=2BB4 CX=7BB4 DX=0000 SP=FFD6 BP=0000 SI=4270 DI=0000
DS=2BB4 ES=2BB4 SS=2BB4 CS=2BB4 IP=AA36 o d I s Z a P c t
2BB4:0000 CD 20 00 9F 00 9A F0 FE-1D F0 75 85 F2 0B 6D 01 ?.?氿?饀咈.m.
2BB4:0010 11 0A 78 01 11 0A 11 0A-01 01 01 00 02 FF FF FF ..x..........
2BB4:AA2F A19602 MOV AX,[0296]
2BB4:AA32 8B169802 MOV DX,[0298]
2BB4:AA36 CB RETF
又一个长跳:
AX=6BB4 BX=2BB4 CX=7BB4 DX=0000 SP=FFDA BP=0000 SI=4270 DI=0000
DS=2BB4 ES=2BB4 SS=2BB4 CS=3BB4 IP=0000 o d I s Z a P c t
2BB4:0000 CD 20 00 9F 00 9A F0 FE-1D F0 75 85 F2 0B 6D 01 ?.?氿?饀咈.m.
2BB4:0010 11 0A 78 01 11 0A 11 0A-01 01 01 00 02 FF FF FF ..x..........
3BB4:0000 E9E222 JMP 22E5
也许已经是解壳完成:
AX=6BB4 BX=2BB4 CX=7BB4 DX=0000 SP=FFDA BP=0000 SI=4270 DI=0000
DS=2BB4 ES=2BB4 SS=2BB4 CS=3BB4 IP=22E5 o d I s Z a P c t
2BB4:0000 CD 20 00 9F 00 9A F0 FE-1D F0 75 85 F2 0B 6D 01 ?.?氿?饀咈.m.
2BB4:0010 11 0A 78 01 11 0A 11 0A-01 01 01 00 02 FF FF FF ..x..........
3BB4:22E5 2EA32301 MOV [CS:0123],AX (3BB4:0123=0000)
3BB4:22E9 2E89162101 MOV [CS:0121],DX
3BB4:22EE 6660 PUSHAD
3BB4:22F0 1E PUSH DS
3BB4:22F1 06 PUSH ES
3BB4:22F2 8CCB MOV BX,CS
3BB4:22F4 8EDB MOV DS,BX
3BB4:22F6 8EC3 MOV ES,BX
3BB4:22F8 E8D3E2 CALL 05CE
3BB4:22FB 0F82DD05 JB 28DC
3BB4:22FF 8B3E2501 MOV DI,[0125]
3BB4:2303 C7051400 MOV [WORD DI],0014
3BB4:2307 E84BFC CALL 1F55 ---------->Initializing packet driver........
3BB4:230A 8B3E2501 MOV DI,[0125]
3BB4:230E C7051500 MOV [WORD DI],0015
3BB4:2312 E840FC CALL 1F55 ---------->Searching sender........
3BB4:2315 E8BCE3 CALL 06D4
3BB4:2318 730C JAE 2326
3BB4:231A E870FF CALL 228D
3BB4:231D 0BC0 OR AX,AX
3BB4:231F 740A JE 232B ---------->这是校正有否网卡驱动
//--------------没有就退出
AX=4CB4 BX=2BB4 CX=7BB4 DX=0000 SP=FFDA BP=0000 SI=4270 DI=0000
DS=2BB4 ES=2BB4 SS=2BB4 CS=3BB4 IP=28E2 o d I s z a p c t
2BB4:0000 CD 20 00 9F 00 9A F0 FE-1D F0 75 85 F2 0B 6D 01 ?.?氿?饀咈.m.
2BB4:0010 11 0A 78 01 11 0A 11 0A-01 01 01 00 02 FF FF FF ..x..........
3BB4:28DC 07 -> POP ES
3BB4:28DD 1F POP DS
3BB4:28DE 6661 POPAD
3BB4:28E0 B44C MOV AH,4C
3BB4:28E2 CD21 INT 21 Terminate Process with Return Code
//--------------有就开始进入程序界面
AX=0001 BX=3BB4 CX=7BB4 DX=0000 SP=FFB6 BP=0000 SI=4270 DI=7361
DS=3BB4 ES=3BB4 SS=2BB4 CS=3BB4 IP=232B o d I s Z a p c t
2BB4:0000 CD 20 00 9F 00 9A F0 FE-1D F0 75 85 F2 0B 6D 01 ?.?氿?饀咈.m.
2BB4:0010 11 0A 78 01 11 0A 11 0A-01 01 01 00 02 FF FF FF ..x..........
2BB4:0000 CD 20 00 9F 00 9A F0 FE-1D F0 75 85 F2 0B 6D 01 ?.?氿?饀咈.m.
2BB4:0010 11 0A 78 01 11 0A 11 0A-01 01 01 00 02 FF FF FF ..x..........
3BB4:2326 C6063B0100 MOV [BYTE 013B],00
3BB4:232B E8A6E3 CALL 06D4
3BB4:232E 0F82AA05 JB 28DC
3BB4:2332 E8F8E3 CALL 072D
3BB4:2335 0F82A305 JB 28DC
------->是否有退出过?这个程序退出一次,就不能再进入程序所以这里必须要跳.
3BB4:2339 8B3E2501 MOV DI,[0125]
3BB4:233D C7051200 MOV [WORD DI],0012
3BB4:2341 E811FC CALL 1F55 -------->这里就是进入程序界面
3BB4:2344 E816DD CALL 005D
3BB4:2347 E884FD CALL 20CE
3BB4:234A 8B3E2501 MOV DI,[0125]
3BB4:234E C7050000 MOV [WORD DI],0000
3BB4:2352 E800FC CALL 1F55
3BB4:2355 3DFF00 CMP AX,00FF
3BB4:2358 7503 JNE 235D
3BB4:235A E96A05 JMP 28C7
3BB4:22E5 2EA32301 MOV [CS:0123],AX (3BB4:0123=0000)
不过在我这里用S命令居然
Initializing packet driver........
Searching sender........
如:
s 0000 l ffff 'Searching'
搜索不到这样字串?
进行com脱守回写:
R BX 0
R CX 2BB4
N CRKNET.COM
W CS:100
脱出来居然比原来的小很多,而且不能运行。0F82A305中的机器码,同样找到证明脱壳失败。
我也试过用exetools网站的工具进行脱壳后,还是找到0F82A305与以上字串而且与未脱壳的
时大小没有变化。用16进制工具打开对比,差点晕倒内容是一样。证明工具可能认为程序无壳
所以实现copy功能。tr 的万能脱壳法,跟工具一样失败。
不知道高手前辈们可否指教一下。
[课程]Linux pwn 探索篇!
上传的附件: