首页
社区
课程
招聘
[旧帖] [求助]VC内联汇编的问题[已解决] 0.00雪花
发表于: 2011-1-15 22:35 1196

[旧帖] [求助]VC内联汇编的问题[已解决] 0.00雪花

2011-1-15 22:35
1196
char *s;
        _asm{
                push esi
                push eax

                mov esi,[0x0DA3604]
                mov eax,[0x0DA3600]
                //mov eax,[eax+esi*8]    <----这句加进就出错
                pop eax
                pop esi
        }

                m_list.AddString("3333");   //<--------这句是在列表框中加入一项

如果在去掉mov eax,[eax+esi*8]这句,
m_list.AddString("3333");这句可以在列表框中正确加入一项"3333"
反之就没效
我想原因是不是可能[eax+esi*8]这个地址读出错了,导致下面的语言执行错误
请高手回答
如何避免读不可读的内存地址?

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 245
活跃值: (93)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
2
[QUOTE=jstwjw;915963]char *s;
        _asm{
                push esi
                push eax

                mov esi,[0x0DA3604]
                mov eax,[0x0DA3600]
                //mov eax,[eax+esi*8]    <----这句加进就出错
                pop eax
                pop es...[/QUOTE]

答案几乎是肯定的
2011-1-15 23:48
0
雪    币: 114
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
没用过C或者C++,不过听说C++里好像也有try-catch,或者在_asm语句块开始的时候pushad,语句块结束的时候popad,不知道行不行,
2011-1-16 00:12
0
雪    币: 245
活跃值: (93)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
4
他读7ABE620的地址 我看怎么都不大好使
2011-1-16 00:30
0
雪    币: 114
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
mov esi,[0x0DA3604]
mov eax,[0x0DA3600]

不是都有括号吗,
2011-1-16 00:42
0
雪    币: 114
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
感觉或许是那个"*"符号的问题,后面能用乘号不?
楼主慢慢来,一个语句一个语句的写,嘿嘿,汇编不比高级语言呀,
2011-1-16 00:45
0
雪    币: 245
活跃值: (93)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
7
....内联这种括号没用的
2011-1-16 01:13
0
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
8
mov esi,[0x0DA3604]
mov eax,[0x0DA3600]

这两个地址是怎么来的?
你确定这两个地址可读/写吗?
2011-1-16 18:48
0
雪    币: 19
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
已解决,2个原因
          1.内联汇编的mov eax,[0x5fbbb4] 的就是 mov eax,0x5fbbb4
           要从内存取数,改成
                mov eax,        0x5fbbb4
                mov eax,        [eax]
               2.我计算偏移地址出错,后面的地址指向无效址
         
          下面是读内存数据的C语言版 和 汇编语言版
          实现从[[[[[[005fbbb4]+0]+98]+10]+8*n]+0]中读取一个字符串

                //第n条[[[[[[005fbbb4]+0]+98]+10]+8*n]+0]
        int i;
        int n=198;
        char *s;
        /////////////////////内存读取开始C语言
        i=(int)*(int *)(0x5fbbb4);
        i=(int)*(int *)(i+0);
        i=(int)*(int *)(i+0x98);
        i=(int)*(int *)(i+0x10);
        i=(int)*(int *)(i+8*n);
        //字符串类型
        s=(char *)(i);
        /////////////////////内存读取结束
        this->m_list.AddString(s);

        /////////////////////内存读取开始 内联汇编
        _asm{
                mov esi,        199

                //mov eax,        [0x5fbbb4]
                mov eax,        0x5fbbb4
                mov eax,        [eax]

                mov eax,        [eax+0]
                mov eax,        [eax+0x98]
                mov eax,        [eax+0x10]
                mov eax,        [eax+8*esi]
                mov s,eax
        }
        /////////////////////内存读取结束
        this->m_list.AddString(s);
2011-1-19 22:41
0
雪    币: 19
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
////C语言版编译后的代码
10001ACD  |.  C745 F4 C6000>MOV DWORD PTR SS:[EBP-C],0C6
10001AD4  |.  A1 B4BB5F00   MOV EAX,DWORD PTR DS:[5FBBB4]
10001AD9  |.  8945 F8       MOV DWORD PTR SS:[EBP-8],EAX
10001ADC  |.  8B4D F8       MOV ECX,DWORD PTR SS:[EBP-8]
10001ADF  |.  8B11          MOV EDX,DWORD PTR DS:[ECX]
10001AE1  |.  8955 F8       MOV DWORD PTR SS:[EBP-8],EDX
10001AE4  |.  8B45 F8       MOV EAX,DWORD PTR SS:[EBP-8]
10001AE7  |.  8B88 98000000 MOV ECX,DWORD PTR DS:[EAX+98]
10001AED  |.  894D F8       MOV DWORD PTR SS:[EBP-8],ECX
10001AF0  |.  8B55 F8       MOV EDX,DWORD PTR SS:[EBP-8]
10001AF3  |.  8B42 10       MOV EAX,DWORD PTR DS:[EDX+10]
10001AF6  |.  8945 F8       MOV DWORD PTR SS:[EBP-8],EAX
10001AF9  |.  8B4D F4       MOV ECX,DWORD PTR SS:[EBP-C]
10001AFC  |.  8B55 F8       MOV EDX,DWORD PTR SS:[EBP-8]
10001AFF  |.  8B04CA        MOV EAX,DWORD PTR DS:[EDX+ECX*8]
10001B02  |.  8945 F8       MOV DWORD PTR SS:[EBP-8],EAX
10001B05  |.  8B4D F8       MOV ECX,DWORD PTR SS:[EBP-8]
10001B08  |.  894D F0       MOV DWORD PTR SS:[EBP-10],ECX
10001B0B  |.  8B55 F0       MOV EDX,DWORD PTR SS:[EBP-10]
10001B0E  |.  52            PUSH EDX
10001B0F  |.  8B4D FC       MOV ECX,DWORD PTR SS:[EBP-4]
10001B12  |.  83C1 60       ADD ECX,60
10001B15  |.  E8 96030000   CALL ildll.?AddString@CListBox@@QAEHPBD@Z       ;  JMP 到 MFC42D.#1021

/////内联汇编汇编后的代码
10001B1A  |.  BE C7000000   MOV ESI,0C7
10001B1F  |.  B8 B4BB5F00   MOV EAX,5FBBB4
10001B24  |.  8B00          MOV EAX,DWORD PTR DS:[EAX]
10001B26  |.  8B00          MOV EAX,DWORD PTR DS:[EAX]
10001B28  |.  8B80 98000000 MOV EAX,DWORD PTR DS:[EAX+98]
10001B2E  |.  8B40 10       MOV EAX,DWORD PTR DS:[EAX+10]
10001B31  |.  8B04F0        MOV EAX,DWORD PTR DS:[EAX+ESI*8]
10001B34  |.  8945 F0       MOV DWORD PTR SS:[EBP-10],EAX
10001B37  |.  8B45 F0       MOV EAX,DWORD PTR SS:[EBP-10]
10001B3A  |.  50            PUSH EAX
10001B3B  |.  8B4D FC       MOV ECX,DWORD PTR SS:[EBP-4]
10001B3E  |.  83C1 60       ADD ECX,60
10001B41  |.  E8 6A030000   CALL ildll.?AddString@CListBox@@QAEHPBD@Z       ;  JMP 到 MFC42D.#1021
2011-1-19 23:05
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
学习了 ~~
2011-1-20 00:30
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
mov eax,[eax+esi*8]
这个[eax+esi*8] 里没有值会报错的
2011-1-20 00:36
0
雪    币: 19
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
使用寄存器定义变量,再用Release编译后就是下面的代码,和用内联汇编的一样
定义寄存器变量加个前缀,如 register int i;
100014B1  |.  A1 B4BB5F00   mov     eax, dword ptr [5FBBB4]
100014BC  |.  8B08          mov     ecx, dword ptr [eax]
100014BE  |.  8B91 98000000 mov     edx, dword ptr [ecx+98]
100014C4  |.  8B8F 80000000 mov     ecx, dword ptr [edi+80]
100014CA  |.  8B42 10       mov     eax, dword ptr [edx+10]
100014CD  |.  8B80 30060000 mov     eax, dword ptr [eax+630]
2011-1-20 09:12
0
雪    币: 19
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
VC++6 试验了内联汇编几条语句
mov eax,        dword ptr ds:[0x5fbbb4]
mov eax,         ds:[0x5fbbb4]

编译后是:mov eax,[5fbbb4]

mov eax,        dword ptr [0x5fbbb4]
mov eax,         [0x5fbbb4]
mov eax,        0x5fbbb4

编译后是:mov eax,5fbbb4

所以要从内存读取,一定不能省了段前缀 ds:
2011-1-20 14:34
0
雪    币: 384
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
学习了 还是高级语言方便啊
2011-1-20 14:51
0
游客
登录 | 注册 方可回帖
返回
//