首页
社区
课程
招聘
[旧帖] 求助:Linux文件的反汇编修改 0.00雪花
发表于: 2014-10-28 09:47 8093

[旧帖] 求助:Linux文件的反汇编修改 0.00雪花

2014-10-28 09:47
8093
我的环境是Cent6.4下运行

文件后缀为.o文件,貌似Windows下的.obj文件,希望能对其反汇编,最终达到修改目地

本人基本都在Window下玩,不懂Linux环境下的,希望大神们指点

附件提供文件样本

[课程]FART 脱壳王!加量不加价!FART作者讲授!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (15)
雪    币: 160
活跃值: (272)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
ida  试试看
2014-10-29 14:36
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
你要反汇编出什么东西来呢?
2014-10-29 17:05
0
雪    币: 112
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
IDA我试过了,反不出来,只能显示16进制,我想反出能看懂的汇编代码
2014-10-30 14:32
0
雪    币: 112
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
求助大牛帮忙
2014-11-4 16:22
0
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
先转成可执行文件,再反汇编就可以了
2014-11-4 17:33
0
雪    币: 112
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
原始程序限定了,只能执行.o文件的
2014-11-10 09:50
0
雪    币: 112
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
编译成可执行文件可以试试,但是似乎反不回.o文件了
2014-11-10 09:54
0
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
工程里很多函数只是有声明,找不到实现的代码。因为那些实现代码已经编译成库所以看不见,我所看见的全是一堆头文件.

     .o、.a、.so文件都是Linux下的程序函数库,即编译好的可以供其他程序使用的代码和数据。

优点:程序模块化,容易重新编译,方便升级。

分类:静态函数库(对应.a文件)、共享函数库(对应.so文件,类似于Windows的dll文件)、动态加载函数库(对应.o文件,相当于Windows里的.obj文件)

静态函数库

特点:实际上是简单的普通目标文件的集合,在程序执行前就加入到目标程序中。

优点:可以用以前某些程序兼容;描述简单;允许程序员把程序link起来而不用重新编译代码,节省了重新编译代码的时间(该优势目前已不明显);开发者可以对源代码保密;理论上使用ELF格式的静态库函数生成的代码可以比使用共享或动态函数库的程序运行速度快(大概1%-5%)

生成:使用ar程序(archiver的缩写)。ar rcs my_lib.a f1.o f2.o是把目标代码f1.o和f2.o加入到my_lib.a这个函数库文件中(如果my_lib.a不存在则创建)

使用:用gcc生成可执行代码时,使用-l参数指定要加入的库函数。也可以用ld命令的-l和-L参数。

共享函数库

    共享函数库在可执行程序启动的时候加载,所有程序重新运行时都可自动加载共享函数库中的函数。.so文件感觉很复杂,光是命名规则就已经看得我很晕了~整理一下,共享库需要:soname、real name,另外编译的时候名字也有说法。依次解释下:

soname:必须的格式:lib+函数库名+.so+版本号信息(但是记住,非常底层的C库函数都不是以lib开头命名的)。例子:/usr/lib/libreadline.so.3

real name:顾名思义是真正的名字啦,有主版本号和发行版本号。但是没找到实例……

编译器编译的时候需要的函数库的名字就是不包含版本号信息的soname,例如上面的例子把最后的.3去掉就可以了。

位置:共享函数库文件必须放在特定目录,对于开放源码来说,GNU标准建议所有的函数库文件都放在/usr/local/lib目录下,而且建议命令、可执行程序都放在/usr/local/bin目录下。不过这个只是习惯啦,可以改变,具体的位置信息可以看/etc/ld.so.conf里面的配置信息。当然,也可以修改这个文件,加入自己的一些特殊的路径要求。

创建:在网上找到了gcc方式和easyeclipse环境下两种创建方式。

gcc方式:

    首先创建object文件,这个文件将加入通过gcc –fPIC 参数命令加入到共享函数库里面,标准格式:gcc -shared -Wl,-soname,your_soname -o library_name file_list library_list(说实话这个标准格式看起来好复杂,我找了个实例,但是好像和那个标准格式稍有不同:gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so)

