当前位置:首页 » 编程软件 » 反编译gcc

反编译gcc

发布时间: 2023-05-29 14:09:14

‘壹’ ubuntu中怎么查看文件是gcc编译出来的还是arm-linux-gcc编译的

使用objmp试试吧
如果是ubuntu下得gcc编译出来的话,应该带有i386字样

具体方法(假设要看a.out)
objmp -a a.out
我的输出为:
a.out: file format elf32-i386
如果是跨平台的话,比如我这边 mips编译出来的 用objmp看到的就是 file format elf32-little

如果通过这个-a参数还区别不出来 可以试试其他的。比如 -d 反编译看下

‘贰’ linux 下如何将动态链接库.so进行反编译后,换编译器重新编译

程序能不能正常运行取决于程序和动态库之间的ABI是否兼容。只要ABI兼容那么编译器版本就没有影响。高版本的编译器同样可以使用低版本的ABI来生成目标代码,但这个问题要具体分析。你解决问题的思路完全不对。

‘叁’ 在linux下面,编译c文件。不小心用了gcc x.c -o x.c,这样就把源文件给覆盖了。请问如何恢复源文件。谢谢。

反编译

‘肆’ 如何用汇编实现C语言函数调用

1。对于“汇编调用”:
我知道你要调用func,而不是它本身,但如果这个函数比较复杂时是必须用逆向先分析func这个函数,然后再确定参数列表和返回值的……

2。对于你的内联汇编的代码:
这里到底要不要用add %3, %%rsp;还是一个问题,因为要看函数使用的是什么调用标准,有标准C的,VB的,Pascal的,包括fastcall,stdcall,cdecl等……

3。对于“知道函数参数的起始地址和长度”:
这个的话,除了参数中有字符数组和直接结构体什么的,所有的基本变量基本都是每8字节(64位)一个,并且Intel一般都用bigendian的,也就是说,在内存中 01 02 03 04 05 06 07 08 读入寄存器后会变为: 0x0807060504030201
所以说对于简单的函数,用8字节一个参数来做就好了……
而对于有字符数组什么的就必须用逆向分析了……

这个……只能进行逆向分析了……
反正你知道了函数的地址和长度……
就是你把编译为机器码的程序用反编译工具翻译成汇编,然后分析一下就好了,C语言的汇编还是比较简单……
比如这个函数:
int func(int a, int* b) {
// float要用到CPU的FPU,指令记不得,要查下
// 为了简单就改为int*
printf("a = %d, b = %d\n", a, *b);
return a;
}
编译成机器码后,反编译,如果不加优化,一般都会这样:
(假设函数入口地址为0400000h)
sub_0400000:
push rbp
mov rbp,rsp ; C函数参数度取使用堆栈式

; 参数在内存中这样: |...| a | b | ... |
; 由于是64位,故8字节对齐
mov rax,[rbp+8] ; rax = *(rbp+8) // 这里就是 rax = a
push rsi
mov rsi,[rbp+16] ; rsi = *(rbp+16) // rsi = b

; 调用C函数都是这样堆栈式,最后一个参数最先入栈
push [rsi]
push rax
push "a = %d, b = %d\n" ; 这里是便于理解,实际上是push这个字符串常量的指针
call printf ; printf("a = %d, b = %d\n",rax,*rsi)
add rsp,24 ; 平衡堆栈,用了3个参数,要还原3*8=24字节,但根据函数类型的不同去平衡,像调用VB的函数就不需要平衡堆栈……

; 还原数据
mov rsp,rbp
pop rsi
pop rbp

; 一般返回数据都用rax装载
mov rax,[rbp+8] ;rax=a
ret ; return rax

想调用未知参数列表的函数就是把以上过程倒过来,看着汇编把C的代码写出来……
破解注册码什么也是这样玩的……
实际上你可以直接用反编译的软件,比如IDA,直接自动分析,它反编译的虽然是汇编,但参数列表还是大部分都显示的……
但是,当编译器加优化大部分情况就必须自己分析了,因为:
int func(int a, int* b) {
printf("a = %d, b = %d\n", a, *b);
return a;
}
在优化情况下可能为(直接用寄存器传递数据):
sub_040000:
push rdx
mov rdx,rax
push rax
push rbx
push "a = %d, b = %d\n"
call printf
mov rax,rdx
pop rdx
ret

其实像www.pediy.com看雪学院有不少这方面的教程……

‘伍’ 你好,软件的源代码可以看到吗比如说gcc编译器,我想改进它必须要知道她的源代码吗,然后修改是吗

编译之后的软件,是不能看到源码的。
有反编译类的软件,但效果很一般,达不到反编译源码再修改后编译的程度。
修改gcc编译器之类的软件,是个很复杂的工作,在没有源码的情况下修改,几乎不可完成。
另外有些软件,支持二次开发接口的,可以做允许范围之内的调整,但核心部分没有哪个软件可以。

‘陆’ 反编译C和C++代码哪个更难点

用gcc编译的代码,你试试objmp 看看反汇编的结果
objmp -d + 可执行文件
objmp -d + .o文件

‘柒’ gcc为什么不能识别.o文件

gcc只能把n个.o文件编译生成可执行文件,但不能进行反编译,除非有源码。

‘捌’ VB或VC编译的DLL文件可以部分反编译嘛

"DIONNELLE" 为常量,所以会放在程序的某个地方,有一个地址。

md5(md5(md5("DIONNELLE"))); 这样子是没有什么作用的。

反汇编出来也是几个push和call而已,没有什么作用

//////////////
VB\BC等编译过的DLL文件,目前还不能完全反编译

无论是exe还是dll都可以反汇编,即使静态不行,也可以动态调试。
破解反汇编就行 了,不一定要反编译。

//////////////////////////////
可以得到字符串的话,有可能得到是MD5三次循环嘛?

根据call的调用地址,绝对可以看出你是对同一个函数的三次调用。
至于看出你是否采用的是md5算法。这是根据代码的特征分析的。

如果要防止破解,最好给程序加上自己写的强壳,技术有很多我也说不了

,我也是略知一二而已,就不多说了。

‘玖’ gcc下怎么将 .0后缀反编译成源代码

那叫反编译 但是所有的反编译只能还原为汇编代码 以描述程序流程

命令是 objmp , 将2进制代码还原为C/C++代码的软件不存在

热点内容
sqlserver连接驱动 发布:2024-05-06 00:33:34 浏览:645
存储开销 发布:2024-05-06 00:13:38 浏览:953
服务器怎么盈利 发布:2024-05-05 23:56:16 浏览:941
java网站培训学校 发布:2024-05-05 23:43:11 浏览:40
淘宝搜索算法 发布:2024-05-05 23:37:07 浏览:998
sqlwhencasethen 发布:2024-05-05 23:27:51 浏览:641
模架编程软件 发布:2024-05-05 23:26:54 浏览:483
存储过程异常 发布:2024-05-05 23:24:03 浏览:399
winxp访问不了win7 发布:2024-05-05 23:05:23 浏览:734
算法牛 发布:2024-05-05 22:43:40 浏览:720