首页
社区
课程
招聘
[旧帖] 求助一段代码看不懂,主要用途 0.00雪花
发表于: 2013-4-26 23:23 10624

[旧帖] 求助一段代码看不懂,主要用途 0.00雪花

2013-4-26 23:23
10624
00413FC0 . 8B4424 0C mov eax, dword ptr [esp+C]
00413FC4 . 57 push edi
00413FC5 . 83C9 FF or ecx, FFFFFFFF
00413FC8 . 8B5424 08 mov edx, dword ptr [esp+8]
00413FCC . 8B38 mov edi, dword ptr [eax]
00413FCE . 33C0 xor eax, eax
00413FD0 . F2:AE repne scas byte ptr es:[edi]
00413FD2 . F7D1 not ecx
00413FD4 . 49 dec ecx
00413FD5 . 5F pop edi
00413FD6 . 890A mov dword ptr [edx], ecx
00413FD8 . C3 retn


就是这段,我看就像取字符串的长度,我说的对吗?

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (18)
雪    币: 189
活跃值: (172)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
是对的,这段是求字符串长度的常用方法。
00413FC0   .  8B4424 0C     mov     eax, dword ptr [esp+C]    ;
00413FC4   .  57            push    edi
00413FC5   .  83C9 FF       or      ecx, FFFFFFFF                        ;ecx=0xFFFF FFFF
00413FC8   .  8B5424 08     mov     edx, dword ptr [esp+8]    ;[esp+8]是保存长度的变量值
00413FCC   .  8B38          mov     edi, dword ptr [eax]             ;[eax]中对应的是字符串首地址
00413FCE   .  33C0          xor     eax, eax                                ;al=0,
00413FD0   .  F2:AE         repne   scas byte ptr es:[edi]          ;扫描字符串ES:[EDI]中的AL字节值,到AL值停止,结合上面AL=0 即到字符串尾部'\0'时停止
00413FD2   .  F7D1          not     ecx    ;取反得到长度值+1,因为把字符串尾部的'\0'也算进去了
00413FD4   .  49            dec     ecx     ;减一得到字符串长度
00413FD5   .  5F            pop     edi     
00413FD6   .  890A          mov     dword ptr [edx], ecx   ;把字符串长度保存到[edx]中,结合前面代码   进行理解
00413FD8   .  C3            retn
2013-4-27 15:04
0
雪    币: 145
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
[QUOTE=shoker;1171162]是对的,这段是求字符串长度的常用方法。
00413FC0   .  8B4424 0C     mov     eax, dword ptr [esp+C]    ;
00413FC4   .  57            push    edi
00413FC5   .  83C9 FF     ...[/QUOTE]

十分感谢大侠。另外还有一问,我在反汇编经常看到这段代码。感觉很没用处。
0041617D  |.  DB45 E8       fild    dword ptr [ebp-18]
00416180  |.  DD5D E8       fstp    qword ptr [ebp-18]
00416183  |.  DD45 E8       fld     qword ptr [ebp-18]
00416186  |.  DC25 5F604B00 fsub    qword ptr [4B605F]
0041618C  |.  DD5D E0       fstp    qword ptr [ebp-20]
0041618F  |.  DD45 E0       fld     qword ptr [ebp-20]
00416192  |.  E8 CAC4FEFF   call    00402661


