鱼C论坛

 找回密码
 立即注册
查看: 3204|回复: 9

[已解决]关于 [寄存器] 问题

[复制链接]
发表于 2018-6-25 16:23:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 理想小青年 于 2018-6-25 16:25 编辑

当初在学习的时候如果没记错 老甲鱼话说:括号里面[] 只能是bp,bx,si,di这四个,si di 源与目的  bx通常与ds  bp通常为ss搭配  而且搭配也是有注意 两个基地址存储器就会报错
问题:如图(OS 32位Wdindows7)[ebp+ecx-idata]???ecx-8,为什么把cx通用寄存器拿过来了  因为32位的问题? YYCQ33P)27OG(0S`PVLF)54.png xor与 mov一直没有理解透彻求一些有心得的大佬指点一下
_2YLW`J9]N3IQ{4_076R@]7.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-6-25 16:24:11 | 显示全部楼层
@人造人 来看看男神
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-25 16:43:17 | 显示全部楼层    本楼为最佳答案   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-25 17:09:14 | 显示全部楼层
人造人 发表于 2018-6-25 16:43
https://blog.csdn.net/paxhujing/article/details/78177903

就你优秀 五星好评
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-25 17:13:12 | 显示全部楼层
1.png
2.png
3.png
4.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-25 17:15:24 | 显示全部楼层
5.png
#include <stdio.h>

