导航:首页 > 源码编译 > c程序防止反编译

c程序防止反编译

发布时间:2023-02-21 18:46:12

A. 我写的C/S程序怎么轻易就被人反编译

简单回答: 1、理论上不能保证程序不被反编译。 2、一些加壳软件可以做到加大被反编译的难度,迫使操作者先解壳才能做反编译,但同时会降低程序的运行效率。 3、当前的技术条件下,一般而言,反编译出的“源代码”一般而言并不能作学习,参考的源

B. 如何防止程序员反编译

java从诞生以来,其基因就是开放精神,也正因此,其可以得到广泛爱好者的支持和奉献,最终很快发展壮大,以至于有今天之风光!但随着java的应用领域越来越广,特别是一些功能要发布到终端用户手中(如Android开发的app),有时候,公司为了商业技术的保密考虑,不希望这里面的一些核心代码能够被人破解(破解之后,甚至可以被简单改改就发布出去,说严重点,就可能会扰乱公司的正常软件的市场行为),这时候就要求这些java代码不能够被反编译。

这里要先说一下反编译的现象。因为java一直秉持着开放共享的理念,所以大家也都知道,我们一般共享一个自己写的jar包时,同时会共享一个对应的source包。但这些依然与反编译没有什么关系,但java的共享理念,不只是建议我们这样做,而且它自己也在底层上“强迫”我们这么做!在java写的.java文件后,使用javac编译成class文件,在编译的过程,不像C/C++或C#那样编译时进行加密或混淆,它是直接对其进行符号化、标记化的编译处理,于是,也产生了一个逆向工程的问题:可以根据class文件反向解析成原来的java文件!这就是反编译的由来。

但很多时候,有些公司出于如上述的原因考虑时,真的不希望自己写的代码被别人反编译,尤其是那些收费的app或桌面软件(甚至还有一些j2ee的wen项目)!这时候,防止反编译就成了必然!但前面也说过了,因为开放理念的原因,class是可以被反编译的,那现在有这样的需求之后,有哪些方式可以做到防止反编译呢?经过研究java源代码并进行了一些技术实现(结果发现,以前都有人想到过,所以在对应章节的时候,我会贴出一些写得比较细的文章,而我就简单阐述一下,也算偷个懒吧),我总共整理出以下这几种方式:

代码混淆

这种方式的做法正如其名,是把代码打乱,并掺入一些随机或特殊的字符,让代码的可读性大大降低,“曲线救国”似的达到所谓的加密。其实,其本质就是打乱代码的顺序、将各类符号(如类名、方法名、属性名)进行随机或乱命名,使其无意义,让人读代码时很累,进而让人乍一看,以为这些代码是加过密的!

由其实现方式上可知,其实现原理只是扰乱正常的代码可读性,并不是真正的加密,如果一个人的耐心很好,依然可以理出整个程序在做什么,更何况,一个应用中,其核心代码才是人们想去了解的,所以大大缩小了代码阅读的范围!

当然,这种方式的存在,而且还比较流行,其原因在于,基本能防范一些技术人员进行反编译(比如说我,让我破解一个混淆的代码,我宁愿自己重写一个了)!而且其实现较为简单,对项目的代码又无开发上的侵入性。目前业界也有较多这类工具,有商用的,也有免费的,目前比较流行的免费的是:proguard(我现象临时用的就是这个)。

上面说了,这种方式其实并不是真正加密代码,其实代码还是能够被人反编译(有人可能说,使用proguard中的optimize选项,可以从字节流层面更改代码,甚至可以让JD这些反编译软件可以无法得到内容。说得有点道理,但有两个问题:1、使用optimize对JDK及环境要求较高,容易造成混淆后的代码无法正常运行;2、这种方式其实还是混淆,JD反编译有点问题,可以有更强悍的工具,矛盾哲学在哪儿都是存在的^_^)。那如何能做到我的class代码无法被人反编译呢?那就需要我们下面的“加密class”!

