`
yiyeqinghuasoon
  • 浏览: 645376 次
文章分类
社区版块
存档分类
最新评论

菜鸟学反汇编1—empty

 
阅读更多

感觉学习反汇编应该一点一点,脚踏实地去学。于是我就采用积木式学习方法。内容一点一点往里面加,从而更易于比较。

C++代码:
#include<iostream>
using namespace std;
int main()
{
return 0;
}
反汇编结果:
; +-------------------------------------------------------------------------+
; | This file is generated by The Interactive Disassembler (IDA) //这是版本信息,以后省略。
; | Copyright (c) 2007 by DataRescue sa/nv, <ida@datarescue.com> |
; | Licensed to: Mach EDV Dienstleistungen, Jan Mach, 1 user, adv, 11/2007 |
; +-------------------------------------------------------------------------+
;
; Input MD5 : 17178FC90D2A31A0E7D285EDE9FFD2D6 //MD5值就是软件的指纹,用户可以通过软件提供的原始MD5值和已经获得的软件的MD5 值进行对比,如果相符的话就说明你下载的软件是“原厂”的,如果比较结果不相同的话则说明你下载的软件有可能被其他人动过手脚(例如添加了恶意程序、修改了源代码等),使用时要小心或是重新下载。这部分以后省略。
; File Name : G:/software/empty/empty.exe//文件的路径,以后省略。
; Format : Portable executable for 80386 (PE)//文件的格式,以后省略。
; Imagebase : 400000 //物理内存中的位置
; Section 1. (virtual address 00001000)
; Virtual size : 000060D4 ( 24788.)//内存中的文件大小
; Section size in file : 00007000 ( 28672.)//硬盘上的文件大小
; Offset to raw data for section: 00001000//块数据的偏移量
; Flags 60000020: Text Executable Readable
; Alignment : default
; OS type : MS Windows//运行的操作系统,以后省略。
; Application type: Executable 32bit//应用的类型,以后省略。

include uni.inc ; see unicode subdir of ida for info on unicode //哪位大侠能把这段解释一下啊?

.686p
.mmx
.model flat


; Segment type: Pure code
; Segment permissions: Read/Execute
_text segment para public 'CODE' use32
assume cs:_text
;org 401000h
assume es:nothing, ss:nothing, ds:_data, fs:nothing, gs:nothing



; Attributes: bp-based frame
//argc:整数,为传给main()的命令行参数个数。
; int __cdecl main(int argc, const char **argv, const char *envp)//argv: 字符串数组
_main proc near//在DOS 3.X 版本中,argv[0] 为程序运行的全路径名;
//对DOS 3.0 以下的版本,argv[0]为空串("") 。
//argv[1]为在DOS 命令行中执行程序名后的第一个字符串;
//argv[2]为执行程序名后的第二个字符串;
//argv[argc]为NULL
//*env: 字符串数组。env[] 的每一个元素都包含ENVVAR=value形式的字符串。其中ENVVAR为环境变量如PATH或87。value为ENVVAR的对应值如C:/DOS,C:/TURBOC(对于PATH) 或YES(对于87)。

argc= dword ptr 8
argv= dword ptr 0Ch
envp= dword ptr 10h

push ebp//这两行为标准的开始标志。因为程序是运行在系统中的,在它运行后会有其他的程序运行。而ESP是维护整个系统的堆栈的,因此这个程序运行前先要保护ESP。
mov ebp, esp

xor eax, eax//这两行为标准的结束标志。注意这儿的xor eaxeax。这个的作用是让eax=0。因为eax一般为程序的返回值。而在C++中主程序返回0让Debug程序认为这个程序没有发生问题,而如果返回非0值就会认为程序发生了问题。即这句针对return 0。如果我改为return 1。则这句变为mov eax,1。
pop ebp
retn//ret xx的结果是在ESP上+xx。在这个程序执行之前执行这段代码的程序将这个程序结束之后应该执行的语句的地址push入了堆栈,而retn就是只读出堆栈顶的内容。程序将从这个地址继续执行。
_main endp

反思: 程序主体是清晰的,但是有#include<iostream> using namespace std;是否对代码主体有影响?
下步: 删去可能有影响的部分



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics