首页
社区
课程
招聘
这段代码都干啥了啊,没整明白
发表于: 2012-4-19 12:57 4832

这段代码都干啥了啊,没整明白

2012-4-19 12:57
4832
13141380  |.  83C9 FF       or      ecx, FFFFFFFF
13141383  |.  8DBD F8FDFFFF lea     edi, dword ptr ss:[ebp-208]                   ;  c:\windows\system32
13141389  |.  33C0          xor     eax, eax
1314138B  |.  8D95 FCFEFFFF lea     edx, dword ptr ss:[ebp-104]
13141391  |.  F2:AE         repne   scas byte ptr es:[edi]
13141393  |.  F7D1          not     ecx
13141395  |.  2BF9          sub     edi, ecx
13141397  |.  8BC1          mov     eax, ecx
13141399  |.  8BF7          mov     esi, edi
1314139B  |.  8BFA          mov     edi, edx
1314139D  |.  8D95 F8FDFFFF lea     edx, dword ptr ss:[ebp-208]
131413A3  |.  C1E9 02       shr     ecx, 2                                        ;  右移两位
131413A6  |.  F3:A5         rep     movs dword ptr es:[edi], dword ptr ds:[esi]
131413A8  |.  8BC8          mov     ecx, eax
131413AA  |.  33C0          xor     eax, eax
131413AC  |.  83E1 03       and     ecx, 3
131413AF  |.  F3:A4         rep     movs byte ptr es:[edi], byte ptr ds:[esi]
131413B1  |.  BF CCD81413   mov     edi, 1314D8CC
131413B6  |.  83C9 FF       or      ecx, FFFFFFFF
131413B9  |.  F2:AE         repne   scas byte ptr es:[edi]
131413BB  |.  F7D1          not     ecx
131413BD  |.  2BF9          sub     edi, ecx
131413BF  |.  8BF7          mov     esi, edi
131413C1  |.  8BD9          mov     ebx, ecx
131413C3  |.  8BFA          mov     edi, edx
131413C5  |.  83C9 FF       or      ecx, FFFFFFFF
131413C8  |.  F2:AE         repne   scas byte ptr es:[edi]
131413CA  |.  8BCB          mov     ecx, ebx
131413CC  |.  4F            dec     edi
131413CD  |.  C1E9 02       shr     ecx, 2
131413D0  |.  F3:A5         rep     movs dword ptr es:[edi], dword ptr ds:[esi]
131413D2  |.  8BCB          mov     ecx, ebx
131413D4  |.  8D95 FCFEFFFF lea     edx, dword ptr ss:[ebp-104]
131413DA  |.  83E1 03       and     ecx, 3
131413DD  |.  F3:A4         rep     movs byte ptr es:[edi], byte ptr ds:[esi]
131413DF  |.  BF B4D81413   mov     edi, 1314D8B4                                 ;  ASCII "\dllcache\linkinfo.dll"
131413E4  |.  83C9 FF       or      ecx, FFFFFFFF
131413E7  |.  F2:AE         repne   scas byte ptr es:[edi]
131413E9  |.  F7D1          not     ecx
131413EB  |.  2BF9          sub     edi, ecx
131413ED  |.  8BF7          mov     esi, edi
131413EF  |.  8BD9          mov     ebx, ecx
131413F1  |.  8BFA          mov     edi, edx
131413F3  |.  83C9 FF       or      ecx, FFFFFFFF
131413F6  |.  F2:AE         repne   scas byte ptr es:[edi]
131413F8  |.  8BCB          mov     ecx, ebx
131413FA  |.  4F            dec     edi
131413FB  |.  C1E9 02       shr     ecx, 2
131413FE  |.  F3:A5         rep     movs dword ptr es:[edi], dword ptr ds:[esi]
13141400  |.  8BCB          mov     ecx, ebx

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 1121
活跃值: (752)
能力值: ( LV5,RANK:66 )
在线值:
发帖
回帖
粉丝
2
or      ecx, FFFFFFFF                                    ;不解释
lea     edi, dword ptr ss:[ebp-208]             ;取字符串首地址
xor     eax, eax         ;eax清零
repne   scas byte ptr es:[edi]                     ;回头看下repne指令,你就明白,这句会让edi指向字符串末尾
not     ecx                                                    ;上一句会更改ecx值,这里取反,ecx为edi指向的字符串长度

……                                         ;中间略去,自己去看吧

shr     ecx, 2                                                                    ;除4,余数不管
rep     movs dword ptr es:[edi], dword ptr ds:[esi]         ;4字节4字节的复制字符串

//字符串长度不是4的整数倍怎么办?于是有了下面

mov     ecx, eax                                                               ;之前有将ecx给eax,这里再恢复ecx
and     ecx, 3                                                                   ;取余
rep     movs byte ptr es:[edi], byte ptr ds:[esi]              ;剩下的1个字节1个字节的复制

我觉得楼主应该明白了。
2012-4-19 14:02
0
雪    币: 297
活跃值: (265)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
3
连接字符串,取dll的绝对路径
2012-4-19 14:27
0
雪    币: 118
活跃值: (106)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
哦?是吗
2012-4-19 14:44
0
雪    币: 1121
活跃值: (752)
能力值: ( LV5,RANK:66 )
在线值:
发帖
回帖
粉丝
5
我按步骤写的详细,你不回复,表示不相信吧。3楼说大白话,你还问是吗?让人怎么回答呢
2012-4-19 14:54
0
雪    币: 118
活跃值: (106)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
6
谢谢。不过你写的是详细,但是没有明白我的意思,三楼是真正的明白我要问啥了。
2012-4-19 15:05
0
雪    币: 1121
活跃值: (752)
能力值: ( LV5,RANK:66 )
在线值:
发帖
回帖
粉丝
7
那你下回碰到了,还是不懂~
2012-4-19 18:50
0
雪    币: 7488
活跃值: (4729)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
在OD中看到一段汇编中有如下指令:
REPNE SCAS BYTE PTR ES:[EDI]
查了下.说是 扫描 ES:[EDI]字符串中的 AL值.值到找到AL值后停止.
听得一知半解.自已用VC写段类似的汇编跟了一下.才算是明白了.

LPSTR pstr="12345678";
DWORD strCount=0;
__asm{
xor eax,eax ;清0 eax.因为这个指令经常是用来得到字符串长度的.C中的字符串又是根据 \0来判断结束的.
or ecx,0xFFFFFFFF;//不明白.... 我是理解为 ecx=-1
mov edi,pstr;// EDI中现在是字符串的首地址了
repne scas BYTE PTR ES:[EDI];//在字符串中查找 AL值(AL=0) 这个指令会让ECX增加,也会让EDI增加.
mov strCount,ecx;//这时的ECX不是长度.是 0xFFFFFFF6 (这应该是表示一个负数)
not ecx ;//这才是正确的数了.这才是正数.(ECX=0x9) 为什么是9 ?因为把最后一个空字符也算进去了.
                //所以一般下面都会跟一句 dec ecx. 来减一.这样才是字符的长度.
sub edi,ecx ;//把EDI 指回字符串的首地址.
mov strCount,ecx
}
2012-4-19 21:39
0
雪    币: 118
活跃值: (106)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
9
[QUOTE=nekaxi;1065403]在OD中看到一段汇编中有如下指令:
REPNE SCAS BYTE PTR ES:[EDI]
查了下.说是 扫描 ES:[EDI]字符串中的 AL值.值到找到AL值后停止.
听得一知半解.自已用VC写段类似的汇编跟了一下.才算是明白了.

LPSTR pstr="12345678...[/QUOTE]

这个看雪里面也有解释的啦
2012-4-20 16:59
0
游客
登录 | 注册 方可回帖
返回
//