加密class

在说加密class之前,我们要先了解一些java的基本概念,如:ClassLoader。做java的人已经或者以后会知道,java程序的运行,是类中的逻辑在JVM中运行,而类又是怎么加载到JVM中的呢(JVM内幕之类的,不在本文中阐述,所以点到为止)?答案是:ClassLoader。JVM在启动时是如何初始化整个环境的,有哪些ClassLoader及作用是什么,大家可以自己问度娘,也不在本文中讨论。

让我们从最常见的代码开始,揭开一下ClassLoader的一点点面纱!看下面的代码:

Java代码

C. perl如何避免反编译

为了保护Perl源代码,常用的有三种方法。
1.
使用Perl自带的perlcc工具。这个工具有一个最大的弱点:它只能作用于一个perl文件。假如你和我一样写了十几二十几个perl包,主程序里倒是空空如也,估计要郁闷死。用也是可以用的,就是要把所有的源代码到一个文件,取消所有的package定义,把原来不同package下面同名的函数改名,不同的package里面的同名全局变量也要改名。然后
$perlcc -o hello hello.pl
得到可执行程序hello. Perlcc的原理是把perl程序转换成C程序,然后用GNU
C编译器编译。它在Windows上也可以用,但需要额外安装C编译器,比如Intel C或者MS Microsoft Visual
C。由于perlcc把代码先变C再变可执行程序,反编译出来的源码很难看懂,所以安全性很高。但是把所有的代码写一个文件,模块也不能用了,这简直是从地铁时代回到乌蓬船时代,我想不会有人觉得舒服。何况这样混杂后的代码该如何维护升级和做版本控制呢,头大。另外,perlcc有申明,不保证它编译出来的东西能用(参见$perldoc
perlcc)。我没遇到这个情况,而是遇到了perlcc直接就对我的程序编译不通过,没戏唱了。{2006.12.15更新:找到perl不能编译我的程序的原因了:1.
只能用use 不能用require,模块文件名的后缀都改成.pm, use后跟不带后缀的文件名就可以。2.
所有的全局数组,必须用my, our,
或者local来定义,不可以用缺省作用范围。第二点其实应该是perlcc的一个bug了,因为关联数组和简单变量都没有这个问题。}

2. perl2exe,据说很好用,但令人沮丧的是要license, 而且据说跨平台还有问题。

3. PAR(Perl Archive Toolkit)。这个命名法则是类似于JAR(Java
Archive)。下载下来以后还要从CPAN上下载一些依赖性模块。CPAN模块果然好装,每个模块都是
$perl Makefile.PL
$make
$make install
就能装好。最后安装PAR。装好以后会在/usr/bin/下面添加一些工具。我不关心别的,就要用pp:
$pp -o hello hello.pl
这样生成的hello就是可执行文件,而且把用到的perl模块文件也全打包进来了。运行的时候它会在/tmp/par-username/下生成一个叫
cache-123456789之类的临时文件夹,打开看看可以发现就是自己的源代码。这样不是没达到我想要的隐藏源代码的目的么?原来还需要启动过滤器:
$pp -f Bleach -o hello hello.pl
或者
$pp -f Bytecode -o hello hello.pl
前面的Bleach过滤器是PAR自己实现的,而Bytecode这种过滤方式是Perl的标准格式(需要Perl
5.8.1以上版本支持)。过滤之后,临时文件夹里面的文件就不是简单可读了。当然是有办法crack,
但这和恢复带初始变量名的源代码是两回事。

D. python源码编程成pyc后,怎么防止反编译

无法防止反编译,但可以混淆,让你即使反编译了,也看不懂语法
下面一段源码

sd=1

defseed(s):
globalsd
sd=s

defrandn(n):
globalsd
sd=(sd*1103515245+12345)&0x7fffffff
returnsd%n

defmain():
seed(11)
foriinxrange(4):
printrandn(313)

