OllyDBG 之旅 (七)

004010A6  |.  6A 11         push    11                               ; /Count = 11 (17.)
004010A8  |.  68 71214000   push    00402171                         ; |Buffer = cycle.00402171
004010AD  |.  68 E9030000   push    3E9                              ; |ControlID = 3E9 (1001.)
004010B2  |.  FF75 08       push    dword ptr [ebp+8]                ; |hWnd
004010B5  |.  E8 0F020000   call    <jmp.&USER32.GetDlgItemTextA>    ; \GetDlgItemTextA
004010BA  |.  0BC0          or      eax, eax
004010BC  |.  74 61         je      short 0040111F
004010BE  |.  6A 11         push    11                               ; /Count = 11 (17.)
004010C0  |.  68 60214000   push    00402160                         ; |Buffer = cycle.00402160
004010C5  |.  68 E8030000   push    3E8                              ; |ControlID = 3E8 (1000.)
004010CA  |.  FF75 08       push    dword ptr [ebp+8]                ; |hWnd
004010CD  |.  E8 F7010000   call    <jmp.&USER32.GetDlgItemTextA>    ; \GetDlgItemTextA
004010D2  |.  0BC0          or      eax, eax
004010D4  |.  74 49         je      short 0040111F
004010D6  |.  B9 10000000   mov     ecx, 10                                                                           ecx 赋值为 10
004010DB  |.  2BC8          sub     ecx, eax                                                                               =======================
004010DD  |.  BE 60214000   mov     esi, 00402160                    ;  ASCII "11111"
004010E2  |.  8BFE          mov     edi, esi
004010E4  |.  03F8          add     edi, eax
004010E6  |.  FC            cld

减法指令SUB(SUBtract)
指令格式:SUB OPRD1,OPRD2
本指令的功能是进行两个操作数的相减,即从OPRD1中减去OPRD2,其结果放在OPDR1中。指令的类型及对标志位的影响与ADD指令相同,注意立即数不能用于目的操作数,两个存储器操作数之间不能直接相减。操作数可为8位或16位的无符号数或带符号数。
例如:SUB DX,CX
SUB [BX+25],AX
SUB DI,ALFA[SI]
SUB CL,20
SUB DATA1[DI][BX],20A5H

加法指令 ADD(Addition)
指令格式:ADD OPRD1,OPRD2
OPRD1为任一通用寄存器或存储器操作数,可以是任意一个通用寄存器,而且还可以是任意一个存储器操作数。这给程序的编写带来了很大的方便。
OPRD2为立即数,也可以是任意一个通用寄存器操作数。立即数只能用于源操作数。
OPRD1和OPRD2均为寄存器是允许的,一个为寄存器而另一个为存储器也是允许的,但不允许两个都是存储器操作数。理由是指令代码的寻址方式中规定了两个操作数(除立即数)至少有一个是寄存器操作数。
加法指令运算的结果对CF、SF、OF、PF、ZF、AF都会有影响。以上标志也称为结果标志。加法指令适用于无符号数或有符号数的加法运算。操作数可以是8位,也可以是16位。
例如:ADD AL,25;(AL)<--(AL)+25
ADD BX,0A0AH;(BX)<--(BX)+0A0AH
ADD DX,DATA1[BX]
ADD DI,CX;
ADD BETA[BX],AX
ADD BYTE PTR[BX],28
上述每一条指令及第六条指令为字节相加指令,其它四条均为字(双字节)相加指令。


格式:CLD
执行的操作:
该指令使DF=0,在执行串操作指令时,使SI和DI自动增量。


004010DB  |.  2BC8          sub     ecx, eax        即    ecx - eax = 10 - eax (eax 存放用户名的长度)


假设输入的用户名为: 1111111111, 序列号为: 2222222222

004010D6  |.  B9 10000000   mov     ecx, 10                                                                            
004010DB  |.  2BC8          sub     ecx, eax
004010DD  |.  BE 60214000   mov     esi, 00402160            ; 如果此处写为 mov     esi, dword ptr [402160]     那么执行后,ESI 的值为 31313131
004010E2  |.  8BFE          mov     edi, esi
004010E4  |.  03F8          add     edi, eax
004010E6  |.  FC            cld

ecx = 0x10;
ecx = 0x10 - 0x0A
esi = 00402160
edi= 00402160
edi=edi+eax = edi + 10

指令 CLD
 CLD与STD是用来操作方向标志位DF(Direction Flag)。CLD使DF复位,即DF=0,STD使DF置位,即DF=1.用于串操作指令中。
  例如:
  MOVS ( MOVe String) 串传送指令
  MOVSB //字节串传送 DF=0, SI = SI + 1 , DI = DI + 1 ;DF = 1 , SI = SI - 1 , DI = DI - 1
  MOVSW //字串传送 DF=0, SI = SI + 2 , DI = DI + 2 ;DF = 1 , SI = SI - 2 , DI = DI - 2
  执行操作:[DI] = [SI] ,将位于DS段的由SI所指出的存储单元的字节或字传送到位于ES段的由DI 所指出的存储单元,再修改SI和DI, 从而指向下一个元素.

你可能感兴趣的:(OllyDBG 之旅 (七))