能力值:
( LV2,RANK:10 )
|
-
-
2 楼
使用atoi函数转一下
|
能力值:
( LV9,RANK:156 )
|
-
-
3 楼
ida F5
|
能力值:
( LV12,RANK:270 )
|
-
-
4 楼
直接jmp的话,可能是for的死循环,也就是没有结束条件,靠break结束。在高级语言中应该无法直接操作寄存器,所以要看edx的值最后赋给了哪个变量,而且应该不能直接用eax做计数器,所以这段代码要么是优化过的,要么本身就是用汇编写的。
而你说的四个字节赋给一个变量,可以用一个类型转换来实现:
int *p = (int *)arry;
int tmp = *(p++);
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
QEver
谢谢,我也觉得可能是优化的结果,那个地方不是死循环, 是我省掉了,不好意思
完整的代码如下
004DB1A0 |> /8B10 MOV EDX,DWORD PTR DS:[EAX]
004DB1A2 |. |83C0 04 ADD EAX,4
004DB1A5 |. |8BCA MOV ECX,EDX
004DB1A7 |. |81EA 01010101 SUB EDX,1010101
004DB1AD |. |81E2 80808080 AND EDX,80808080
004DB1B3 |.^ 74 EB JE SHORT 004DB1A0
004DB1B5 |. |F7D1 NOT ECX
004DB1B7 |. |23D1 AND EDX,ECX
004DB1B9 |.^ 74 E5 JE SHORT 004DB1A0
|
能力值:
( LV7,RANK:100 )
|
-
-
6 楼
把字符串地址强制转换为DWORD *然后再取值就可以了,比如
char *p="1234";
DWORD d;
d=*(DWORD *)p;
此时d中的值就是 34333231
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
谢谢,厉害
int *p = (int *)arry;
int tmp = *(p++);
这样的确可行,我昨天想了1个小时也没想出来,
不过我记得c++ primer 上面是写指针类型不能进行不同类型之间的赋值,会出错,除了VOID *外。。
然后我直接把arry赋值给p就不行。居然忘了可以强转了。
这个强转的也是结果可以预知的前提下使用吧,比如我要是把double强转成int,虽说编译不会报错,但是运行的结果肯定是不对 的了。。
优化的结果。果然分析起来比较郁闷,上面的结果,实际就是把eax指向了字符串的末尾了
每次指针地址+4。。。一直指向最后的空字符
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
是最后吗?
如果是“12345”,指针指向的是5,然后一直到1
你说的最后是1的意思吧
|
能力值:
( LV12,RANK:270 )
|
-
-
9 楼
[QUOTE=昊岳;908922]QEver
谢谢,我也觉得可能是优化的结果,那个地方不是死循环, 是我省掉了,不好意思
完整的代码如下
004DB1A0 |> /8B10 MOV EDX,DWORD PTR DS:[EAX]
004DB1A2 |. |83C0 04 ...[/QUOTE]
可能是我没有描述清楚。首先从将汇编代码转换为C语言代码是有多种方式的。
而你描述的汇编代码可以写成如下形式:
for(;;)
{
...
if(....)
{
break;
}
...
}
这样编译出来的,会是直接无条件跳转到循环起始位置。
而所谓的死循环指的是那个for(;;)
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
QEver
你的意思我明白,我的意思是那个地方本来不是死循环,JMP是我随手写的,我表述的意思是他是一个循环而已,我想弄明白的关键点是转换是怎么实现的,呵呵,循环倒不是重点
jasonzhou
怎么会回去呢?。。呵呵
|
能力值:
( LV9,RANK:210 )
|
-
-
11 楼
这怎么好像是strlen片段
|
|
|