int main(void)
{
        _asm
        {
                pushad

                mov        eax, 100        ; 0110_0100
                mov        ebx, 115        ; 0111_0011
                xor        eax, ebx        ; 0001_0111

                popad
        }

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-25 19:21:41 | 显示全部楼层

弄懂了 异或 看完你的二进制 一开始想与运算 或运算  又查了查函数xor  这个主要用于什么地方 相同为0,不同为1  是为了干些什么男神
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-25 19:30:32 | 显示全部楼层
理想小青年 发表于 2018-6-25 19:21
弄懂了 异或 看完你的二进制 一开始想与运算 或运算  又查了查函数xor  这个主要用于什么地方 相同为0, ...

异或的用途?
这个有好多,最容易想到的就是加密与解密了吧 ^_^

看下面代码

1.png
#include <stdio.h>

int main(void)
{
        char str[] = "hello world!";
        const unsigned char key = 0xA5;                // 密匙

        for(int i = 0; str[i]; ++i)
                str[i] ^= key;                        // 用密匙加密

        printf("%s\n", str);

        for(int i = 0; str[i]; ++i)
                str[i] ^= key;                        // 用密匙解密

        printf("%s\n", str);
        
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-25 19:34:36 | 显示全部楼层
出于兴趣,那就看看反汇编吧 ^_^
#include <stdio.h>

int main(void)
{
00E68FB0 55                   push        ebp  
00E68FB1 8B EC                mov         ebp,esp  
00E68FB3 81 EC 00 01 00 00    sub         esp,100h  
00E68FB9 53                   push        ebx  
00E68FBA 56                   push        esi  
00E68FBB 57                   push        edi  
00E68FBC 8D BD 00 FF FF FF    lea         edi,[ebp-100h]  
00E68FC2 B9 40 00 00 00       mov         ecx,40h  
00E68FC7 B8 CC CC CC CC       mov         eax,0CCCCCCCCh  
00E68FCC F3 AB                rep stos    dword ptr es:[edi]  
00E68FCE A1 20 70 F1 00       mov         eax,dword ptr [__security_cookie (0F17020h)]  
00E68FD3 33 C5                xor         eax,ebp  
00E68FD5 89 45 FC             mov         dword ptr [ebp-4],eax  
        char str[] = "hello world!";
00E68FD8 A1 40 41 EF 00       mov         eax,dword ptr [string "hello world!" (0EF4140h)]  
00E68FDD 89 45 E8             mov         dword ptr [str],eax  
00E68FE0 8B 0D 44 41 EF 00    mov         ecx,dword ptr ds:[0EF4144h]  
00E68FE6 89 4D EC             mov         dword ptr [ebp-14h],ecx  
00E68FE9 8B 15 48 41 EF 00    mov         edx,dword ptr ds:[0EF4148h]  
00E68FEF 89 55 F0             mov         dword ptr [ebp-10h],edx  
00E68FF2 A0 4C 41 EF 00       mov         al,byte ptr ds:[00EF414Ch]  
00E68FF7 88 45 F4             mov         byte ptr [ebp-0Ch],al  
        const unsigned char key = 0xA5;                // 密匙
00E68FFA C6 45 DF A5          mov         byte ptr [key],0A5h  

        for(int i = 0; str[i]; ++i)
00E68FFE C7 45 D0 00 00 00 00 mov         dword ptr [ebp-30h],0  
00E69005 EB 09                jmp         main+60h (0E69010h)  
00E69007 8B 45 D0             mov         eax,dword ptr [ebp-30h]  
00E6900A 83 C0 01             add         eax,1  
00E6900D 89 45 D0             mov         dword ptr [ebp-30h],eax  
00E69010 8B 45 D0             mov         eax,dword ptr [ebp-30h]  
00E69013 0F BE 4C 05 E8       movsx       ecx,byte ptr str[eax]  
00E69018 85 C9                test        ecx,ecx  
00E6901A 74 17                je          main+83h (0E69033h)  
                str[i] ^= key;                        // 用密匙加密
00E6901C 0F B6 45 DF          movzx       eax,byte ptr [key]  
00E69020 8B 4D D0             mov         ecx,dword ptr [ebp-30h]  
00E69023 0F BE 54 0D E8       movsx       edx,byte ptr str[ecx]  
00E69028 33 D0                xor         edx,eax  
00E6902A 8B 45 D0             mov         eax,dword ptr [ebp-30h]  
00E6902D 88 54 05 E8          mov         byte ptr str[eax],dl  
00E69031 EB D4                jmp         main+57h (0E69007h)  

        printf("%s\n", str);
00E69033 8D 45 E8             lea         eax,[str]  
00E69036 50                   push        eax  
00E69037 68 F0 3E EF 00       push        offset string "%s\n" (0EF3EF0h)  
00E6903C E8 5F 2D FF FF       call        _printf (0E5BDA0h)  
00E69041 83 C4 08             add         esp,8  

        for(int i = 0; str[i]; ++i)
00E69044 C7 45 C4 00 00 00 00 mov         dword ptr [ebp-3Ch],0  
00E6904B EB 09                jmp         main+0A6h (0E69056h)  
00E6904D 8B 45 C4             mov         eax,dword ptr [ebp-3Ch]  
00E69050 83 C0 01             add         eax,1  
00E69053 89 45 C4             mov         dword ptr [ebp-3Ch],eax  
00E69056 8B 45 C4             mov         eax,dword ptr [ebp-3Ch]  
00E69059 0F BE 4C 05 E8       movsx       ecx,byte ptr str[eax]  
00E6905E 85 C9                test        ecx,ecx  
00E69060 74 17                je          main+0C9h (0E69079h)  
                str[i] ^= key;                        // 用密匙解密
00E69062 0F B6 45 DF          movzx       eax,byte ptr [key]  
00E69066 8B 4D C4             mov         ecx,dword ptr [ebp-3Ch]  
00E69069 0F BE 54 0D E8       movsx       edx,byte ptr str[ecx]  
00E6906E 33 D0                xor         edx,eax  
00E69070 8B 45 C4             mov         eax,dword ptr [ebp-3Ch]  
00E69073 88 54 05 E8          mov         byte ptr str[eax],dl  
00E69077 EB D4                jmp         main+9Dh (0E6904Dh)  

        printf("%s\n", str);
00E69079 8D 45 E8             lea         eax,[str]  
00E6907C 50                   push        eax  
00E6907D 68 F0 3E EF 00       push        offset string "%s\n" (0EF3EF0h)  
00E69082 E8 19 2D FF FF       call        _printf (0E5BDA0h)  
00E69087 83 C4 08             add         esp,8  
        
        return 0;
00E6908A 33 C0                xor         eax,eax  
}
00E6908C 52                   push        edx  
00E6908D 8B CD                mov         ecx,ebp  
00E6908F 50                   push        eax  
00E69090 8D 15 BC 90 E6 00    lea         edx,ds:[0E690BCh]  
00E69096 E8 AB 22 FF FF       call        @_RTC_CheckStackVars@8 (0E5B346h)  
00E6909B 58                   pop         eax  
00E6909C 5A                   pop         edx  
00E6909D 5F                   pop         edi  
00E6909E 5E                   pop         esi  
00E6909F 5B                   pop         ebx  
00E690A0 8B 4D FC             mov         ecx,dword ptr [ebp-4]  
00E690A3 33 CD                xor         ecx,ebp  
00E690A5 E8 87 23 FF FF       call        @__security_check_cookie@4 (0E5B431h)  
00E690AA 81 C4 00 01 00 00    add         esp,100h  
00E690B0 3B EC                cmp         ebp,esp  
00E690B2 E8 CC 12 FF FF       call        __RTC_CheckEsp (0E5A383h)  
00E690B7 8B E5                mov         esp,ebp  
00E690B9 5D                   pop         ebp  
00E690BA C3                   ret  

这是加密部分
                str[i] ^= key;                        // 用密匙加密
00E6901C 0F B6 45 DF          movzx       eax,byte ptr [key]  
00E69020 8B 4D D0             mov         ecx,dword ptr [ebp-30h]  
00E69023 0F BE 54 0D E8       movsx       edx,byte ptr str[ecx]  
00E69028 33 D0                xor         edx,eax  
00E6902A 8B 45 D0             mov         eax,dword ptr [ebp-30h]  
00E6902D 88 54 05 E8          mov         byte ptr str[eax],dl  
00E69031 EB D4                jmp         main+57h (0E69007h)  

这是解密部分
                str[i] ^= key;                        // 用密匙解密
00E69062 0F B6 45 DF          movzx       eax,byte ptr [key]  
00E69066 8B 4D C4             mov         ecx,dword ptr [ebp-3Ch]  
00E69069 0F BE 54 0D E8       movsx       edx,byte ptr str[ecx]  
00E6906E 33 D0                xor         edx,eax  
00E69070 8B 45 C4             mov         eax,dword ptr [ebp-3Ch]  
00E69073 88 54 05 E8          mov         byte ptr str[eax],dl  
00E69077 EB D4                jmp         main+9Dh (0E6904Dh)  

然后,你发现了什么? ^_^
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-26 10:48:58 | 显示全部楼层
人造人 发表于 2018-6-25 19:34
出于兴趣,那就看看反汇编吧 ^_^

Good man
Have to understand
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-28 09:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表