首页
社区
课程
招聘
逆向简单函数时遇到的一些问题
发表于: 2012-6-19 04:29 3923

逆向简单函数时遇到的一些问题

2012-6-19 04:29
3923
加密与解密第72页的源码。稍加改动
#include "stdafx.h"

int add (int x,int y);
void main()
{
	int a = 5;
	int b = 6;
	int z = add(5,6);
	printf("%d",z);
	getchar();
}

int add(int x,int y)
{
	printf("aaaaaaaaaaaaaaaaaaaaaaa");
	int z= x+y;
	return z;
}


按照书上讲的,反汇编出来的代码应该类似于这样子的:
push 6
push 5
call   00401010               ;此处调用add()函数
add  esp,8
xor  eax,eax
retn
nop


mov  eax, dword ptr [esp+8]            ;add()实现
mov  ecx, dword ptr [esp+4]
add  eax,ecx
retn                                                     ;add()结束


但是我自己反汇编出来时这样子的!
00401000  /$  68 6CB14000   push    0040B16C                         ; ASCII "aaaaaaaaaaaaaaaaaaaaaaa"
00401005  |.  E8 17000000   call    00401021                         ;  printf
0040100A  |.  6A 0B         push    0B
0040100C  |.  68 84B14000   push    0040B184                         ;  ASCII "%d"
00401011  |.  E8 0B000000   call    00401021                         ;  prinf
00401016  |.  83C4 0C       add     esp, 0C
00401019  |.  E8 D5000000   call    004010F3
0040101E  |.  33C0          xor     eax, eax
00401020  \.  C3            retn


printf("aaaaaaaaaaaaaaaa")后面应该有个调用add()的call,但是为什么反汇编出来的代码没有呢。而且打印字符串与打印数字应该不在同一个函数里德,为什么我反汇编出来在一个函数里呢?求大神指教

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 506
活跃值: (65)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
你确信找到的地方对么?
2012-6-19 07:46
0
雪    币: 3017
活跃值: (3060)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
3
明显是被 编译器优化了, 编译器优化选项 禁用(/Od)
2012-6-19 08:53
0
雪    币: 183
活跃值: (82)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
用debug版可以看到你想看的,这个是release版
2012-6-19 10:35
0
雪    币: 4031
活跃值: (47)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
用debug模式编译吧,release会被优化的面目全非的。
2012-6-19 11:47
0
雪    币: 60
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我为了找到地方特意加了个printf("aaaaaaa");
地方应该没问题
2012-6-19 21:14
0
雪    币: 60
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我也想过这个问题,但是实际反汇编时人家肯定只会给你release版的程序啊,难道不应该这么分析么?
2012-6-19 21:15
0
雪    币: 622
活跃值: (294)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
8
这种情况下,这个程序就是:
void main()
{
printf("%d",11);
getchar();
}

反编译只要求能根据已有的信息来还原程序代码,这种情况下,等同效果的代码是可以接受的。
2012-6-19 21:29
0
游客
登录 | 注册 方可回帖
返回
//