计算一段假码的余数存储到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 相当于取反