首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 网络安全 > 黑客技术 > Win32Asm快速教程(7)
【标  题】:Win32Asm快速教程(7)
【关键字】:in,教程,Win,Win32,32,Wi,Win32Asm
【来  源】:网络

Win32Asm快速教程(7)

值 00 01 02 03 ... 7F 80 ... FC FD FE FF
无符号意义 00 01 02 03 ... 7F 80 ... FC FD FE FF
有符号意义 00 01 02 03 ... 7F -80 ... -04 -03 -02 -01


因此,在有符号数中,一个byte被分为两段:0~7F用于正值。80~FF用于负值。对于dword值,它也一样:0~7FFFFFFFh为正,80000000~FFFFFFFFh为负,正如你可能已经注意到的一样,负值的最高位有一个集合,因为它们比80000000h大。这位被称为符号位。

3.1-有符号或无符号?
你和处理器都不能看出一个值是signed还是unsigned。好消息是对于加法和减法来说,一个数是signed还是unsigned没有关系。

计算:-4+9

FFFFFFFC+00000009=00000005(这是对的)

计算:5-(-9)

00000005-FFFFFFF7=0000000E(这也是对的,5――9=4)

坏消息是对于乘法,除法和比较(compare)并不是这样。因此,对于signed数有特殊的乘除伪代码:imul和idiv

Imul也有一个比mul好的地方在于它可以接受直接数值:

imul src
imul src, immed
imul dest,src, 8-bit immed
imul dest,src

idiv src

它们几乎和mul,div一样,只是它们可以计算signed值。比较(compare)可以和unsigned一样用。但标志作不同的设置。因此,对于符号和无符号数字有不同的jump指令:

cmp ax, bx
ja somewhere

ja是一个无符号跳转指令。如果大于就跳转。考虑这个ax=FFFFh(无符号时为FFFFh,有符号时为-1)和bx=0005h(无符号时为5,有符号时为5)。由于FFFFh在无符号时比0005大,ja指令会跳转,但如果用的是jg(指一个有符号跳转):

cmp ax, bx
jg somewhere

jg指令不会跳转,因为-1不比5大。

只要记住这点:

一个数字是有符号还是无符号取决于你怎样对待这个数。


9.0-更多的伪代码
这儿有更多的伪代码

TEST


Test对两个参数(目标,源)执行AND逻辑操作,并根据结果设置标志寄存器。结果本身不会保存。Test用来测试一个位,例如寄存器:

test eax, 100b;b后缀意为二进制
jnz bitset

如果eax右数第三个位被设置了,jnz将会跳转。Test的一个非常普遍的用法是用来测试一方寄存器是否为空:

test ecx, ecx
jz somewhere

如果ecx为零,Jz跳转

关于栈的伪代码


在我讲栈的伪代码之前,我会先解释什么是栈。栈是内存的一个地方,esp为指向栈的指针。栈是用来保存临时数值的地方,有两个指令来放入一个指和再把它取出来:push和pop。Push把一个指压入栈。Pop再把它弹出来。最后一个放入的值最先出来。一个值被放入栈中,栈指针步减,当它移出来的时候,栈指针步增。看这个例子:

(1) mov ecx, 100
(2) mov eax, 200
(3) push ecx ; save ecx
(4) push eax
(5) xor ecx, eax
(6) add ecx, 400
(7) mov edx, ecx
(8) pop ebx
(9) pop ecx

解释
1、 把100放入ecx中
2、 把200放入eax中
3、 把ecx(等于100)压入栈中(第一个压入)
4、 把eax(等于200)压入栈中(最后压入)
5、 /6/7:对ecx执行操作,使ecx的值改变
8、 弹出ebx:ebx成为200(最后压入,最先弹出)
9、 弹出ecx:ecx又成为100(最先压入,最后弹出)

为了说明再压栈和弹栈时,内存中发生了什么,看下图:

Offset 1203 1204 1205 1206 1207 1208 1209 120A 120B
值 00 00 00 00 00 00 00 00 00


ESP

(栈在这里是初始化为0,但实际上并不是这样。ESP表示ESP指向的offset)

mov ax, 4560h
push ax

Offset 1203 1204 1205 1206 1207 1208 1209 120A 120B
值 00 00 60 45 00 00 00 00 00


ESP

mov cx, FFFFh
push cx

Offset 1203 1204 1205 1206 1207 1208 1209 120A 120B
值 FF FF 60 45 00 00 00 00 00


ESP

pop edx

Offset 1203 1204 1205 1206 1207 1208 1209 120A 120B
值 FF FF 60 45 00 00 00 00 00


ESP

edx现在是 4560FFFFh 了.

CALL和RET


Call跳转到某段代码而且一发现RET指令就返回。你可以把它们看成在其他编程语言中的函数或子程序。例如:

……代码……
call 0455659
……更多代码……

455659处的代码:

add eax, 500
mul eax, edx
ret

当执行这条指令时,处理器跳到455659处的代码,执行指令一直到ret为止,并返回到调用处的下一条。Call跳转到的代码被成为过程(procedure)。你可以把你反复使用的代码写进一个过程并在你每次需要它的时候调用。

开发工具大比拼visual c++ vs delphi---(一):【上一篇】
Win32Asm快速教程(6):【下一篇】
【相关文章】
  • Win32Asm快速教程(8)
  • Win32Asm快速教程(9)
  • Win32Asm快速教程(10)
  • Win32Asm快速教程(11)
  • Win32Asm快速教程(12)
  • Win32Asm快速教程(13)
  • Win32Asm快速教程(14)
  • win9x/Winnt/Win2k/Winxp病毒技术探讨 上
  • win9x/Winnt/Win2k/Winxp病毒技术探讨 下
  • WinNT & Win2K下实现进程的完全隐藏
  • 【随机文章】
  • 非常惭愧,还是学习不够多!
  • 热点宽带接入技术--DSL面面谈
  • 荡神志 无限金钱获得心得
  • WebSphere 在linux下的安装配置过程
  • 呵呵 正式学习ACM一个月了 留个纪念吧~
  • 病毒 Backdoor/Agobot.akz“高波变种”akz
  • Ubuntu 上利用 subclipse 访问 SVN
  • shell基础十二:tr
  • MAYA 初级柔体教程
  • 通过WebService管理多个数据库
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.