时间:2025-10-10 13:17 / 来源:未知

  fxcm返佣6. 函数通过调用ret指令返回本文是一篇对x86境况下实行病毒剖判所需的根本反汇编常识的简便总结,更深层的常识还必要实战体会。

  大局部今世谋略机编制机闭(征求x86)正在内部实行上从命冯·诺依曼机闭。这种机闭包蕴3种硬件组件:

  指针(instruction pointer)的寄存器(register)从内存得到要奉行的指令,这个寄存器中存有指令的地点。寄存器是CPU中数据的根基存储单位,通过它,许众光阴CPU不再必要拜候内存,从而精打细算了年华。算术逻辑单位(arithmetic logic unit, ALU)奉行从内存取来的指令,并将结果放到寄存器或内存中。一条条取指令、奉行指令的经过一直反复,就变成了序次的运转。

  **数据** 这个词指的是内存中一 个特定的节,名为数据节 (data section),个中包蕴了一 些值。这些值正在序次初始加载时被放到这里,称为静态值(static value),由于序次运转时它们也许并不爆发变动,还可能称为全体值(global value),由于序次的任何局部都可能应用它们。

  代码节包蕴了正在奉行序次做事时CPU所得到的指令。这些代码决断了序次是做什么的,以及序次中的做事奈何和谐作事。

  堆是为序次奉行时间必要的动态内存计划的,用于创筑(分拨)新的值,以及歼灭(开释)不再必要的值。将其称为动态内存(dynamic memory),是由于其实质正在序次运转时间时时被改造。

  指令是汇编序次的组成块。正在x86、汇编说话中,一条指令由一个助记符,以及零个或众个操作数构成。

  数据的字节序(enclianness)是指正在一个大数据项中,最高位(大端,big-endian)照样最低位(小端,little-enclian)被排正在第一位 (即排正在最低的地点上)。

  内存地点(memory address)操作数指向感风趣的值所正在的内存地点,普通由方括号内包蕴值、寄存器或方程式构成,如[eax]。

  寄存器是可能被CPU应用的少量数据存储器,拜候个中实质的速率会比拜候其他存储器要速。x86处罚器中有一组寄存器,可能用于且则存储或者动作作事区。

  有4个寄存器(EAX、EBX、ECX、EDX)还可能8位值的办法援用,从而应用其最低的8位,或次低的8位。

  通用寄存器普通用于存储数据或内存地点,况且时时互换着应用以已毕序次。不外,固然它们被称为通用寄存器,但它们并不齐全通用。

  少许x86指令只可应用特定的寄存器。比方,乘法和除法指令就只可应用EAX和EDX。

  EFLAGS寄存器是一个象征寄存器。正在x86架构中,它是32位的,每一位是一个象征。正在奉行时间,每一位体现要么是置位(值为1),要么是废除(值为0),并由这些值来限定CPU 的运算,或者给出某些CPU运算的值。

  **CF** 当一个运算的结果相关于主意操作数太大或太小时,CF被置位,不然被废除。

  **SF** 当一 个运算的结果为负数,SF被置位;若结果为正数,SF被废除。对算术运算,当运算结果的最高位值为l时,SF也会被置位。

  **TF** TF用于调试。当它被置位时,x86处罚器每次只奉行一条指令。

  **EIP指令指针** 正在x86架构中,EIP寄存器,又称为指令指针或序次计数器,保全了序次将要奉行的下一条指令正在内存中的地点。EIP的独一功用便是告诉处罚器接下来要做什么。

  留意:当EIP被危害(即指向了一个不包蕴合法序次代码的内存地点 )时,CPU 无法得到一条合法指令来奉行,此时正正在运转的序次就也许破产。当你限定了EIP,也就限定了CPU将要奉行什么,这也便是为什么攻击者试图通过缝隙运用获取对EIP的限定。时时,攻击者先妥使攻击代码进入内存,然后改造EIP使其指向那段代码,从而攻击体系。

  由方括号括起来的操作数是对内存中数据的援用。比方,[ebx]指向内存中地点为EBX处的数据。

  lea指令并非特意用于谋略内存地点。它还被用来谋略浅显的值,由于它所需的指令更少。

  乘法和除法都应用了一个预先原则的寄存器,所以其指令很简便,便是指令码加上寄存器要去乘或除的值。

  mul或div指令要操作的寄存器普通会正在之前很众条指令的地方被赋值,所以你也许必要正在序次的上下文中来寻找。

  mul value指令老是将eax乘上value。所以,EAX寄存器务必正在乘法指令闪现前就赋值好。乘法的结果以64位的地势分散存储正在两个寄存器中:EDX和EAX。个中,EDX存储了高的32位,EAX存储低的32位。

  div value指令将EDX和EAX合起来存储的64位值除以value。所以,正在做除法之前,EDX和EAX这两个寄存器务必赋值好。除法的商将存储到EAX,余数则存储正在EDX中。

  **模(mod)**运算会被编译为正在div指令后取EDX寄存器的值(由于除法保存了余数)

  x86架构还应用逻辑运算符,比方OR、AND和XOR。其相应指令的用法与add和sub形似,对源操作数和方针操作数做相应的操作,并将结果保全正在方针操作数中。

  xor eax, eax就一种将EAX寄存器速捷置0的法子。这么做是为了优化,由于这条指令只必要2个字节,而mov eax, 0必要5个字节。

  shr和shl指令对方针操作数右移或左移,由count决断移众少位。移出方针操作数鸿沟的位则会先挪动到CF象征位中。正在移位时,应用0填充新的位。移位运算一起已毕后,CF象征位中就包蕴结束尾移出方针操作数的那一位。

  轮回移位指令ror和rol与移位指令形似,但移出的那一位会被填到另一端空出来的位上,即右轮回移位(ror)会将最低位轮回移到最高位;左轮回移位Crol)则相反。

  移位时时被用于对乘法运算的优化。因为不必要像乘法那样设备寄存器、挪动数据,移位会更简便、更速。

  正在剖判恶意代码时,要是碰到一个函数中只要xor、or、and、shl、ror、shr、rol云云的指令,而且它们再三闪现,看起来随机布列的花样,就也许是碰到了一个加密或者压缩函数。最好是将其象征为一个加密函数,然后络续后面的剖判。

  这条指令的opcode是Ox90。正在缓冲区溢出攻击中,当攻击者无法圆满地限定运用代码,就时时应用NOP滑板。它起到了填充代码的功用,以下降shellcode也许正在中心局部出手奉行所形成的危险。

  栈是一种用压和弹操作来描摹的数据机闭,向战中压入少许东西,然后再把它们弹出来。

  与栈相闭的指令征求push、pop、call、leave、enter、和ret。正在内存中,栈被分拨成自顶向下的,最高的地点最先被应用。当一个值被压入战时,应用低一点的地点。

  栈只可用于短期存储。它时时用于保全限度变量、参数和返回地点。其重要用处是管束函数挪用之间的数据互换。而差别的编译器对这种管束法子的的确实行有所差别,但大局部常睹商定都应用相对EBP的地点来援用限度变量与参数。

  很众函数包蕴一 段 “序言” (prologue),它是正在函数出手处的少数几行代码,用于保全函数中要用到的栈和寄存器。相应的,正在函数末了的 “结语” (epilogue)则将技和这些寄存器克复至函数被挪用前的状况。

   2. 应用call memory_location来挪用函数。此时,如今指令地点(指EIP寄存器中的实质)被压入栈中。这个地点会正在函数终了后,被用于返回到主代码。当函数出手奉行时,EIP的值被设为memory_location (即函数的开始地点)。

   3. 通过函数的序言局部,分拨栈顶用于限度变量的空间,EBP (基址指针)也被压入栈中。云云就抵达了为挪用函数保全EBP的方针。

   5. 通过函数的结语局部,克复。调理E回来开释限度变量,克复EBP,以使得挪用函数可能确凿地定位它的变量。leave指令可能用作结语,由于它的效用是使ESP等于EBP,然后从栈中弹出EBP。

   6. 函数通过挪用ret指令返回。这个指令会从栈中弹出返回地点给EIP,所以序次会从从来挪用的地方络续奉行。

   7. 调理栈,以移除此前压入的参数,除非它们正在后面还要被应用。

  x86架构还供应了其他弹出和压入的指令,个中最常用的是pusha和pushad。它们将全面的寄存器都压入战中,而且常与popa和popad团结应用,后者从栈中弹出全面的寄存器。

  正在shellcode中,要是要将寄存器确当前状况一起保全正在栈上,以便稍后克复,就常应用这些指令。编译器很少应用它们,所以,看到它们,时时评释是或人手工写的汇编代码或者shellcode。

  test指令与and指令的效用一律,但它并不会窜改其应用的操作数。test指令只设备象征位。

  cmp指令与sub指令的效用一律,但它不影响其操作数。cmp指令也是只用于设备象征位,其奉行结果是,ZF和CF象征位也许爆发变动。

  最常睹的分支指令是跳转指令。序次中应用了巨额的跳转指令,个中最简便的是jmp指令,它使得下一条要被奉行的指令是其格局jmp location中指命名望的指令,又被称为无要求跳转,由于总会跳到方针名望去奉行。这个简便的跳转无法满意全面的跳转需求。

  反复指令是一组操作数据缓冲区的指令。数据缓冲区时时是一个字节数组的地势,也可能是单字或者双字。

  常睹的数据缓冲区操作指令是movsx, cmpsx、stosx和scasx,个中x可能是b、w或者d,分辨体现字节、字和双字。这些指令对任何地势的数据都有用。

  正在这些操作中,应用ESI和EDI寄存器。ESI是源索引寄存器,EDI是方针索引寄存器。另有ECX用作计数的变量。

  这些指令还必要一 个前缀,用于对长度赶过1的数据做操作。movsb指令自己只会挪动一 个字节,而不应用ECX 寄存器。

  正在x86下,应用反复前缀来做众字节操作。rep指令会加添ESI和EDI这两个偏移,裁汰ECX寄存器。rep前缀会一直反复,直至ECX=O。repe/repz和repne/repnz前缀则一直反复,直至ECX=O或直至ZF= 1或0。

  movsb指令用于将一串字节从一个名望挪动到另一 个名望。rep前缀时时与movsb一同应用,从而复制一串长度由ECX 决断的字节。从逻辑上说,rep movsb指令等价于C说话的memcpy函数。movsb指令从ESI指向地点取出一 个字节,将其存入ED I指向地点,然后遵循偏向象征(DF)的设备,将ESI和EDI的值加1或者减1。要是DF=O,则加,不然减。

  正在由C代码编译后的结果中,很少能看到DF象征。然而正在shellcode里,人们有光阴会换取偏向象征,云云就可能反偏向存储数据。要是有rep前缀,就会搜检ECX是否为0,要是不等于0,则指令络续从ESI挪动一个字节到EDI并将ECX 寄存器减1。这个经过会一直反复,直至ECX=0。

  cmpsb指令用于比力两串字节,以确定其是否是沟通的数据。cmpsb指令用ESI指向地点的字减省去EDI指向地点的字节,并更新干系的象征位。它时时与repe前缀一同应用。此时,cmpsb指令一一比力两串字节,直至出现一处差别,或比力到头。cmpsb指令从地点ESI获取一 个字节,将其与ED I指向名望的字节实行比力,并设备象征位,然后对ESI和EDI分辨加1。要是有「epe前缀,就搜检ECX的值和象征位,要是ECX=O或者ZF=O,就甩手反复。这相当于C说话中的memcmp函数。

  scasb指令用于从一串字节中搜罗一 个值。这个值由AL寄存器给出。它的作事办法与cmpsb一律,然而它是将ESI指向地点的字节与AL实行比力,而不是与EDI指向地点的字节比力。repe操作会使得这个比力一直络续,直到找到该字节,或者ECX=O。要是正在这串字节中找到了谁人值,则其名望会被存储正在ESI中。

  stosb指令用于将值存储到EDI指向的地点。它与scasb一律,但不是去搜罗,而是将指定的字节存入EDI指向的地点。rep前缀与scasb一同应用后,就初始化了一段内存缓冲区,个中的每个字节都是沟通的值。这等价于C说话的memset函数。


外汇交易无重复报价,并按实时报价执行交易

通过FXCG MT4交易平台随时随地进入全球市场。