在easyeclipse环境下生成.so文件:

        1.选择新建工程,建立一个c++工程

        2.在工程类型选项里选择 Shared Library,然后填入工程名字PXXX点击完成即可。

        3.编写程序,然后编译就会在debug或者release里生成一个libPXXX.so文件,如果不要lib的起头标记点击project菜单的Properties选项,然后在弹出的界面的右边点击Build artifact页面,将Output prefix选项的内容清空即可。

        4.如果是C++程序,注意在接口函数的前面加上extern "C"标记,在头文件加上如下标记:

#ifdef   __cplusplus  

#extern   "C"{  

#endif  

   

头文件主体  

   

#ifdef   __cplusplus  

}  

#endif  

     如果不加以上标记,经过编译后,so里的函数名并非你编写程序时设定的函数名,在开发环境左侧的工程文件列表中点开debug项里的PXXX.o可以看到so文件里的函数名都是在你设定的函数名后面加了一个__Fi标记,比如你用的设定的函数名称是Func(), 而so里的函数名则为Func__Fi()或者其他的名称。

安装:拷贝共享库文件到指定的标准的目录,然后运行ldconfig。如果没有权限这样做,那么就只好通过修改环境变量来实现这些函数库的使用了。方法不再说了,很复杂。

查看:可以通过运行ldd来看某个程序使用的共享函数库。例如ldd /bin/ls。查看.so文件使用nm命令,如nm libXXX.so。(注意,nm对于静态的函数库和共享的函数库都起作用)

关于覆盖:如果想用自己的函数覆盖某个库中的一些函数,同时保留该库中其他的函数的话,可以在/etc/ld.so.preload中加入要替换的库(.o结尾的文件),这些preloading的库函数将有优先加载的权利。

关于更新:每次新增加动态加载的函数库、删除某个函数库或者修改某个函数库的路径时,都要重新运行ldconfig来更新/etc/ld.so.cache

以上是通用的解释,反汇编只是了解算法,再加以利用,不可能再用反汇编的结果再完全对应回去,不是这么用的.
2014-11-10 19:25
0
雪    币: 39
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
用objdump和readelf先看看,再结合ida
2014-11-11 10:22
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
先转成可执行文件吧,参照6楼
2014-11-13 12:47
0
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
使用objdump -D反汇编出所有段的内容,再分析找出你要的部分
2014-11-15 08:46
0
雪    币: 7
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
用winhex改
2014-11-15 19:00
0
雪    币: 154
活跃值: (216)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
不是ELF格式,不能反汇编。
[FONT="Terminal"][crackwiki@localhost Desktop]$ hexdump -n 100 -C ./start_aaa.o 
00000000  01 00 01 00 00 00 00 00  54 02 00 00 5c 06 00 00  |........T...\...|
00000010  02 00 00 00 0e 00 00 00  49 4e 56 4f 4b 45 5f 53  |........INVOKE_S|
00000020  43 52 49 50 54 00 24 00  00 00 20 20 20 20 20 20  |CRIPT.$...      |
00000030  20 20 20 20 20 53 43 52  49 50 54 5f 44 2d 3e 69  |     SCRIPT_D->i|
00000040  6e 76 6f 6b 65 28 40 41  2c 20 40 42 29 00 ff ff  |nvoke(@A, @B)...|
00000050  ff ff 02 00 00 00 5a 00  57 00 00 00 20 20 20 20  |......Z.W...    |
00000060  20 54 48 52                                       | THR|[/FONT]

正常的ELF格式:
[crackwiki@localhost Desktop]$ file /usr/bin/find
/usr/bin/find: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=157d905c34b10e9a0eb03bd485c20c6e18c5ff26, stripped

你的文件显示如下:
[crackwiki@localhost Desktop]$ file start_aaa.o 
start_aaa.o: data
2014-11-24 11:05
0
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
应该不是elf,也不是.o .a .so什么的。可能是自定义格式的文件
strings start_aaa.o

