也能用工具看到他有exe文件的格式:
00000000 5A4D Signature: MZ
00000002 0150 Extra Bytes
00000004 0001 Pages
00000006 0000 Reloc Items
00000008 0004 Header Size
0000000A 0000 Min Alloc
0000000C FFFF Max Alloc
0000000E 0000 Initial SS
00000010 0150 Initial SP
00000012 0000 Check Sum
00000014 0000 Initial IP
00000016 0000 Initial CS
00000018 0040 Reloc Table
0000001A 0000 Overlay
00000090 00004550 Signature: PE
00000094 014C Machine: 014C=I386
00000096 0001 Number of Sections
00000098 36A57950 Time/Date Stamp
0000009C 00000000 Pointer to Symbol Table
000000A0 00000000 Number of Symbols
000000A4 00E0 Optional Header Size
000000A6 010F Characteristics
00000188 .text Section Name
00000190 000000DC Virtual Size
00000194 00001000 RVA/Offset
00000198 00000200 Size of Raw Data
0000019C 00000200 Pointer to Raw Data
000001A0 00000000 Pointer to Relocs
000001A4 00000000 Pointer to Line Numbers
000001A8 0000 Number of Relocs
000001AA 0000 Number of Line Numbers
000001AC E0000020 Section Flags (Writeable, Readable, Executable, Code)
[ Last edited by phai2003 on 2007-11-4 at 12:32 PM ]作者: phai2003 时间: 2007-11-4 18:04 程序是从 jz 0178出去的.这个前面忽略了.
然后通过用了INT 21 ah:40 来输出.然后返回.没用ah:4c int 21结束程序
上面的问题已解决了.但编码方式仍未解决作者: phai2003 时间: 2007-11-4 19:10 以下是本人对此的最新研究成果:
最开头的两行
Bj@jzh`0X-`/PPPPPPa(DE(DM(DO(Dh(Ls(Lu(LX(LeZRR]EEEUYRX2Dx=
0DxFP,0Xx.t0P,=XtGsB4o@$?PIyU WwX0GwUY Wv;ovBX2Gv0ExGIuht6
就是解码程序.后面的是被解码的.
(DM(DO(Dh(Ls(Lu(LX(Le这段反汇编是
0C1E:0100 42 INC DX
0C1E:0101 6A DB 6A ;这其实是6A40: PUSH 0040
0C1E:0102 40 INC AX
0C1E:0103 6A DB 6A ;这其实是6A7A: PUSH 007A
0C1E:0104 7A68 JPE 016E
0C1E:0106 60 DB 60 ;这其实是686030: PUSH 3060
0C1E:0107 30582D XOR [BX+SI+2D],BL
0C1E:010A 60 DB 60 ;这其实是58: POP AX
0C1E:010B 2F DAS ;这其实是2D602F SUB AX,2F60
0C1E:010C 50 PUSH AX ;所以40,7A,3060就是很关键的值
0C1E:010D 50 PUSH AX ;AX经SUB后就得到COM程序的入口100
0C1E:010E 50 PUSH AX
0C1E:010F 50 PUSH AX
0C1E:0110 50 PUSH AX
0C1E:0111 50 PUSH AX ;al:40 cl:7a 40,7a就是这么用的
0C1E:0112 61 DB 61 ;这代码实际上是popa
0C1E:0113 284445 SUB [SI+45],AL // ;AL:40 [SI+45]: EE 所以0144:78EE js 0134
0C1E:0116 28444D SUB [SI+4D],AL ;[14d]:7407: je 0155
0C1E:0119 28444F SUB [SI+4F],AL ;[14f]:7302: jnb 0152
0C1E:011C 284468 SUB [SI+68],AL ;这些代码是将关键的地方改成跳转 JBE 016B
0C1E:011F 284C73 SUB [SI+73],CL ;[173]:75EE: JNZ 0162
0C1E:0122 284C75 SUB [SI+75],CL ;[175]:74BC: JZ 0132
0C1E:0125 284C58 SUB [SI+58],CL ;[158]:79dbJNS 0134
0C1E:0128 284C65 SUB [SI+65],CL //(DM(DO(Dh(Ls(Lu(LX(Le的反汇编 shr word ptr
[bx+76],02
0C1E:012B 5A POP DX
0C1E:012C 52 PUSH DX
0C1E:012D 52 PUSH DX
0C1E:012E 5D POP BP
0C1E:012F 45 INC BP
0C1E:0130 45 INC BP
0C1E:0131 45 INC BP
0C1E:0132 55 PUSH BP
0C1E:0133 59 POP CX
0C1E:0134 52 PUSH DX //
0C1E:0135 58 POP AX
0C1E:0136 324478 XOR AL,[SI+78]
0C1E:0139 3D0D0A CMP AX,0A0D
0C1E:013C 304478 XOR [SI+78],AL ;[si+78]=0 就是填充0
0C1E:013F 46 INC SI
0C1E:0140 50 PUSH AX ;保存AX
0C1E:0141 2C30 SUB AL,30 AL=AL-30h
0C1E:0143 58 POP AX 弹出AX
0C1E:0144 78EE JS 0134
0C1E:0146 7430 JZ 0178 若是回车换行,就跳
0C1E:0148 50 PUSH AX
0C1E:0149 2C3D SUB AL,3D
0C1E:014B 58 POP AX
0C1E:014C 7407 JZ 0155
0C1E:014E 7302 JNB 0152
0C1E:0150 346F XOR AL,6F
0C1E:0152 40 INC AX
0C1E:0153 243F AND AL,3F ;解码
0C1E:0155 50 PUSH AX
0C1E:0156 49 DEC CX ;循环次数
0C1E:0157 79DB JNS 0134 //p 这段是解码程序
0C1E:0159 205777 AND [BX+77],DL
0C1E:015C 58 POP AX 这是关键值
0C1E:015D 304777 XOR [BX+77],AL
0C1E:0160 55 PUSH BP
0C1E:0161 59 POP CX
0C1E:0162 205776 AND [BX+76],DL dl=0
0C1E:0165 C1 DB C1 ;使[bx+76]=40h
0C1E:0166 6F DB 6F ; 这三行不对,
0C1E:0167 7602 JBE 016B ;shr word ptr [bx+76],02
0C1E:0169 58 POP AX
0C1E:016A 324776 XOR AL,[BX+76] ;[bx+76]=0 或 [bx+76]+40
0C1E:016D 304578 XOR [DI+78],AL ;[di+78]=al 没执行前等于0
0C1E:0170 47 INC DI ;[bx+76]的值就是临时存存储用的
0C1E:0171 49 DEC CX
0C1E:0172 75EE JNZ 0162
0C1E:0174 74BC JZ 0132