也不知道为什么要这么做,请问这么做原因是什么?
2013-4-27 21:18
0
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
汇编啊……本人纯属凑乐闹
2013-4-27 22:50
0
雪    币: 736
活跃值: (101)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
0041617D  |.  DB45 E8       fild    dword ptr [ebp-18] ;将整数dword ptr [ebp-18]压入浮点寄存器ST(0)中,将整数转换成浮点
00416180  |.  DD5D E8       fstp    qword ptr [ebp-18] ;将ST(0)中的数据以浮点形式存入[ebp-18]
00416183  |.  DD45 E8       fld     qword ptr [ebp-18] ;将浮点数qword ptr [ebp-18]压入浮点寄存器ST(0)中,结合下面fsub分析是用作被减数
00416186  |.  DC25 5F604B00 fsub    qword ptr [4B605F] ;ST(0) - [4B605F]
0041618C  |.  DD5D E0       fstp    qword ptr [ebp-20] ;将结果以浮点形式存入[ebp-20]
0041618F  |.  DD45 E0       fld     qword ptr [ebp-20] ;压入浮点寄存器ST(0)中,也就是ST(0)~ST(7)组成的栈空间中,应该是下面函数00402661的参数
00416192  |.  E8 CAC4FEFF   call    00402661
2013-4-27 23:28
0
雪    币: 145
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
[QUOTE=纯情小生;1171371]0041617D  |.  DB45 E8       fild    dword ptr [ebp-18] ;将整数dword ptr [ebp-18]压入浮点寄存器ST(0)中,将整数转换成浮点
00416180  |.  DD5D E8       fstp    qword ptr [ebp...[/QUOTE]

感谢楼上大侠,
还有疑问袄,我在写汇编发现

0053C732      B9 44C75300   mov     ecx, 0053C744
0053C737      8911          mov     dword ptr [ecx], edx

这样写,执行错误,为什么会这样呢?
上传的附件:
2013-4-29 15:15
0
雪    币: 145
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
7
搞懂了 .................
2013-4-29 16:16
0
雪    币: 736
活跃值: (101)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
[QUOTE=winnip;1171873]感谢楼上大侠,
还有疑问袄,我在写汇编发现

0053C732      B9 44C75300   mov     ecx, 0053C744
0053C737      8911          mov     dword ptr [ecx], edx

这样写,执行错误,为什...[/QUOTE]
这个地址应该是代码段的地址吧,默认情况下,代码段是没有写权限,你需要把你自己的代码段设置为可写就行,当然可以自己写代码执行,也可以直接连接的时候加上这个选项,还可以直接改PE里区块表中的区块属性。
2013-4-29 20:23
0
雪    币: 183
活跃值: (36)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
原来以为:保护模式下代码段都是不可写的,要写的话只能使用别名。就是在描述符表中加入一个新的描述符,指向代码段,但其属性是可写的数据段。用这个新的描述符就可以访问代码段,而不管代码段的属性是什么,哪怕是不可读的。
那么楼上所提到到的方法是不是最终也是通过这种方法实现的?但由谁来实现,操作系统还是应用程序,还是两者都可以?
不好意思,我问的问题没分给的
2013-4-29 21:53
0
雪    币: 736
活跃值: (101)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
后面两种方法,编译器编译链接加上代码段可写的选项以及直接改PE的区块表的属性就不多说了,楼上主要问的是第一种更改代码段的写入权限吧,其实可以就直接由应用程序自身直接实现,它通过找到要修改的代码段的内存的地址,然后将这个地址所在的页面加上可写属性就行了,微软提供的VirtualProtect系列的API就可以直接实现上述功能,至于楼上说的描述符表是指区块表或者说节表吧,你提出的这种方法,我简单测试了一下,为PE增加一个区块表,让这个区块表还是指向代码段,只是区块的属性增加了可写,但是这种更改后PE加载器直接加载失败,我不知道是不是我有什么地方没弄对,楼上可不可公布一下那种方法?
2013-4-29 23:01
0
雪    币: 183
活跃值: (36)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
我是来求答案的,刚开始学习保护模式编程,所以很多东西都不懂,见凉。内存的分页管理我还没有学到。
我所指的是,代码段描述符中段属性的TYPE字段,其值只能是8-F。如果是8或9的话,在保护模式下,CPU不允许通过CS:[R32]来访问这段内存,无论是读还是写。在GDT中,是通过增加一个描述符也指向这一个地址,但新增加的描述符TYPE字段的值是一般是零到3,如果是2或3的话则表示这是一个向上扩展可读写的数据段。我们将这一个新增描述符的索引送入段选择子比如:DS,则可通过DS:[R32]来访问这段内存,而且CPU是把这段内存当作数据段来访问的。但LDT部分我还没学到,我只是见LDT与GDT的描述符格式是一样的,所以猜想,LDT中也是如此,不知道对不对?WIN32中,应用程序使用的内存地址空间一部分在GDT中,一部分在LDT中。应用程序的代码段描述符肯定在LDT中。其实,我想问的就是:LDT是由我们程序自己还是由操作系统创建的,应用程序中能不能对LDT进行修改;还有就是,让CPU写代码段的三种方法,其最终是通过什么来实现的,由谁来实现——编译链接器,还是操作系统。还有就是权限,到这里我想到,应用程序都是三级的,那么LDT应该是由操作系统来实现的。那么继续猜,系统是创建LDT时已经为代码段描述符创建了别名描述符,但其属性默认是不可写的,而我们对代码段的访问其实是通过这个描述符来访问的。要实面对代码段的写操作,就要更改PE头部的一些内容,使操作系统加载程序时创建的别名描述符是可写的。不知道猜得对不对,请指点。
2013-4-30 01:17
0
雪    币: 736
活跃值: (101)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
[QUOTE=foxive;1172003]我是来求答案的,刚开始学习保护模式编程,所以很多东西都不懂,见凉。内存的分页管理我还没有学到。
我所指的是,代码段描述符中段属性的TYPE字段,其值只能是8-F。如果是8或9的话,在保护模式下,CPU不允许通过CS:[R32]来访问这段内存,无论是读还是写。在GDT中,是通过增加一个描述符也指向这...[/QUOTE]

关于楼上的疑问,我根据我所理解的进行回答,不一定保证全部正确,你可以参考一下
1) GDTR和LDTR是80386开始引入的用于记录GDT和LDT的,系统中GDT只有一个,而系统中的每个任务都有一个独立的LDT。Windows根据不同时刻,时间片由不同的任务持有,那么系统就会自动改变LDTR的值,使其指向的LDT也随之改变,这样系统中的各个任务就达到了数据隔离的效果,但是GDT并不会随着任务的改变改变。
2) LDT,GDT里面的数据都是由系统负责,ring3层的应用程序是没有权限去改写他们的,当然LDTR和GDTR,在ring3上可以通过sgdt,lgdt读取里面的值,但是不能改写。
3) 至于我前面说的让应用程序代码段实现可写的哪三种方法。第一种是更改PE映射到内存中的页面属性实现写。第二种是通过连接器在生成PE的时候,更改PE文件中的区块表的属性,从而使PE加载之后,映射到内存中的代码段具有了可写的属性。第三种和第二种是一样的道理,借助第三方工具WinHex,Lord PE之类,直接根据PE结构,更改对应的代码段的区块属性表。
至于你所说的添加在GDT中为代码段添加别名描述符,我就不太清楚你是如何做的,我对GDT与LDT描述符的具体格式也不太清楚,一般情况下,在ring3是不可能更改掉GDT中的数据,对此我也比较疑问你是如何做的?
2013-5-1 02:39
0
雪    币: 14
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
暂时搞不懂汇编,努力学习中
2013-5-1 03:37
0
雪    币: 183
活跃值: (36)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
经过你的开导,我暂时放弃了在WINDOWS系统下修改GDT的打算。
http://bbs.pediy.com/showthread.php?t=170683去这里解答我的问题吧,有分给的,50KX扔了也可惜。
2013-5-1 20:18
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
看到汇编表示有压力的路过
2013-5-9 04:15
0
雪    币: 35
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
看不懂给。。。。
2013-9-22 09:56
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
软件上来就要有个导入库 我没有加密锁啊 就是想破解  求高手带一下啊
2013-9-23 21:07
0
雪    币: 101
活跃值: (43)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
18
那些fld之类的函数应该是易语言对变量的四则运算操作比如 a=b+c
2013-9-23 21:43
0
雪    币: 10
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
攻击代码攻击工程。
2013-9-24 13:54
0
游客
登录 | 注册 方可回帖
返回
//