首页
社区
课程
招聘
[旧帖] [求助]有谁能把某个PE文件里的DOS Stub程序分离出来吗? 0.00雪花
发表于: 2009-8-9 16:04 8816

[旧帖] [求助]有谁能把某个PE文件里的DOS Stub程序分离出来吗? 0.00雪花

2009-8-9 16:04
8816
4D 5A 50 00 02 00 00 00   04 00 0F 00 FF FF 00 00
B8 00 00 00 00 00 00 00   40 00 1A 00 00 00 00 00
00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00   00 00 00 00 00 01 00 00  
BA 10 00 0E 1F B4 09 CD   21 B8 01 4C CD 21 90 90   //从这行开始是DOS Stub
54 68 69 73 20 70 72 6F   67 72 61 6D 20 6D 75 73    // This program mus
74 20 62 65 20 72 75 6E   20 75 6E 64 65 72 20 57
69 6E 33 32 0D 0A 24 37   00 00 00 00 00 00 00 00   // 24就是'$'
00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00
------------------------------------------------------------------------------------------------------
     我很早就有这个想法,但是直到今天还是没解决这个问题。很多人连我自己都认为我在干一件很蠢的事情,但是这个问题不解决就一直压在我心里,真不好受啊?
   
    上面那个是Delphi编译出的默认头部,我用Debug 1.exe再用U命令查看到
0B8D:0000 BA1000        MOV     DX,0010
0B8D:0003 0E            PUSH    CS
0B8D:0004 1F            POP     DS
0B8D:0005 B409          MOV     AH,09
0B8D:0007 CD21          INT     21
0B8D:0009 B8014C        MOV     AX,4C01
0B8D:000C CD21          INT     21

Dos Stub中真正有价值的命令就这几条,但是问题是运行此命令的硬件(寄存器、内存等)环境怎么提取出来,在DOS MZ Head块的那些信息好像帮不上我。我是XP时代接触电脑的,请各位高手帮帮我!

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (20)
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
2
这不是很简单嘛,用IDA一分析:

seg000:0000                 public start
seg000:0000 start           proc near
seg000:0000                 mov     dx, 10h
seg000:0003                 push    cs
seg000:0004                 pop     ds
seg000:0005                 assume ds:seg000
seg000:0005                 mov     ah, 9
seg000:0007                 int     21h             ; DOS - PRINT STRING
seg000:0007                                         ; DS:DX -> string terminated by "$"
seg000:0009                 mov     ax, 4C01h
seg000:000C                 int     21h             ; DOS - 2+ - QUIT WITH EXIT CODE (EXIT)
seg000:000C                                         ; AL = exit code
seg000:000C
seg000:000C start           endp
seg000:000C
seg000:000C ; ---------------------------------------------------------------------------
seg000:000E                 align 4
seg000:0010 s_ThisProgramMu db 'This program must be run under Win32',0Dh,0Ah
seg000:0010                 db '$7',0

首先是mov dx, 01h为dx赋值(为后面Print String做准备)
接着
push cs
pop ds
使ds和cs指向同一个位置,这样在后面Print String的时候,ds:dx=cs:dx,正是指向那段字符串。
然后就是两个int 21h,打印那段字符串之后就exit了。
2009-8-9 21:45
0
雪    币: 231
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
IDA就是强大.
2009-8-9 22:22
0
雪    币: 240
活跃值: (26)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
这个,你先看下PE文件的结构……
然后找到MZ,再找到"PE"
基本上,"MZ"到"PE"(包括"MZ")的部分复制到新文件中就好了……
2009-8-11 00:16
0
雪    币: 201
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
不好意思,这个星期琐事缠身现在才回来。

to 2 楼:这个我也知道,但是并不能把它单独分离出来。
to 4楼:直接这样运行成乱码,也就是不正常工作。因为我是在Windows环境下使用,如果完整的Dos MZ Head都提取出来,明显会被当做Windows下的*.exe程序来运行的。也就是会跳过Dos Stub.
2009-8-16 11:49
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
6
LZ是想写16bit的程序吧?
2009-8-16 12:51
0
雪    币: 201
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我不是想用代码重新编译出来,而是原程序上分离出来
2009-8-16 15:58
0
雪    币: 138
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
额.......怀疑你们试过没
上传的附件:
2009-8-16 20:05
0
雪    币: 201
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
我试过,直接提取"MZ"到"PE"不能正常运行的。
2009-8-17 09:02
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
10
你提取后, 前6个byte改为如下, 试试

4D 5A 00 01 01 00
上传的附件:
2009-8-17 14:13
0
雪    币: 201
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
成功了,楼上的真厉害啊!要消化这个我还得翻些资料。
2009-8-17 14:45
0
雪    币: 138
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
请问为什么我在虚拟机中运行正常;在cmd中是一闪而过,回到目录,你的可以在cmd中运行
2009-8-17 16:19
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
13
page吧
请用"全屏幕"试试.

另一种方法:
在cmd输入 debug 回车, 直接 q 离开
再执行你改好的 exe 应该也行.
2009-8-17 18:13
0
雪    币: 138
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
非常感谢,第二种方法可以,但您说的page是.........
2009-8-17 19:52
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
15
我乱讲的
你又问起
不然改说 mode 好了
2009-8-17 20:16
0
雪    币: 138
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
额..........也不知道您口中的mode啊
2009-8-17 20:44
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
17
反正跟 stdout 有关, 这是Microsoft的事
你找其它简单用ah=9,int 21h的纯DOS程序来试也是一样.
比较好的相容做法是  你那个cmd的视窗将之设为 全屏幕

全说一遍了总会猜中一个吧

win9x似乎好一点(猜的)
2009-8-17 21:08
0
雪    币: 138
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
全屏也可以,但你的cmd(应该是xp吧)不需要全屏,也不像是先debug,再推出来的方法
2009-8-17 21:33
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
19
我是win2000
2009-8-17 22:53
0
雪    币: 138
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
额.....ok,没问题了
2009-8-17 23:57
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
16BIT的程序。。。。。。
2009-8-22 02:51
0
游客
登录 | 注册 方可回帖
返回
//