if__name__=='__main__':
main()

混淆后

oo000=1
if9-9:Ii.o0o00Oo0O-iI11I1II1I1I
defoooo(s):
globaloo000
oo000=s
if11-11:ii1I-ooO0OO000o
defii11i(n):
globaloo000
oo000=(oo000*1103515245+12345)&0x7fffffff
returnoo000%n
if66-66:iIiI*iIiiiI1IiI1I1*o0OoOoOO00
defI11i():
oooo(11)
forO0Oinxrange(4):
printii11i(313)
if78-78:i11ii11iIi11i.oOoO0oo0OOOo+IiiI/Iii1ii1II11i
if__name__=='__main__':
I11i()#

E. C++程序可以被反编译吗

c/c++程序是不能被反编译的,除非是debug版本(包含各种标识符及调试信息),release版本没有任何有关源码的信息,是不能被反编译的

F. 如何防止Unity3D代码被反编译

根本的解决办法是:先对DLL加密,然后在Unity的源码中加载程序DLL之前进行解密。

这就需要通过逆向工程获得相应的Unity源码或者是直接向Unity购买Source Code License。

G. 为何C和C++编写生成的可执行程序不可反编译回源程序

因为不同的源程序经过编译可能得到相同的可执行程序,因此如果反向操作就存在二义性了

H. 如何让我用C语言写的程序不让人家在不反编译的情况下只运行,不可以看见程序 我用的是VC++

如果楼主想从代码编写出发的的话,我看楼主还没到这个层度,要从代码上防止反汇编,首先自己得想当熟悉反汇编才行... 简单的方法可以给你写的程序加个壳就行了

I. dll如何防止反编译

1
将你要破解的DLL文件放在C盘
2
执行 开始》所以程序》Microsoft Windows SDK v6.0A》tools》IL 反汇编程序
3
找到放在C盘的DLL文件
4
然后 文件》转储》确定位置并确认
5
好了 看看C盘是否多了 两个文件 xxx.il xxx.res
6
修改 xxx.il 文件内的代码
7
修改完成后将xxx.il和 xxx.res 把这两个文件复制到 C:\Program Files\Microsoft Visual Studio 9.0\VC这个目录下
8
然后执行:开始》所以程序》Microsoft Visual Studio 2008》Visual Studio Tools》Visual Studio 2008 命令提示
9
执行:ilasm /dll /resource=xxx.res xxx.il xxx代表你取的名字
10
然后去看看C:\Program Files\Microsoft Visual Studio 9.0\VC 这个目录下是不是多了一个xxx.dll文件 把编译出来的文件拿去使用就OK了

注意事项
一定要确定文件名称和位置不能有错!

J. 怎样防止编译后的C语言文件被反编译

app反编译后防止接口泄露的方法,就是使用谷歌提供的混淆工具,将不要反编译的文件保留,其他的都进行混淆,这样之后反编译看到的都是一些乱码,例如abc之类的。

阅读全文

与c程序防止反编译相关的资料

热点内容
我的世界模组怎么获得命令方块 浏览:754
服务器为什么稳定 浏览:950
资源共享库源码 浏览:817
vr一体机能用什么app 浏览:166
程序员右背很痛 浏览:739
哪个app可以看琉璃原着 浏览:47
捣练图pdf 浏览:284
公司内部如何搭建网络服务器 浏览:654
自助火锅哪个app好 浏览:848
pdf使用说明 浏览:709
蝙蝠app的服务器在哪个国家 浏览:581
我的世界怎么做出超平坦服务器 浏览:329
qq内的照片加密 浏览:120
抵押车app哪个好 浏览:329
如何用单片机控制伺服电机 浏览:271
手指计算法视频 浏览:772
java键盘全局监听 浏览:682
华为交换机退出命令 浏览:852
神龙云服务器相关上市公司 浏览:366
加主播解压什么意思 浏览:890