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

您现在的位置: 黑客风云 >> 黑客文章 >> 黑客进阶 >> 软件破解 >> 正文
·完美空间提供500M免费AS04-10·企业安全之YY内网准入以04-09
·企业安全之意识与策略04-09·剑走偏锋:IIS漏洞利用04-09
·我来免费网提供100M免费04-09·1122mb.com提供20G超大免04-08
·映像劫持与反劫持技术04-07·让所有"暴力删除工具"无04-07
·入侵88red系统的详细过程04-07·Sql Injection脚本注入终04-07
·vbs+delphi 反弹后门生成04-07·飞讯网提供100MB免费PHP04-07
·突破SQL注入攻击时输入框04-04·结合内核和病毒技术的最04-04
·Real Player rmoc3260.d04-04·亿万网络今月最后为您提04-04
·php+mysql 5 sql inject04-03·Real Player rmoc3260.d04-03
·oblog文件下载漏洞04-03·免费啦提供1G-2G免费全能04-03
·完全解析网页后门和挂马04-02·一句话开3389(只测试过04-02
·萧萧免费空间网提供100M04-02·谷道免费空间网提供1G免04-01
·从本地入手解决双线路由03-31·sablog 1.6 多个跨站漏洞03-31
·富文本编辑器的跨站脚本03-31·Cookie注入是怎样产生的03-31
[推荐]汇编知识: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 
  • 上一篇文章:

  • 下一篇文章:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    VIP 专 区
    Copyright @2006 黑客风云 ●业务联系:QQ 联系怪人 联系奇人 Email:给怪人发邮件 给奇人发邮件
    ICP备案:冀06009886