能力值:
( LV4,RANK:50 )
|
-
-
2 楼
ida 试试看
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
你要反汇编出什么东西来呢?
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
IDA我试过了,反不出来,只能显示16进制,我想反出能看懂的汇编代码
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
求助大牛帮忙
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
先转成可执行文件,再反汇编就可以了
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
原始程序限定了,只能执行.o文件的
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
编译成可执行文件可以试试,但是似乎反不回.o文件了
|
能力值:
( 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
以上是通用的解释,反汇编只是了解算法,再加以利用,不可能再用反汇编的结果再完全对应回去,不是这么用的.
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
用objdump和readelf先看看,再结合ida
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
先转成可执行文件吧,参照6楼
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
使用objdump -D反汇编出所有段的内容,再分析找出你要的部分
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
用winhex改
|
能力值:
( 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
|
能力值:
( 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
|
能力值:
( 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!
|
|
|