反编译子程序
❶ 什么是加密狗呢怎么使用呢
加密狗 加密狗是由彩虹天地公司首创,后来发展成如今的一个软件保护的通俗行业名词,"加密狗"是一种插在计算机并行口上的软硬件结合的加密产品(新型加密狗也有usb口的)。一般都有几十或几百字节的非易失性存储空间可供读写,现在较新的狗内部还包含了单片机。软件开发者可以通过接口函数和软件狗进行数据交换(即对软件狗进行读写),来检查软件狗是否插在接口上;或者直接用软件狗附带的工具加密自己EXE文件(俗称"包壳")。这样,软件开发者可以在软件中设置多处软件锁,利用软件狗做为钥匙来打开这些锁;如果没插软件狗或软件狗不对应,软件将不能正常执行。
加密狗通过在软件执行过程中和加密狗交换数据来实现加密的.加密狗内置单片机电路(也称CPU),使得加密狗具有判断、分析的处理能力,增强了主动的反解密能力。这种加密产品称它为"智能型"加密狗.加密狗内置的单片机里包含有专用于加密的算法软件,该软件被写入单片机后,就不能再被读出。这样,就保证了加密狗硬件不能被复制。同时,加密算法是不可预知、不可逆的。加密算法可以把一个数字或字符变换成一个整数,如DogConvert(1)=17345、DogConvert(A)=43565。
加密狗是为软件开发商提供的一种智能型的软件保护工具,它包含一个安装在计算机并行口或 USB 口上的硬件,及一套适用于各种语言的接口软件和工具软件。加密狗基于硬件保护技术,其目的是通过对软件与数据的保护防止知识产权被非法使用。
加密狗的工作原理:
加密狗通过在软件执行过程中和加密狗交换数据来实现加密的.加密狗内置单片机电路(也称CPU),使得加密狗具有判断、分析的处理能力,增强了主动的反解密能力。这种加密产品称它为"智能型"加密狗.加密狗内置的单片机里包含有专用于加密的算法软件,该软件被写入单片机后,就不能再被读出。这样,就保证了加密狗硬件不能被复制。同时,加密算法是不可预知、不可逆的。加密算法可以把一个数字或字符变换成一个整数,如DogConvert(1)=17345、DogConvert(A)=43565。下面,我们举个例子说明单片机算法的使用。 比如一段程序中有这样一句:A=Fx(3)。程序要根据常量3来得到变量A的值。于是,我们就可以把原程序这样改写:A=Fx(DogConvert(1)-12342)。那么原程序中就不会出现常量3,而取之以DogConvert(1)-12342。这样,只有软件编写者才知道实际调用的常量是3。而如果没有加密狗,DogConvert函数就不能返回正确结果,结果算式A=Fx(DogConvert(1)-12342)结果也肯定不会正确。这种使盗版用户得不到软件使用价值的加密方式,要比一发现非法使用就警告、中止的加密方式更温和、更隐蔽、更令解密者难以琢磨。此外,加密狗还有读写函数可以用作对加密狗内部的存储器的读写。于是我们可以把上算式中的12342也写到狗的存储器中去,令A的值完全取决于DogConvert()和DogRead()函数的结果,令解密难上加难。不过,一般说来,加密狗单片机的算法难度要低于一些公开的加密算法,如DES等,因为解密者在触及加密狗的算法之前要面对许多难关
[编辑本段]目前最新的硬件加密原理
随着解密技术的发展,单片机加密狗由于其算法简单,存储空间小,容易被硬复制等原因,正逐渐被市场所淘汰。以北京彩虹天地信息技术股份有限公司为首的国内加密狗厂商研发出稳定性更好、存储空间更大(最大为64K)、有效防止硬克隆的第四代加密狗——“智能卡”加密狗以其独创的“代码移植”原理,已经被国内大型商业软件开发商如金蝶、用友、CAXA、广联达、神机妙算、鲁班……所采用。
以世界上第一款智能卡加密锁——宏狗为例,简单介绍一下“代码移植”原理。
“代码移植”加密原理为一种全新的、可信的软件保护模型,工作原理为:软件中部分代码经过编译,“移植”到加密锁硬件内部,软件中没有该段代码的副本。
在这套软件保护方案中,PC端应用软件的关键的代码和数据“消失”了,被安全地移植到精锐IV型加密锁的硬件中保护起来。在需要使用时,应用软件可以通过功能调用引擎来指令精锐IV运行硬件中的关键代码和数据并返回结果,从而依然可以完成整个软件全部的功能。由于这些代码和数据在PC端没有副本存在,因此解密者无从猜测算法或窃取数据,从而极大程度上保证了整个软件系统的安全性。简言之,精锐IV提供了一套可信的解决方案,从理论上保证软件加密的安全。
加密狗技术的运用案例
1、广联达造价软件
2、清华斯维尔造价软件
3、神机妙算造价软件
4、鲁班造价软件
使用加密狗进行加密的一些策略
现在的解密技术排除法律和道德因素,就从学术角度来说是门科学。它与加密技术一样是相辅相成不断提高。
以下就针对使用加密狗(加密锁)进行硬件保护谈谈几点心得:
针对于使用加密狗的解密有什么方法?
1、硬件复制
复制硬件,即解密者复制Sentinel Superpro相同的加密锁。由于加密锁采用了彩虹公司专用的ASIC芯片技术,因此复制该加密锁非常困难,且代价太大。
2、监听
解密者利用并口监听程序,进行解密,其工作机制是:
监听程序,记录应用程序对并口发的查询串和加密锁发回的响应串。当移去加密锁时,如果程序再对并口发查询串确认身份时,监听程序返回所记录的响应串。程序认为加密锁仍然在并口上,是合法用户继续运行,应用程序也就被解密了。
3、 打印机共享器
将加密锁插在打印机共享器上,多台计算机共同使用打印机共享器上的一把加密锁。(后面简述对抗策略)
4、 DEBUG
解密者DEBUG等反编译程序,修改程序源代码或跳过查询比较。应用程序也就被解密了。
对于以上的几种解密方法加密者可以考虑使用以下几种加密策略:
1、针对上述监听和DEBUG问题解密方法,本人推荐充分利用加密狗开发商的API函数调用的加密策略:
a、 针对并口监听程序
1)对加密锁进行算法查询
Ø 正确的查询响应验证
用户生成大量查询响应对,如200对。在程序运行过程中对激活的加密算法单元随机的发送在200对之中的一对“345AB56E”―――“63749128”。查询串“345AB56E”,哪么算法单元返回的下确的响应串应该是“63749128”,若是,则程序认为加密锁在并口上,是合法用户,继续运行,反之终止程序。
Ø 随机非激活算法验证
我们对非激活的加密锁算法单元发随机生成的查询串,如:“7AB2341”,非激活算法单元只要是有查询就会有响应串。因此返回响应串“7AB2341”,在程序中判断响应串与查询串是否相同,如果相同,则证明我们的加密锁仍然在口上。继续运行程序。
Ø 随机激活算法验证
假设监听程序了解了上面的机制。即对非激活的加密算法我们发什么查询串则返回相同的响应串。哪么我也有对策。对激活的加密算法单元发随机生成的查询串,如:“345AB56E”由于是激活算法响应串肯定与查询串肯定不等。所以假如返回响应串“7253ABCD”,在程序中判断响应串与查询串是否不同,如果不同,则证明我们的加密锁仍然在并口上,继续运行程序。
上面三种加密策略在程序同时使用,相符相承,相互补充。即使监听程序记录下来我们的部分查询响应。
2) 分时查询
用户把查询响应对分组,如120对分为4组。每30对一组。头三个月使用第一组,第二个月三个月使用第二组以此类推,监听程序就算记录了头三个月。第二个月三个月以后程序仍然无法使用。
也可以再生成100对“临时委员”,每次运行随意抽出1对与以上分组结合使用。使记录程序在三个月内也无法记录完全。程序也无法使用。
3) 随机读写存储单元
为了防监听程序。我们的策略是:程序在启动时,我们利用随机函数随机生成的一个数,假设是“98768964”。我们在指定的18#单元写入这个数。哪么我们在程序运行中,每调用一个功能程序前读取18#单元,数判定是否是我们写入的数“98768964”。因为每次写入的数是随机生成的,所以监听程序记录不到当次启动时写入的随机数,它返回的数肯定是一个不匹配的数。我们就可以就此判定是否是合法用户。Sentinel Superpro加密锁可以重复写10万次以上。也就是说每天写三次也可以使用一百年。
2、 针对打印共享器的加密策略
为了防打印共享器。我们的策略是:程序在启动时,我们利用随机函数随要生成的一个数,假设是“7762523A”。我们在指定的34#单元写入这个数。哪么在程序运行中,每调用一个功能程序前读取34#单元,以判定是否是我们写入的数“7762523A”。以此判定是否是合法用户。因为每次写入的数随机生成的,同时使用打印共享器的其他非法用户的程序一进入也会写入一个不同的随机数。那么第一个用户的程序在校验是否是第一个用户写入的数时,就会被认为是非法的用户。所以在一个阶段也只是一个程序使用。(例如RAINBOW公司开的Sentinel Superpro加密锁可以重复10万次以上。也就是说每天写三次也就可以使用一百年。)
3、 针对DEBUG跟踪的加密锁的安全策略
1)分散法
针对DEBUG跟踪。在调用每个重要功能模块前,我们建议要对加密锁进行查询,校验身份。如果只在程序开始部分校验身份,DEBUG跟踪程序部分可以轻易的跳过校验部分,而一些不良用户可以在验证后可以将加密锁拔下用在其它计算机。
2)延时法
针对某一具体查询校验,都有三步骤:
Ø 查询得到响应串
Ø 比较响应串和查询串是否匹配
Ø 执行相应的步骤
我们建议以上三个步骤要延时执行。最好鼗三步骤相互远离些,甚至放到不同的子程序或函数中。例如:我们执行“查询得到响应串” 后,相隔50执行“比较响应串和查询串是否匹配”。假如程序需要调用一个函数。哪么我们就在这个函数里执行“执行相应的步骤”。这样程序更难于被破解。
3)整体法
将响应串作为程序中数据使用。
例如:我们有返回值“87611123”,而我们程序需要“123”这个数。我们可以让“87611123”减去“8761000”得到“123”。这样以来任何对加密程序的修改都会使程序紊乱。
4)迷惑法
一般情况下我们的程序执行相应的验证步骤。验证是非法用户就会退出。这样很容易被发现代码特征。我们知道是非法用户后继续执行一些无用的操作使程序紊乱。以迷惑解密者。
以上为现如今软件开发商使用硬件加密狗(加密锁)进行软件保护时可以使用的几种切实可行的几种加密策略。
❷ 易语言子程序指针是什么有什么用
易语言子程序指针是是一种子程序。
例:&子程序1,子程序指针就是指向某一个子程序。符号用&指向需要指示的子程序。
❸ Android软件安全与逆向分析的书名
本书由浅入深、循序渐进地讲解了Android 系统的软件安全、逆向分析与加密解密技术。包括Android软件逆向分析和系统安全方面的必备知识及概念、如何静态分析Android 软件、如何动态调试Android 软件、Android 软件的破解与反破解技术的探讨,以及对典型Android 病毒的全面剖析。
本书适合所有Android 应用开发者、Android 系统开发工程师、Android 系统安全工作者阅读学习。 丰生强(网名非虫)
Android软件安全专家。看雪论坛Android安全版版主;安卓巴士开发交流版版主。
对Android软件与系统安全有狂热的爱好和独到的见解,对Android系统的全部源代码进行过深入地研究和分析。逆向分析实战经验丰富。
在国内信息安全杂志上发表过多篇有价值的软件安全文章,目前就职于国内某Android开发企业,常年混迹于看雪论坛(ID非虫)。
作者邮箱:[email protected]
愿与国内安全爱好者共同交流与探讨安全技术。 第1章 Android程序分析环境搭建11.1 Windows分析环境搭建11.1.1 安装JDK11.1.2 安装Android SDK31.1.3 安装Android NDK51.1.4 Eclipse集成开发环境61.1.5 安装CDT、ADT插件61.1.6 创建Android Virtual Device81.1.7 使用到的工具91.2 Linux分析环境搭建91.2.1 本书的Linux环境91.2.2 安装JDK91.2.3 在Ubuntu上安装Android SDK101.2.4 在Ubuntu上安装Android NDK111.2.5 在Ubuntu上安装Eclipse集成开发环境121.2.6 在Ubuntu上安装CDT、ADT插件131.2.7 创建Android Virtual Device131.2.8 使用到的工具151.3 本章小结15第2章 如何分析Android程序162.1 编写第一个Android程序162.1.1 使用Eclipse创建Android工程162.1.2 编译生成APK文件192.2 破解第一个程序202.2.1 如何动手?202.2.2 反编译APK文件202.2.3 分析APK文件212.2.4 修改Smali文件代码262.2.5 重新编译APK文件并签名262.2.6 安装测试272.3 本章小结28第3章 进入Android Dalvik虚拟机293.1 Dalvik虚拟机的特点——掌握Android程序的运行原理293.1.1 Dalvik虚拟机概述293.1.2 Dalvik虚拟机与Java虚拟机的区别293.1.3 Dalvik虚拟机是如何执行程序的343.1.4 关于Dalvik虚拟机JIT(即时编译)363.2 Dalvik汇编语言基础为分析Android程序做准备373.2.1 Dalvik指令格式373.2.2 DEX文件反汇编工具393.2.3 了解Dalvik寄存器403.2.4 两种不同的寄存器表示方法——v命名法与p命名法423.2.5 Dalvik字节码的类型、方法与字段表示方法433.3 Dalvik指令集443.3.1 指令特点453.3.2 空操作指令453.3.3 数据操作指令463.3.4 返回指令463.3.5 数据定义指令463.3.6 锁指令473.3.7 实例操作指令473.3.8 数组操作指令483.3.9 异常指令483.3.10 跳转指令483.3.11 比较指令493.3.12 字段操作指令503.3.13 方法调用指令503.3.14 数据转换指令513.3.15 数据运算指令513.4 Dalvik指令集练习——写一个Dalvik版的Hello World523.4.1 编写smali文件523.4.2 编译smali文件543.4.3 测试运行543.5 本章小结55第4章 Android可执行文件564.1 Android程序的生成步骤564.2 Android程序的安装流程594.3 dex文件格式664.3.1 dex文件中的数据结构664.3.2 dex文件整体结构684.3.3 dex文件结构分析714.4 odex文件格式804.4.1 如何生成odex文件804.4.2 odex文件整体结构814.4.3 odex文件结构分析834.5 dex文件的验证与优化工具dexopt的工作过程884.6 Android应用程序另类破解方法914.7 本章小结93第5章 静态分析Android程序945.1 什么是静态分析945.2 快速定位Android程序的关键代码945.2.1 反编译apk程序945.2.2 程序的主Activity955.2.3 需重点关注的Application类955.2.4 如何定位关键代码——六种方法965.3 smali文件格式975.4 Android程序中的类1005.4.1 内部类1005.4.2 监听器1025.4.3 注解类1055.4.4 自动生成的类1085.5 阅读反编译的smali代码1105.5.1 循环语句1105.5.2 switch分支语句1155.5.3 try/catch语句1215.6 使用IDA Pro静态分析Android程序1275.6.1 IDA Pro对Android的支持1275.6.2 如何操作1285.6.3 定位关键代码——使用IDA Pro进行破解的实例1325.7 恶意软件分析工具包——Androguard1355.7.1 Androguard的安装与配置1355.7.2 Androguard的使用方法1375.7.3 使用Androguard配合Gephi进行静态分析1445.7.4 使用androlyze.py进行静态分析1485.8 其他静态分析工具1525.9 阅读反编译的Java代码1525.9.1 使用dex2jar生成jar文件1525.9.2 使用jd-gui查看jar文件的源码1535.10 集成分析环境——santoku1545.11 本章小结156第6章 基于Android的ARM汇编语言基础——逆向原生!1576.1 Android与ARM处理器1576.1.1 ARM处理器架构概述1576.1.2 ARM处理器家族1586.1.3 Android支持的处理器架构1596.2 原生程序与ARM汇编语言——逆向你的原生Hello ARM1606.2.1 原生程序逆向初步1606.2.2 原生程序的生成过程1626.2.3 必须了解的ARM知识1646.3 ARM汇编语言程序结构1666.3.1 完整的ARM汇编程序1666.3.2 处理器架构定义1676.3.3 段定义1686.3.4 注释与标号1696.3.5 汇编器指令1696.3.6 子程序与参数传递1706.4 ARM处理器寻址方式1706.4.1 立即寻址1706.4.2 寄存器寻址1716.4.3 寄存器移位寻址1716.4.4 寄存器间接寻址1716.4.5 基址寻址1716.4.6 多寄存器寻址1716.4.7 堆栈寻址1726.4.8 块拷贝寻址1726.4.9 相对寻址1726.5 ARM与Thumb指令集1736.5.1 指令格式1736.5.2 跳转指令1746.5.3 存储器访问指令1756.5.4 数据处理指令1776.5.5 其他指令1846.6 用于多媒体编程与浮点计算的NEON与VFP指令集1856.7 本章小结186第7章 Android NDK程序逆向分析1877.1 Android中的原生程序1877.1.1 编写一个例子程序1877.1.2 如何编译原生程序1887.2 原生程序的启动流程分析1947.2.1 原生程序的入口函数1947.2.2 main函数究竟何时被执行1987.3 原生文件格式1997.4 原生C程序逆向分析2007.4.1 原生程序的分析方法2007.4.2 for循环语句反汇编代码的特点2047.4.3 if...else分支语句反汇编代码的特点2087.4.4 while循环语句反汇编代码的特点2117.4.5 switch分支语句反汇编代码的特点2157.4.6 原生程序的编译时优化2187.5 原生C++程序逆向分析2227.5.1 C++类的逆向2227.5.2 Android NDK对C++特性的支持2257.5.3 静态链接STL与动态链接STL的代码区别2277.6 Android NDK JNI API逆向分析2327.6.1 Android NDK提供了哪些函数2327.6.2 如何静态分析Android NDK程序2337.7 本章小结235第8章 动态调试Android程序2368.1 Android动态调试支持2368.2 DDMS的使用2378.2.1 如何启动DDMS2378.2.2 使用LogCat查看调试信息2388.3 定位关键代码2408.3.1 代码注入法——让程序自己吐出注册码2408.3.2 栈跟踪法2448.3.3 Method Profiling2478.4 使用AndBug调试Android程序2508.4.1 安装AndBug2518.4.2 使用AndBug2518.5 使用IDA Pro调试Android原生程序2548.5.1 调试Android原生程序2558.5.2 调试Android原生动态链接库2568.6 使用gdb调试Android原生程序2608.6.1 编译gdb与gdbserver2608.6.2 如何调试2628.7 本章小结264第9章 Android软件的破解技术2659.1 试用版软件2659.1.1 试用版软件的种类2659.1.2 实例破解——针对授权KEY方式的破解2659.2 序列号保护2719.3 网络验证2729.3.1 网络验证保护思路2729.3.2 实例破解——针对网络验证方式的破解2739.4 In-app Billing(应用内付费)2779.4.1 In-app Billing原理2779.4.2 In-app Billing破解方法2809.5 Google Play License保护2819.5.1 Google Play License保护机制2819.5.2 实例破解——针对Google Play License方式的破解2839.6 重启验证2849.6.1 重启验证保护思路2859.6.2 实例破解——针对重启验证方式的破解2859.7 如何破解其他类型的Android程序2969.7.1 Mono for Android开发的程序及其破解方法2969.7.2 Qt for Android开发的程序及其破解方法3019.8 本章小结309第10章 Android程序的反破解技术31010.1 对抗反编译31010.1.1 如何对抗反编译工具31010.1.2 对抗dex2jar31110.2 对抗静态分析31210.2.1 代码混淆技术31210.2.2 NDK保护31510.2.3 外壳保护31610.3 对抗动态调试31610.3.1 检测调试器31610.3.2 检测模拟器31710.4 防止重编译31810.4.1 检查签名31810.4.2 校验保护31910.5 本章小结320第11章 Android系统攻击与防范32111.1 Android系统安全概述32111.2 手机ROOT带来的危害32111.2.1 为什么要ROOT手机32111.2.2 手机ROOT后带来的安全隐患32211.2.3 Android手机ROOT原理32211.3 Android权限攻击32911.3.1 Android权限检查机制32911.3.2 串谋权限攻击33311.3.3 权限攻击检测33611.4 Android组件安全33911.4.1 Activity安全及Activity劫持演示34011.4.2 Broadcast Receiver 安全34311.4.3 Service安全34511.4.4 Content Provider安全34611.5 数据安全34711.5.1 外部存储安全34711.5.2 内部存储安全34811.5.3 数据通信安全35011.6 ROM安全35111.6.1 ROM的种类35211.6.2 ROM的定制过程35211.6.3 定制ROM的安全隐患35911.6.4 如何防范36011.7 本章小结361第12章 DroidKongFu变种病毒实例分析36212.1 DroidKongFu病毒介绍36212.2 配置病毒分析环境36312.3 病毒执行状态分析36412.3.1 使用APIMonitor初步分析36512.3.2 使用DroidBox动态分析36912.3.3 其他动态分析工具37312.4 病毒代码逆向分析37612.4.1 Java层启动代码分析37612.4.2 Native层启动代码分析38112.4.3 Native层病毒核心分析39312.5 DroidKongFu病毒框架总结40412.6 病毒防治40612.7 本章小结406
❹ OD反编译的用法
先在写TXT的函数上下断点,找到写TXT的子程序。再将汇编语言中的C改成D就行了,再把它重新写成可执行文件就是破解版了。