段寄存器:
cs代码段,ds数据段,ss堆栈段,es附加段
在Win32编程中段的概念已经不重要了!而在Crack时你总不会是在调是dos时代的程序吧!-!
4.0 常用汇编指令
mov ax,cx <-很常用了,把cx的值送入ax中,cx值保持不变
cmp eax,ecx<-很常见了吧,比较eax和ecx,置标志位!方法前面说过了
xor eax,eax<-看这个,eax与自己异或,是清零的操作!
lea eax,str<-并不传送数据,只传送该数据的地址,将str字符串的地址传到eax
push eax <-进栈操作,前面说过了,eax进栈
pop ebx <-出栈操作,前面也说了,弹出位于栈顶的数据存入ebx
ADD 加法指令 格式:ADD DST,SRC 执行的操作:(DST)<-(SRC)+(DST)
SUB 减法指令 格式:SUB DST,SRC 执行的操作:(DST)<-(DST)-(SRC)
MUL 无符号乘法指令 格式: MUL SRC 执行的操作:字节操作(AX)<-(AL)*(SRC);字操作(DX,AX)<-(AX)*(SRC);双字操作:(EDX,EAX)<- (EAX)*(SRC)
DIV 无符号除法指令 格式:DIV SRC 执行的操作:字节操作:16们被除数在AX中,8位除数为源操作数,结果的8位商在AL中,8位余数在AH中 。表示为:
(AL)<-(AX)/(SRC)的商,(AH)<-(AX)/(SRC)的余数。字操作:32位被除数在DX,AX中。其中DX为高位字,16位除数为源操作数,结果的16 位商 在AX中,16位余数在DX中。表示为:(AX)<-(DX,AX)/(SRC)的商,(DX)<-(DX,AX)/(SRC)的余数。
nop <- 无操作,去掉指令用的吧!去掉一个跳转,让程序直接往下走,就到注册成功处啦(扯远了````)
call <- 调用子程序或函数用的
关于跳转指令,可以查看汇编速查手册,别强迫自己把所有的都一下记住,浪费精力,不懂时再查一下,久了就记住了!
5.0 高级语言程序的汇编浅解析
汇编语言要和硬件直接打交道,写病毒是方便点啦!!而在高级语言中,如C中我们要面向的是问题的解决,对于硬件资源操作,编译器搞定了!在这里稍微讲一下高级语言中与反汇编代码相应的一些地方:
1、定义变量
int a;
一个变量其实是存放在一个内存地址里,如果对a进行赋值"a=10",在反汇编中就有可能表现为:
mov word ptr[007e58c2],A
像这个样子,而a所对应的内存地址就是0x007e58c2了,当然是乱写的一个地址而已,系统怎样分配?(天知道...)
2、比如一个数组
char str[]="hello";
占用了6个字节,最后一个是以0结尾的空字节,数组名可以当做数组的指针!str[0]='h',str[0]相应一个变量地址,比如为[0040e123],那么[0040e124]就为'e',[0040e125]就为'l'....了`
3、指针
char *p;
指针也是一个变量,所以它也对应一个内存地址!但访问时应该是访问其指向的内存地址的内容,而不是这个指针变量的内容,其内容只是一个地址而已!假如该指针变量地址为007e1000,那么语句p=a,这句在高级语言里是让指针p指向a这个内存单元!p里的内容是a的地址,*p实际上是a的内容了!而反汇编有可能表现成这样:
mov [007e1000],007e2000<-假如007e2000为变量a的地址,那么就是把a的地址传到007e1000这个内容里了!
4、函数调用
sub(a,b);
假如sub是自定义的一个减法函数,作用为参数一减去参数二,上面语句为在C中调中时传递参数!前面有说过了,Win32平台下函数调用的参数是通过堆栈来传递的,那么反汇编就是:
(假如a=2,b=1)
mov eax,2
mov ebx,1
push eax
push ebx
call 取地址(sub)
.......
-----------------------------------------------------------------------------------------------
好了,最后感谢大家能看完这篇了了草草的东西,我也回顾了不少知识!在本人能力范围内的事不知道对新手们有没有帮助,还有一点要提醒各位新手,如果真想学好Crack学通Crack这门知识的话,不完全了解汇编是不行的!所以在看了我这篇之后如果能激起你学汇编的信心是最好的!要不等到Crack遇到什么问题时才再想回过头学汇编,那很难!~
上一页 [1] [2]