能力值:
( 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
|
能力值:
( 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
也不知道为什么要这么做,请问这么做原因是什么?
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
汇编啊……本人纯属凑乐闹
|
能力值:
( 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
|
能力值:
( 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 这样写,执行错误,为什么会这样呢?
|
能力值:
( LV5,RANK:60 )
|
-
-
7 楼
搞懂了 .................
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
[QUOTE=winnip;1171873]感谢楼上大侠,
还有疑问袄,我在写汇编发现
0053C732 B9 44C75300 mov ecx, 0053C744
0053C737 8911 mov dword ptr [ecx], edx
这样写,执行错误,为什...[/QUOTE]
这个地址应该是代码段的地址吧,默认情况下,代码段是没有写权限,你需要把你自己的代码段设置为可写就行,当然可以自己写代码执行,也可以直接连接的时候加上这个选项,还可以直接改PE里区块表中的区块属性。
|
能力值:
( LV4,RANK:50 )
|
-
-
9 楼
原来以为:保护模式下代码段都是不可写的,要写的话只能使用别名。就是在描述符表中加入一个新的描述符,指向代码段,但其属性是可写的数据段。用这个新的描述符就可以访问代码段,而不管代码段的属性是什么,哪怕是不可读的。
那么楼上所提到到的方法是不是最终也是通过这种方法实现的?但由谁来实现,操作系统还是应用程序,还是两者都可以?
不好意思,我问的问题没分给的
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
后面两种方法,编译器编译链接加上代码段可写的选项以及直接改PE的区块表的属性就不多说了,楼上主要问的是第一种更改代码段的写入权限吧,其实可以就直接由应用程序自身直接实现,它通过找到要修改的代码段的内存的地址,然后将这个地址所在的页面加上可写属性就行了,微软提供的VirtualProtect系列的API就可以直接实现上述功能,至于楼上说的描述符表是指区块表或者说节表吧,你提出的这种方法,我简单测试了一下,为PE增加一个区块表,让这个区块表还是指向代码段,只是区块的属性增加了可写,但是这种更改后PE加载器直接加载失败,我不知道是不是我有什么地方没弄对,楼上可不可公布一下那种方法?
|
能力值:
( 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头部的一些内容,使操作系统加载程序时创建的别名描述符是可写的。不知道猜得对不对,请指点。
|
能力值:
( 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中的数据,对此我也比较疑问你是如何做的?
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
暂时搞不懂汇编,努力学习中
|
能力值:
( LV4,RANK:50 )
|
-
-
14 楼
经过你的开导,我暂时放弃了在WINDOWS系统下修改GDT的打算。
http://bbs.pediy.com/showthread.php?t=170683去这里解答我的问题吧,有分给的,50KX扔了也可惜。
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
看不懂给。。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
软件上来就要有个导入库 我没有加密锁啊 就是想破解 求高手带一下啊
|
能力值:
( LV4,RANK:50 )
|
-
-
18 楼
那些fld之类的函数应该是易语言对变量的四则运算操作比如 a=b+c
|
能力值:
( LV2,RANK:10 )
|
-
-
19 楼
攻击代码攻击工程。
|
|
|