记录:一些有意思的汇编片段

计算一段假码的余数存储到edi+ebx中:

00401664  |.  B9 0A000000   mov ecx,0xA                              ;  把0xA 赋值给ecx
00401669  |>  0FBE041E      /movsx eax,byte ptr ds:[esi+ebx]         ;  将 假码的第一个字节的机器码 赋值给eax
0040166D  |.  99            |cdq                                     ;  扩展命令
0040166E  |.  F7F9          |idiv ecx                                ;  edx 和 eax合并 除以0xA 商放在eax 余数放在edx
00401670  |.  88141F        |mov byte ptr ds:[edi+ebx],dl            ;  将 余数edx 赋值给edi+ebx(用来存储 修改过的假码)
00401673  |.  43            |inc ebx                                 ;  ebx递增1
00401674  |.  3B1D 67344000 |cmp ebx,dword ptr ds:[0x403467]         ;  判断当前的长度是否跟假码的长度相同
0040167A  |.^ 75 ED         \jnz short 软编码序.00401669                 ;  不同 跳回去

用来检测调试:

7C81F424 >  64:A1 18000000  MOV EAX,DWORD PTR FS:[18]
7C81F42A    8B40 30         MOV EAX,DWORD PTR DS:[EAX+30]
7C81F42D    0FB640 02       MOVZX EAX,BYTE PTR DS:[EAX+2]

可以用于进行判断跳转

7411EA99   .  66:83F8 00    CMP AX,0                                 ;  影响ZF的标志位
7411EA9D   >  B8 00000000   MOV EAX,0                                ;  EAX 为0
7411EAA2   .  0F94C0        SETE AL                                  ;  根据ZF标志位判断,如果ZF为1那么al为1,ZF为0,那么al为0
7411EAA5   .  F7D8          NEG EAX                                  ;  0 - eax的值赋值给eax 相当于取反

你可能感兴趣的:(记录:一些有意思的汇编片段)