首页
社区
课程
招聘
逆向过程中遇到的一条指令,高级语言代码应该是什么样的?
发表于: 2010-12-29 01:34 5186

逆向过程中遇到的一条指令,高级语言代码应该是什么样的?

2010-12-29 01:34
5186
EAX就是字符串的首字符地址
char arry[]="123456ACBBADSD"

比如
MOV EDX,DWORD PTR DS:[EAX]
ADD  EAX,4
....
....
JMP (上面的MOV)

比如开始的4个字符是"1234"
内存中则是 31 32 33 34
将这四个字节当成一个整数存入EDX,那么高级语言,比如C,写这段代码是怎么写的呢?求指教

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

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 306
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
使用atoi函数转一下
2010-12-29 02:11
0
雪    币: 1432
活跃值: (3037)
能力值: ( LV9,RANK:156 )
在线值:
发帖
回帖
粉丝
3
ida F5
2010-12-29 07:59
0
雪    币: 233
活跃值: (285)
能力值: ( LV12,RANK:270 )
在线值:
发帖
回帖
粉丝
4
直接jmp的话,可能是for的死循环,也就是没有结束条件,靠break结束。在高级语言中应该无法直接操作寄存器,所以要看edx的值最后赋给了哪个变量,而且应该不能直接用eax做计数器,所以这段代码要么是优化过的,要么本身就是用汇编写的。
而你说的四个字节赋给一个变量,可以用一个类型转换来实现:
int *p = (int *)arry;
int tmp = *(p++);
2010-12-29 09:03
0
雪    币: 247
活跃值: (10)
能力值: ( 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
2010-12-29 10:03
0
雪    币: 179
活跃值: (26)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
6
把字符串地址强制转换为DWORD *然后再取值就可以了,比如

char *p="1234";
DWORD d;

d=*(DWORD *)p;

此时d中的值就是 34333231
2010-12-29 10:27
0
雪    币: 247
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
谢谢,厉害
int *p = (int *)arry;
int tmp = *(p++);
这样的确可行,我昨天想了1个小时也没想出来,
不过我记得c++ primer 上面是写指针类型不能进行不同类型之间的赋值,会出错,除了VOID *外。。
然后我直接把arry赋值给p就不行。居然忘了可以强转了。
这个强转的也是结果可以预知的前提下使用吧,比如我要是把double强转成int,虽说编译不会报错,但是运行的结果肯定是不对 的了。。

优化的结果。果然分析起来比较郁闷,上面的结果,实际就是把eax指向了字符串的末尾了
每次指针地址+4。。。一直指向最后的空字符
2010-12-29 10:31
0
雪    币: 213
活跃值: (147)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
是最后吗?
如果是“12345”,指针指向的是5,然后一直到1
你说的最后是1的意思吧
2010-12-29 11:07
0
雪    币: 233
活跃值: (285)
能力值: ( LV12,RANK:270 )
在线值:
发帖
回帖
粉丝
9
[QUOTE=昊岳;908922]QEver
谢谢,我也觉得可能是优化的结果,那个地方不是死循环, 是我省掉了,不好意思
完整的代码如下
004DB1A0  |> /8B10                  MOV EDX,DWORD PTR DS:[EAX]
004DB1A2  |. |83C0 04       ...[/QUOTE]

可能是我没有描述清楚。首先从将汇编代码转换为C语言代码是有多种方式的。
而你描述的汇编代码可以写成如下形式:
for(;;)
{
        ...
        if(....)
        {
                break;
        }
        ...
}

这样编译出来的,会是直接无条件跳转到循环起始位置。
而所谓的死循环指的是那个for(;;)
2010-12-29 11:58
0
雪    币: 247
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
QEver
你的意思我明白,我的意思是那个地方本来不是死循环,JMP是我随手写的,我表述的意思是他是一个循环而已,我想弄明白的关键点是转换是怎么实现的,呵呵,循环倒不是重点

jasonzhou
怎么会回去呢?。。呵呵
2010-12-29 13:00
0
雪    币: 1126
活跃值: (156)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
11
这怎么好像是strlen片段
2010-12-29 14:17
0
游客
登录 | 注册 方可回帖
返回
//