1.下载一个二进制编辑器(网上很多下载,google一下即可,也叫十六进制编辑器),他能直接对二进制数进行编辑(甚至不用下载,网上有在线的编辑器)。如果你对(某种处理器的)机器码非常熟悉的话,理论上可以用二进制编辑器完成(此处理器上的)任何软件的制作,小至一个计算器,大至一个编译器,操作系统(因为所有软件本质上都是CPU的机器指令和一些数据组成)。但是不同类型CPU的机器码是不一样的。当然,实际上用一个二进制编辑器编写一个windows操作系统是不可能的,就像“只要有了纸和笔,什么优秀的小说都能创造出来”,纸和笔不过是纸和笔而已,他们对创造优秀的小说帮不了多大的忙。
一般注册的软件都是要输入验证码,
if(Check_Code!="1a2db3d45679"){//这里简化了,实际是个验证码算法。
MessageBox("验证码不正确!");
return;
}对软件的破解就是找到MessageBox的地址,jmp出去即可。
2.我们可以二进制编辑器生成img镜像文件。
QMENU免费PC模拟器。
copy helloos.img ..\z_tools\qemu\fdimage0.bin
..\z_tools\make.exe -C ..\z_tools\qemu
//将helloos.img镜像文件拷贝复制并重命名为fdimage0.bin,用qemu仿真运行。
3.究竟做了什么?
电脑的核心是CPU,他只能与外部电路进行电信号的交换。电信号在此指高低电平,分别用1和0来表示。我们平时用电脑听音乐,玩游戏,上网,本质上不过是在与CPU交换电信号而已。CPU只会机械地进行电信号的转换。算数逻辑运算,mov,jmp都是电信号的转换。抽象的讲,CPU只认识0和1两个数字,我们想要他表达英文字母a,怎么办?我们就需要编码,将字母a编码为一系列的0101,ascii码中a编码为01100001,所有的字母,汉字都被编码,文字、图片、视频...所有我们在显示器上看到的一切都被编码为0101串。
显示器仅仅是一个输出设备,他由一些点组成,叫像素点,我们所说的分辨率比如1060*900,就是他的长有1060个点,宽有900个点,我们可以知道点数越多(分辨率越高),图像显示越清晰(可以自己试下)。要显示图像我们需要对像素点编码,比如一个像素点3个字节,所以共需存储器(1060*900*3字节),这种存储器在显卡里,叫显存。CPU把要我们把要显示的存储到显存中,实时显示。我们在键盘上输入一个字母,CPU中断马上感应到,并把他写入显存,显存立马显示。
GUI编程对软件来说没什么大的技术含量,因为都已经有相应的API了(对于显存的工作原理我们甚至根本不需了解),软件设计主要的是数据结构和算法。
计算与通讯是计算机的本质,计算的是什么?是设计好的数据结构,怎么高效地计算?要有好的算法!
我们通过输入设备(鼠标、键盘、传感器等)输入要处理的数据,处理器处理它,然后进行输出到输出设备(磁盘等存储器、显示器、网络)。
通讯怎样完成?PC内部通讯由总线完成(总线-数据总线DB,地址总线AB,控制总线CB),网络通讯由同轴电缆,光纤完成,无线通讯由电磁波完成。
抽象地看,网络只是一个IO设备,我们用QQ向对方发“你好”发生了什么?首先,机器将“你好”编码为0101串,通过网线、光纤等传输介质发送到对方的电脑,对方的电脑将0101串解码为“你好”,并显示在屏幕上。
好像越扯越远了...回归正题。
4. 初次体验汇编程序
作者用的汇编器是他自己编写的nask(作者编写了很多工具软件,真是佩服!!!),很多语法模仿了著名的NASM汇编器(我们学汇编基本是用的MASM)。Nasm是一个开源软件,网上很多开源软件,其实只要自己有兴趣和毅力,可以学到非常多的东西。比如开源OS:linux,开源浏览器myieCODE,开源编译器汇编器更是举不胜举,最近流行的比特币代码也是开源的。还有很多好书,比如《大话CPU》《自制编程语言》《编码的奥秘》。。。都可以再网上免费下载到。可惜中国的程序员大多浮躁的很(包括我,惭愧惭愧...)。
很喜欢下面这段话:
在信息时代客观障碍已不复存在,所谓障碍都是主观上的.如果你想研发什么新的技术你不需要几百万美元的资金,你只需要在冰箱里放满比萨和可乐,再有一台便宜的计算机和与之献身的决心,你即可拥有任何你想拥有的编程境界。 - John Carmack
随便用个编辑器(记事本,UE,Editplus,Notepad++,vim等均可),我个人喜欢Notepad++,Linux下vim只懂得一点皮毛,惭愧惭愧。
输入:
DB 0xeb,0x00,0xeb,0x00,xeb,0x00,0xeb,0x00
DB 0xeb,0x00,0xeb,0x00,xeb,0x00,0xeb,0x00
....
保存为helloos.nas,然后用汇编器汇编即可生成和二进制编辑器编辑的一样的效果。汇编器仅仅是一个文本转换工具而已,将一条汇编指令转换为对于的机器指令。
同理,编译器也是一个文本转换工具,将代码:
#include <stdio.h> main(){printf("Hello,Ununtu!");}; 最终转换为一系列机器指令。
对于机器指令,我们可以反汇编转换为汇编指令,因为他们一一对应,但是没法将机器指令转换为C,java等高级语言代码(不一一对应)。
DB 就是Date Byte的简写,我喜欢简称为Define Byte,就是定义一个字节。
DW :data word. DD:data double-word.
RESB 16 ;Reserve byte 预留16个字节0.
每次进行汇编编译很麻烦,我们写一个批处理文件,每次点击它即可,这是自动化的第一步(Linux编译由众多的makefile组成,配置好后,可以很简单的对Linux源码进行编译,以便配置自己独一无二的Linux操作系统)。
Asm.bat内容:
..\z_tools\nask.exe helloos.nas helloos.img ;运行汇编器nask.exe将helloos.nas汇编为 helloos.img。
启动存储器(软盘,磁盘,U盘,光驱均可)第一个扇区称为启动区,他的最后两个字节,510,511字节固定为:0x55,0xAA。一个扇区固定为512字节。
---计算机首先从存储器读第一个扇区,如果他的最后两个字节是55aa,则此存储器为启动存储器(操作系统在其中),开始运行第一个扇区的启动程序;如果不是,则继续查找下一个存储器(软盘,光驱,U盘等)。
IPL:Initial Program Loader,启动程序加载器,将OS加载到内存中。 55aa:启动存储器
---Do one thing and do it well.
2013-12-21