首页
社区
课程
招聘
[旧帖] [求助]说厉害的程序员在使用高级语言编写程序的时候心中已经想到了对应的反汇编代码!?? 0.00雪花
发表于: 2013-6-20 22:31 3014

[旧帖] [求助]说厉害的程序员在使用高级语言编写程序的时候心中已经想到了对应的反汇编代码!?? 0.00雪花

2013-6-20 22:31
3014
但是我用C语言写了个非常简单的,用ollydbg反汇编的的时候愣是没找到对应的代码。。

main()
{
int a=10;
}

[培训]传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 13
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
你得自己搞个特征码呀,然后在定位就能找到啦。
或者用编译器自带的反汇编就ok了。
有的变量没有用过的话,编译器说不定会直接忽略了。
你找都找不到。
2013-6-20 22:37
0
雪    币: 29
活跃值: (157)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
想看这个?VC6进行汇编调试快捷方便
2013-6-21 01:15
0
雪    币: 3
活跃值: (149)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
BBI
4
00401020 >  55              push    ebp
00401021    89E5            mov     ebp, esp
00401023    81EC 14000000   sub     esp, 14
00401029    90              nop
0040102A    B8 00000000     mov     eax, 0
0040102F    8945 EC         mov     dword ptr ss:[ebp-14], eax
00401032    B8 00000300     mov     eax, 30000
00401037    50              push    eax
00401038    B8 00000100     mov     eax, 10000
0040103D    50              push    eax
0040103E    E8 55000000     call    <jmp.&msvcrt._controlfp>
00401043    83C4 08         add     esp, 8
00401046    B8 01000000     mov     eax, 1
0040104B    50              push    eax
0040104C    E8 4F000000     call    <jmp.&msvcrt.__set_app_type>
00401051    83C4 04         add     esp, 4
00401054    8D45 EC         lea     eax, dword ptr ss:[ebp-14]
00401057    50              push    eax
00401058    B8 00000000     mov     eax, 0
0040105D    50              push    eax
0040105E    8D45 F4         lea     eax, dword ptr ss:[ebp-C]
00401061    50              push    eax
00401062    8D45 F8         lea     eax, dword ptr ss:[ebp-8]
00401065    50              push    eax
00401066    8D45 FC         lea     eax, dword ptr ss:[ebp-4]
00401069    50              push    eax
0040106A    E8 39000000     call    <jmp.&msvcrt.__getmainargs>
0040106F    83C4 14         add     esp, 14
00401072    8B45 F4         mov     eax, dword ptr ss:[ebp-C]
00401075    50              push    eax
00401076    8B45 F8         mov     eax, dword ptr ss:[ebp-8]
00401079    50              push    eax
0040107A    8B45 FC         mov     eax, dword ptr ss:[ebp-4]
0040107D    50              push    eax
0040107E    E8 7DFFFFFF     call    c.00401000
00401083    83C4 0C         add     esp, 0C
00401086    8945 F0         mov     dword ptr ss:[ebp-10], eax
00401089    8B45 F0         mov     eax, dword ptr ss:[ebp-10]
0040108C    50              push    eax
0040108D    E8 1E000000     call    <jmp.&msvcrt.exit>
00401092    83C4 04         add     esp, 4
00401095    C9              leave
00401096    C3              retn

C程序几乎必定用到msvcrt的C运行库,所以对于main的调用会出现在msvcrt初始化和退出代码之间。
大部分gcc风格编译器在不做特殊说明的情况下会把程序加载到0x00401000,如果整个程序只有一个函数,那么它就有很大的几率被加载到0x00401000这个位置。0x0040107E这个地址的代码就是“main();”,对main函数的调用。之前的代码自然是对main所需参数的压栈。

