反编译gcc
‘壹’ 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++代码的软件不存在