如何获得仅给出十六进制代码的可执行文件?

时间:2013-08-28 07:28:28

标签: windows assembly binary hex masm

我正在学习windows汇编语言,masm作为我的汇编程序,link作为我的链接器。我拿了下面的汇编代码并获得了exe

.386                                                                                 
.model flat, stdcall                                                                 
option casemap :none                                                                 

extrn MessageBoxA@16 : PROC                                                          
extrn ExitProcess@4  : PROC                                                          

.code                                                                                
start:                                                                               
        mov eax, 0                                                                   
        push eax                                                                     
        jmp msg                                                                      
pgm:    pop ebx                                                                      
        push ebx                                                                     
        push ebx                                                                     
        push eax                                                                     
        call MessageBoxA@16                                                          
        push eax                                                                     
        call ExitProcess@4                                                           
msg:    call pgm                                                                     
        db "KingKong",0                                                              
end start

C:\Arena>ml /c /coff  a.asm                                                         
Microsoft (R) Macro Assembler Version 10.00.30319.01                                
Copyright (C) Microsoft Corporation.  All rights reserved.                          

 Assembling: a.asm   

C:\Arena>link /subsystem:windows /defaultlib:kernel32 /defaultlib:user32 a.obj      
Microsoft (R) Incremental Linker Version 10.00.30319.01                             
Copyright (C) Microsoft Corporation.  All rights reserved. 

程序工作正常并显示消息框,现在我运行了objdump -d a.exe并获取了shellcode并将其插回以获取可执行文件

.386
.model flat, stdcall
option casemap :none

extrn MessageBoxA@16 : PROC
extrn ExitProcess@4  : PROC

.code
start:
db 0xb8,0x00,0x00,0x00,0x00,0x50,0xeb,0x0f,0x5b,0x53,0x53,0x50,0xe8,0x1b,0x00,0x00,0x00,0x50,0xe8,0x0f,0x00,0x00,0x00,0xe8,0xec,0xff,0xff,0xff,0x4b,0x69,0x6e,0x67,0x4b,0x6f,0x6e,0x67,0x00,0xcc,0xff,0x25,0x00,0x20,0x40,0x00,0xff,0x25,0x08,0x20,0x40,0x00
end start

但是当我尝试组装它时,我得到了

C:\Arena>ml /c /coff b.asm                                                          
Microsoft (R) Macro Assembler Version 10.00.30319.01                                
Copyright (C) Microsoft Corporation.  All rights reserved.                          

 Assembling: b.asm                                                                  
b.asm(10) : error A2042:statement too complex 

我能够在linux上使用hexdump取回可执行文件,该线程为here。我需要仅使用我在Windows上获得的hexdump来恢复可执行文件。我该怎么做?

编辑这是一个很好的建议,分割字节,我有

.386                                                                                 
.model flat, stdcall                                                                 
option casemap :none                                                                 

extrn MessageBoxA@16 : PROC                                                          
extrn ExitProcess@4  : PROC                                                          

.code                                                                                
start:                                                                               
db 0xb8,0x00,0x00,0x00,0x00,0x50,0xeb,0x0f                                           
db 0x5b,0x53,0x53,0x50,0xe8,0x1b,0x00,0x00                                           
db 0x00,0x50,0xe8,0x0f,0x00,0x00,0x00,0xe8                                           
db 0xec,0xff,0xff,0xff,0x4b,0x69,0x6e,0x67                                           
db 0x4b,0x6f,0x6e,0x67,0x00,0xcc,0xff,0x25                                           
db 0x00,0x20,0x40,0x00,0xff,0x25,0x08,0x20                                           
db 0x40,0x00                                                                         
end start 

但是当我把它送到汇编程序时,我得到了

C:\Arena>ml a.asm                                                                   
Microsoft (R) Macro Assembler Version 10.00.30319.01                                
Copyright (C) Microsoft Corporation.  All rights reserved.                          

 Assembling: a.asm                                                                  
a.asm(10) : error A2206:missing operator in expression                              
a.asm(11) : error A2206:missing operator in expression                              
a.asm(12) : error A2206:missing operator in expression                              
a.asm(13) : error A2206:missing operator in expression                              
a.asm(14) : error A2206:missing operator in expression                              
a.asm(15) : error A2206:missing operator in expression                              
a.asm(16) : error A2206:missing operator in expression

如果只给出十六进制代码,我如何取回可执行文件?

2 个答案:

答案 0 :(得分:1)

MessageBoxA和ExitProcess的解决方法应如下所示(遗憾的是我通常使用GNU汇编程序,所以我不知道这里的语法是否正确):

  db 0b8h, 000h, 000h, 000h, 000h, 050h, 0ebh, 00fh
  db 05bh, 053h, 053h, 050h, 0e8h
  dd MessageBoxA@16 - addr1
addr1:
  db 050h, 0e8h
  dd ExitProcess@4 - addr2
addr2:
  db 0e8h, 0ech, 0ffh, 0ffh, 0ffh, 04bh, 069h, 06eh
...

你不能“只是”使用十六进制。当您不知道所调用函数的地址时编码!

也许MASM甚至不允许使用“dd”伪指令创建相对地址。在这种情况下,您有一种可能性:

mov ECX, MessageBoxA@16
call ECX

这将产生一个绝对地址(“call”使用相对的地址),所以当翻译成十六进制代码时,文件将如下所示:

db 0b9h
dd MessageBoxA@16
db 0ffh, 0d1h

答案 1 :(得分:0)

我非常肯定masm有一个行长度限制(内存为255,至少对于我使用的版本而言)。

你需要将那个大的鸣笛db语句拆分成多个语句。换句话说,做一些事情(你也会注意到我已经将内容更改为我的peferred风格 - 我不知道masm是否接受C风格的十六进制数字,我从未使用过它们:< / p>

.code
start:
    db 0b8h,  00h,  00h,  00h,  00h,  50h, 0ebh,  0fh
    db  5bh,  53h,  53h,  50h, 0e8h,  1bh,  00h,  00h
    ; and so on

但是,我并非完全确信对MessageBoxExitProcess的外部调用将与基于字节的解决方案一起使用,您需要检查