欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

你可能不了解的汇编(下)

你可能不了解的汇编(下)

1.ret结束程序和ExitProcess的区别
 
    在堆栈平衡的情况下,用ret结束程序,系统自然会调用ExitThread来结束线程;另外,如果是单线程进程,系统自然还会调用ExitProcess。然而,在这里我要说尽量不要使用ret结束进程或线程,原因如下:
    第一,汇编语言本身的特性使得我们,有可能因编程失误在结束程序前,堆栈并不平衡。
    第二,一些壳可能不清理堆栈,或者某些对二进制代码的二次开发操作的不严谨,也会产生同样的问题。
 
2.masn怎么使用unicode
使用masm库ucmacros.asm,在它里面有的两个宏:WSTR和uni$。自己看一看就明白了,非常容易理解。
 
3.第四种工作模式
Pentium及其后继处理器在“实模式、保护模式、虚拟86模式”基础上,又增加了一个“系统管理模式”,目的是实现对系统供电和系统功能进行管理。
 
4.以编程的角度用汇编实现C语言中的switch
    搞逆向的同志对这个问题再熟悉不过了,当然以编程的角度会略有不同。
[1]分支数较少的实现多个if
一般来说如果分支数少于4个或者分支条件不连续分布,那么我们直接用多个.if来实现就可以,如下:
.code
Start:
  mov eax, xxxx
  cmp eax,0
  je  BRA0
  
cmp eax,1
  je  BRA1
  
cmp eax,2
  je  BRA2
 
  cmp eax,3
  je  BRA3
BRA0:
  .....
BRA1:
  .....
BRA2:
  .....
BRA3:
  .....
End Start
[2]分支数较多的实现跳转表法
采用.if条件二叉分支的方法,虽然简单,但随着分支数的增加,进入最后分支的等待平均时间越来越长,这极大的削弱了汇编语言的优势,为此提出了跳转表法。
具体做法:在内存中开辟一块连续的存储单元作为跳转表,表中按顺序存放各分支的跳转地址,进入分支处理程序前,通过查询跳转表来确定跳转地址。如下:
.Data
BASET dw BAR0,BAR1,BAR2,BAR3,…
.code
mov eax, xxxx
add eax,offset BASET
jmp dword ptr [eax]
BAR0:
  .....
BAR1:
  .....
BAR2:
  .....
BAR3:
  .....
     
5.用汇编实现函数递归调用 
 其实这个很简单了,看下面的代码就可以了
fun proc 
  pushaf
  .....
  cmp  xxx,xxx ;判断是否达到递归终值
  jz    Last
  ..... ;在这里进行某些递归过程内运算
  call  fun;递归调用
  jmp Fun_End
Last:
  .....
  mov xxx,xxx;给递归条件赋予递归终值
Fun_End:
  popaf
  ret
fun endp

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功