对于初学逆向,尚处于摸索阶段的朋友,建议不使用功能过于强大的编译器,因为它们的优化功能可能会导致学习门槛的加高。所以推荐类似于TCC之类的极简主义编译器。大部分win环境下的严格遵守C99的编译器,编译出来的PE文件是很容易读懂的。
2013-6-21 02:15
0
雪    币: 96
活跃值: (288)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
这不是厉害不厉害的问题,而是熟不熟悉的问题,不一定想不到汇编代码就不是好程序员
编译的时候选择 Debug 模式,就会禁用编译优化了,或者手动禁用就可以了
2013-6-21 18:20
0
雪    币: 267
活跃值: (438)
能力值: ( LV9,RANK:190 )
在线值:
发帖
回帖
粉丝
6
同样的函数代码,在同一个编译器下,不同的编译配置就会有不同的对应反汇编代码,不同的编译器也会有不同的反汇编代码,但是功能都应该是一样的
2013-6-21 20:13
0
雪    币: 496
活跃值: (321)
能力值: ( LV13,RANK:400 )
在线值:
发帖
回帖
粉丝
7
话说回来,汇编语言学的是CPU对二进制代码的执行机制,高级语言学的是编译器对代码的处理机制。
2013-6-21 20:16
0
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
谢谢大家回复咯,
我想了下,大概是因为a=10根本在程序中没有用过,可能被编译器给优化掉了,根本就没有这个变量
2013-7-12 19:43
0
雪    币: 112
活跃值: (57)
能力值: ( LV12,RANK:200 )
在线值:
发帖
回帖
粉丝
9
您好, 我觉得出了问题, 应该通过OD或WinDbg加载, 单步往下走, 是否被优化看实验结果.
如果是在工作中,将自己猜测的结果报给领导,有很大概率会被领导一顿狂练

我做了下实验, 发现你说的这个最简的main函数还是存在的, 能被找到.
a = 10 确实被Release版优化掉了.

实现环境:
* 主机 Win7X64Sp1
* Pediy版的OD1.1 + OllyWow64.dll 插件
* vs2008 控制台工程, Unicode编码设置, 默认的Release X86编译
将新建立的工程的main函数, 直接换成您上面给出的
// testMain.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"


int main()
{
    int a=10;
}



启动OD, 加载此ReleaseX86版的exe.
F8往下走, 找到main函数.
0017113E   .  53            push    ebx
0017113F   .  6A 02         push    2
00171141   .  53            push    ebx
00171142   .  FF15 88331700 call    dword ptr [__dyn_tls_init_callba>
00171148   >  A1 1C301700   mov     eax, dword ptr [envp]
0017114D   .  8B0D 80201700 mov     ecx, dword ptr [<&MSVCR90.__init>;  MSVCR90.__initenv
00171153   .  8901          mov     dword ptr [ecx], eax
00171155   .  FF35 1C301700 push    dword ptr [envp]
0017115B   .  FF35 20301700 push    dword ptr [argv]
00171161   .  FF35 18301700 push    dword ptr [argc]
00171167   .  E8 94FEFFFF   call    main                             ;  找到main函数了~
0017116C   .  83C4 0C       add     esp, 0C
0017116F   .  A3 30301700   mov     dword ptr [mainret], eax
00171174   .  391D 24301700 cmp     dword ptr [managedapp], ebx
0017117A   .  75 37         jnz     short 001711B3
0017117C   .  50            push    eax                              ; /status
0017117D   .  FF15 84201700 call    dword ptr [<&MSVCR90.exit>]      ; \exit
00171183   .  8B45 EC       mov     eax, dword ptr [ebp-14]
00171186   .  8B08          mov     ecx, dword ptr [eax]
00171188   .  8B09          mov     ecx, dword ptr [ecx]
0017118A   .  894D E0       mov     dword ptr [ebp-20], ecx
0017118D   .  50            push    eax
0017118E   .  51            push    ecx
0017118F   .  E8 8E030000   call    _XcptFilter                      ;  jmp 到 MSVCR90._XcptFilter
00171194   .  59            pop     ecx
00171195   .  59            pop     ecx
00171196   .  C3            retn


进入main函数, 确实没看到 a = 10 这句话, 因为没有用到, 被Release版优化掉了
00A71000 >/$  33C0          xor     eax, eax                         ;  a = 10, 因为没用到, 被Release版优化掉了
00A71002  \.  C3            retn
上传的附件:
2013-7-13 02:36
0
雪    币: 1632
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
楼上是好人,顶起。
2013-7-13 08:10
0
雪    币: 516
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
好强大的感觉
2013-7-13 15:58
0
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
12
更加深刻认识到了:一个帖子一定要有好的标题
2013-7-13 16:42
0
游客
登录 | 注册 方可回帖
返回