输出很多:
INVOKE_SCRIPT
           SCRIPT_D->invoke(@A, @B)
     THREAD_D->dispatch_service((: begin_test, trim(expand_macro("TEST_SCRIPTZ")) :));
     THREAD_D->dispatch_service((: begin_test, trim(expand_macro("TEST_SCRIPTY")) :));
     THREAD_D->dispatch_service((: begin_test, trim(expand_macro("TEST_SCRIPTX")) :));
AUTO_ADD_AUTH_PROTECT_FUNC
                                       {                                                                               mixed succ_cb = find_function_arg(__FUN__ + "_succ", $<);                   if (@A->is_need_auth_all_protect())                                         {                                                                               mixed fail_cb;                                                                                                                                          fail_cb = find_function_arg(__FUN__ + "_fail", $<);                                                                                                     AUTH_PROTECT_D->register_auth_all_protect(@A, succ_cb, fail_cb);                                                                                     return;                                                                 }                                                                                                                                                       if (is_function(succ_cb)) call(succ_cb);                                }
LOCK_CARD_USED
              4               
SPA_ID
         (3)
LOG_TASK
        catch(FILE_D->log_to_db(CMD_LOG_TASK, (int) @A, @B, @C, @D, @E, @F, @G, @H, @I))
ACCOUNT_OB
              OBJECTC_DIR "account.c"
EMPTY_OBJECT
                EMPTY_ARRAY            
F_DAEMON_HANDLER_MODULE
     GLOBAL_FEATURE_DIR "daemon/handler_module.c"
MSG_GET_VILLA_IID
           0xA085
CMD_L_EXCHANGE_CREDIT_RECORD
    0xA0BA
CMD_BATCH_LOG_COMBAT
        0xA0B6
CMD_INTERNAL_AUTH
           0xA084
MSG_NOTIFY_USE_MEDICINE
             0x0343
MSG_EXCHANGE_RECONFIRM
              0x0111
MSG_REFRESH_OLD_NAME
                0x00EB
MSG_C_CHAR_OFFLINE
                  0x0085
MSG_ATTACH_SKILL_LIGHT_EFFECT
       0x002D
CMD_BACK_ZHENYUAN
                   0x0300
CMD_VIEW_TOP
                        0x020C
CMD_BUY_FROM_VILLAGE_SHOP
           0x01C2
CMD_GET
                             0x00C2
CMD_EMOTE
                           0x00AA
XDBC_TRACE
              xdbc_trace
IP_CARD_SHORT_CARD
          2               
ACCOUNT_PWD_ERROR
           6               
CFG_GLOBAL_SEC
          "global"            
assert
2015-1-31 20:33
0
雪    币: 260
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
linux下的gcc从编译源文件到可执行的文件,一般是四个步骤,即:预处理-----> 编译 ----> 汇编 ----> 链接;

预处理主要是将源程序中的头文件(比如stdio.h)编译进来,命令是:gcc -E file.c -o file.i,得到的.i文件可以用vim查看,是一些
  9 # 1 "/usr/include/stdio.h" 1 3 4
10 # 27 "/usr/include/stdio.h" 3 4
11 # 1 "/usr/include/features.h" 1 3 4
的类似文件,多的不得了!
编译主要是检查代码的规范性,有没有语法错误等,确定代码的实际要做的工作,在检查无误,Gcc将会把代码翻译成汇编语言。命令式:gcc -S file.i -o file.s,得到的.s汇编文件可以用vim查看,是一些
18     movq    %rsp, %rbp
19     .cfi_def_cfa_register 6
20     subq    $16, %rsp
21     movl    $.LC0, %edi
22     movl    $0, %eax
23     call    printf
24     leaq    -12(%rbp), %rax
的类似文件!
汇编主要是把汇编文件转化为二进制文件。命令是:gcc -c file.s -o file.o ,得到的二进制目标文件可以用objdump命令查看,但都是一些地址,表示看不懂!
链接主要是将目标文件与库文件进行链接得到可执行的文件。命令式gcc -Wall file.o -o file.

linux下一班都是开源的,想修改直接修改源代码就ok!
2015-2-1 21:44
0
游客
登录 | 注册 方可回帖
返回
//