黑客风云——风云网络
设为首页 加入收藏 我要投稿 网站地图

您现在的位置: 黑客风云 >> 黑客文章 >> 黑客进阶 >> 软件破解 >> 正文
·没有路由密码权限时的鸽08-23·上网安全 Vista自我防范10-11
·让濒临崩溃的Windows XP10-11·有备无患,快速自制救急10-11
·要你好看!Windows看图工10-11·空间赞助网提供不同类型10-11
·讨论net.exe和net1.exe的10-10·让3389远程桌面传输更通10-10
·巧妙入侵渗透赌博站10-10·Aspx空间扫权限工具10-10
·Windows2003最新提权工具10-10·易淘乐提供100M免费全能10-10
·系统开机密码忘了不着急10-09·中意网络提供免费100M免10-09
·与众不同 Windows XP开始10-08·让桌面图标翻跟斗 在XP上10-08
·上海宽元站长资助计划-提10-08·个性化Windows XP的任务10-07
·趣盘提供3G免费网络硬盘10-07·秀山热线提供200MB免费全10-07
·一次艰辛的提权过程10-06·成功入侵IT大卖场的渗透10-06
·mysqlhack- MYSQL利用工10-06·lanker一句话PHP后门客户10-06
·WIXI提供3G免费多媒体网10-06·新人网络提供100M/ftp免10-06
·如何利用QQ带来高流量10-05·UuShare提供免费网络文件10-05
[推荐]汇编知识:32位汇编代码优化
      ★★★★★

汇编知识:32位汇编代码优化

文章整理发布:黑客风云 文章来源:www.05112.com 更新时间:2006-12-2 11:22:32

6.关于push,下面是着重代码体积的优化,因为寄存器操作总要比内存操作要快.
1) mov eax, 50h ;5 bytes
这样就小了1 word
2) push 50h ;2 bytes
pop eax ;1 byte
当操作数只有1字节时候,push只有2 bytes,否则就是5 bytes,记住!
下一个问题,向堆栈中压入7个0
3) push 0 ;2 bytes
push 0 ;2 bytes
push 0 ;2 bytes
push 0 ;2 bytes
push 0 ;2 bytes
push 0 ;2 bytes
push 0 ;2 bytes
占用14字节,显然不能满意,优化一下
4) xor eax, eax ;2 bytes
push eax ;1 byte
push eax ;1 byte
push eax ;1 byte
push eax ;1 byte
push eax ;1 byte
push eax ;1 byte
push eax ;1 byte
可以更紧凑,但会慢一点的形式如下:
5) push 7 ;2 bytes
pop ecx ;1 byte
_label_: push 0 ;2 bytes
loop _label_ ;2 bytes
可以节省7字节....
有时候你可能会从将一个值从一个内存地址转移到另外内存地址,并且要保存所有寄存器:
6) push eax ;1 byte
mov eax, [ebp + xxxx] ;6 bytes
mov [ebp + xxxx], eax ;6 bytes
pop eax ;1 byte
试试push,pop
7) push dword ptr [ebp + xxxx] ;6 bytes
pop dword ptr [ebp + xxxx] ;6 bytes


7.乘法
当eax已经放入被乘数,要乘28h,如何来写?
1) mov ecx, 28h ;5 bytes
mul ecx ;2 bytes
好一点的写法如下:
2) push 28h ;2 bytes
pop ecx ;1 byte
mul ecx ;2 bytes
哇这个更好::
3) imul eax, eax, 28h ;3 bytes
intel在新CPU中提供新的指令并不是摆设,需要你的使用.


8.字符串操作
你如何从内存取得一个字节呢?
速度快的方案:
1) mov al/ax/eax, [esi] ;2/3/2 bytes
inc esi ;1 byte
代码小的方案:
2) lodsb/w/d ;1 byte
我比较喜欢lod因为他小,虽然速度慢了点.

如何到达字符串尾呢?
JQwerty's method:

9) lea esi, [ebp + asciiz] ;6 bytes
s_check: lodsb ;1 byte
test al, al ;2 bytes
jne s_check ;2 bytes

Super's method:

10) lea edi, [ebp + asciiz] ;6 bytes
xor al, al ;2 bytes
s_check: scasb ;1 byte
jne s_check ;2 byte
选择哪一个?Super的在386以下的更快,JQwerty的在486以及pentium上更快,体积一样,选择由你.


9.复杂一点的...
假设你有一个DWORD表,ebx指向表的开始,ecx是指针,你想给每个doword加1,看看如何作:
1) pushad ;1 byte
imul ecx, ecx, 4 ;3 bytes
add ebx, ecx ;2 bytes
inc dword ptr [ebx] ;2 bytes
popad ;1 byte
可以优化一点,但是好像没人用:
2) inc dword ptr [ebx+4*ecx] ;3 bytes
一条指令就节省6字节,而且速度更快,更易读,但好像没有什么人用?...why?
还可以有立即数:
3) pushad ;1 byte
imul ecx, ecx, 4 ;3 bytes
add ebx, ecx ;2 bytes
add ebx, 1000h ;6 bytes
inc dwor ptr [ebx] ;2 bytes
popad ;1 byte
优化为:
4) inc dword ptr [ebx+4*ecx+1000h] ;7 bytes
节省了8字节!
看一下lea指令能为我们干点什么呢?
lea eax, [12345678h]
eax的最后结果是什么呢?正确答案是12345678h.
假设 EBP = 1
lea eax, [ebp + 12345678h]
结果是123456789h....呵呵比较一下:
lea eax, [ebp + 12345678h] ;6 bytes
==========================
mov eax, 12345678h ;5 bytes
add eax, ebp ;2 bytes
5) 看看:
mov eax, 12345678h ;5 bytes
add eax, ebp ;2 bytes
imul ecx, 4 ;3 bytes
add eax, ecx ;2 bytes
6) 用lea来进行一些计算我门将从体积上得到好处:
lea eax, [ebp+ecx*4+12345678h] ;7 bytes
速度上一条lea指令更快!不影响标志位...记住下面的格式,在许多地方善用他们你可以节省时间和空间.
OPCODE <SIZE PTR> [BASE + INDEX*SCALE + DISPLACEMENT]


10.下面是关于病毒重定位优化的,惧毒人士请绕行...
下面的代码你不应该陌生
1) call gdelta
gdelta: pop ebp
sub ebp, offset gdelta
在以后的代码中我们这样使用delta来避免重定位问题
lea eax, [ebp + variable]
这样的指令在应用内存数据的时候是不可避免的,如果能优化一下,我门将会得到数倍收益,打开你的sice或者trw或者ollydbg等调试器,看看:
3) lea eax, [ebp + 401000h] ;6 bytes
假如是下面这样
4) lea eax, [ebp + 10h] ;3 bytes
也就是说如果ebp后面变量是1字节的话,总的指令就只有3字节
修改一下最初的格式变为:
5) call gdelta
gdelta: pop ebp
在某些情况下我们的指令就只有3字节了,可以节省3字节,嘿嘿,让我们看看:
6) lea eax, [ebp + variable - gdelta] ;3 bytes
和上面的是等效的,但是我们可以节省3字节,看看CIH...

上一页  [1] [2] [3] 下一页

文章录入:cainiaowang    责任编辑:cainiaowang 
  • 上一篇文章:

  • 下一篇文章:
  • 【字体:
    Copyright @2006 黑客风云 ●业务联系:QQ 联系怪人 联系奇人 Email:给怪人发邮件 给奇人发邮件
    ICP备案:冀06009886