最近在想一个问题,就是说一个应用程序里是什么东西,是纯粹的二进制代码?我的意思是程序是怎样运行的,执行的时候是不是也是按照编写的代码那样执行,调用函数之类的,就拿 VC 来说,是不是编译后的文件包含的是汇编代码,然后程序实际执行时还是一条一条的指令执行的?如果是这样,那么对于 VB 之类的写的程序,是不是最终也是要转换成汇编的?在看 DLL 注入和 API 拦截时,比如拦截 API 函数吧,比如 GetMessage ,如果截取 API ,那么这样的意思是程序运行后都会调用这个 GetMessage ,这样子是不是说明程序是编译后的代码,也要进行函数的调用之类的,只不过是汇编级的指令调用?就这个问题,表达的不是很清楚,但愿大家能明白!

解决方案 »

  1.   

    程序最后对CPU而言都是机器码(比汇编更底层一些),在看 DLL 注入和 API 拦截时,只是在执行原来的机器码之前 先执行了你注入程序的机器码而已。
      

  2.   

    我们所编写的程序最终都会作为文件存储到磁盘上,这种文件是一种可移植可执行(Portable Executable)的文件,即PE文件,常见的EXE、DLL、OCX、SYS、COM都是PE文件,而不是想象中的那种汇编代码。程序最终执行的是机器码,汇编只不过是比较接近底层的,有助于人们理解的一种表现形式。举个例子,例如一段机器码为B83412,能看出来什么,不了解的人什么也看不出来,而实际上在一定的条件下它所表示的是MOV AX,1234H ,这样只要了解汇编语言就能知道是什么意思了。我们编写的程序实质上就是一堆操作CPU的指令的组合。
      

  3.   

    "DLL注入和API拦截" 应该与 具体的"相关函数的底层机器码"无关,它改变的只是 表示函数的那些代码段 的执行顺序,把 执行目标函数 变成 执行自己的函数,仅此而已,而具体执行的就是 "相关函数的底层机器码"。
      

  4.   

    你说的是 PE 文件吧!代码只是 PE 文件的一部分!一个完整的 PE 文件包括:DOS部分(一般给个不能在dos下运行的提示)文件头(包含了 PE 文件的一些信息)节表以及节(通常有.text.rdata等,还有一些其他段,比如.reloc,机器码通常就保存在.text里面,当然如果用 borland c++ 就不一样了)各个段里面保存什么数据可以到网上去查询!
      

  5.   


    注入的代码可以用高级语言编写,但在电脑里执行的时候都是编译成机器码执行!CPU永远只认机器码!