2024移动APP风险防护与安全测评手册安卓平台.docx
移动APP风险防护刖三 APP面临的安全威胁 APP加固APP原理:APP反编译保护 APP反汇编保护APP防篡改保护 APP防调试与注入保护APP脱壳攻击测试前言AndrOid开发者常常面临的一个问题就是防破解、防二次打包。现如今,安全问题越来越重要,越来越多的Android开发者也开始寻求安全的保护方案。:盗版、数据篡改、山寨:代码修改(广告植入、移除)资源修改(界面替换广告页面、链接篡改)。破解(解除应用付费)篡改应用数据(游戏金币篡改):挂马、添加恶意代码以及病毒(隐私窃取、交易篡改等):动态注入:数据监听、拦截、窃取、修改:本地数据修改、数据库文件修改:服务器欺骗、向服务器发送假数据5E0CD7605E0CD7705E0CD7805EOCD7905E0CD7A05E0CD7B05E0CD7C05E0CD7D05EOCD7E05E0CD7F05EOCD80O5EOCD810Qq687B2254582C382222434522492222395F434252434F444E222CUE006514E44457465633A4F593A22334445223A223144223A2222682E222232223A4D6E432222426900483A315371794922334B7500624422533645563430313A223322222C362C3322352230333633504134226D6F373259652236532C00D30800003A22223030323322722C2253226465353A73222C57552236226953224F533A2C3138226F45535245222222392C6E434B445231zhCN.e.y.b|CGRANCHIJTXCODE,Z,S70021,f"DN"',13623568989"»"MBSKEV":,f"techniquUersion","3.40103',SECC0DE,3636,SKEy“:.”,.passWORD,123654,'USERID,',"11ode'z,1,>监听拦截窃取修改MENU-RTMENl1.SEQMEHU.IHDEXBlEliU_UAlEMEHU_TYPE1.DKJJR1.TIT1.E20320305EOfi三Ei»,倒2/rvltc信用卡查调2032030621账单查询1X信用卡查询20320308W积分查询2/srvltc信用卡查词20320309q人民币还款1Xk信用卡还款2032031050购汇还薇2/servletc信用卡还款20320311N取消购汇还款2/strvlttc信用卡还款2032030170信用卡申请2/xrvltc信用卡申请及开卡2032030280申请进度查询2/servletc信用卡申请及开卡2032030394信用卡开卡2/clintHE信用卡申请及开卡20320304IN账单分期申请1XXq信用卡分期20320307Iq账单分期查询2/servletc信用卡分期203212120信用卡挂失2Zsrvltc信用卡管理20320313妁定运款设置1Xjfdhksz信用卡7D0000000000000000000000000000:应用名称复制或模仿:应用图标复制或模仿:应用内容复制或模仿为了加强APP安全性,越来越多的开发者选择APP加固方案对APP进行加固保护来防止二次打包(盗版)、数据篡改等风险APP加固基本服务:防止逆向分析加密app代码,阻止反编译防止二次打包对app完整性校验保护,防止盗版防止调试及注入阻止动态调试注入,防止外挂、木马窃取账号密码,修改交易金额等防止应用数据窃取加密应用敏感数据,防止泄漏防止木马病毒监测设备环境,防止木马、病毒、恶意应用或钓鱼攻击目前国内APP加固厂商较多,其中以专业从事加固为主打产品的厂商有:爱加密、娜迦(nagain)、梆梆、通付盾等APP加固技术原理以及发展现状目前加固技术主要分为一代和二代:一代(1.O)加固方案1.O的方案是基于类加载的技术,原理:对ClaSSes.dex文件进行完整加密,另存为文件放入资源文件中,通过壳代码(壳dex)进行载入并解密运行:二代(2.0)加固方案2.0的方案是基于方法替换方式,原理:将原dex中的所有方法的代码提取出来进行加密,运行时动态劫持DaIVik虚拟机中解析方法的代码,将解密后的代码交给虚拟机执行引擎Yw各厂商APP加固技术加固技术加固原理加固厂商类加载技术(ar对原ClaSSes.dex文件进行完整加密,另存为文件放入资源文件中,通过壳代码(壳dex)进行载入并解密运行娜迦、爱加密、梆梆、网秦等(1.C)对原dex文件整体压缩加密,保存在壳代理的dex文件尾部,加载到内存中解密运行360方法替换技术(2.0)将原ClaSSes.dex中的所有方法的代码提取出来,单独加密,运行时动态劫持DaIVIk虚拟机中解析方法的代码,将解密后的代码交给虚拟机执行引擎娜迦、梆梆各加固厂商采用的加固保护核心库大致如下(存放在Iib目录或assets目录)加固厂商加固保护核心库娜迦1.0(libchaosvmp.so)>20(libddogso、Iibfdog.so)爰加密Iibexec.soIibexecmain.so梆梆1.0(libsecexe.so>Iibsecmain.so)2.0(libDexHelper.so)360IibprotectCIass.so>Iibjiagu.so通付盾libegis.so网泰IibnqshieId.SO百度Iibbaiduprotect.So腾讯Iibtup.so阿里Iibmobisec-SoAndBd平台应用采用JaVa语言进行开发,由于JdVd语言很容易被反编译,反编译后的代码接近源代码的级别,易读性极高。容易暴露客户端的所有逻辑,比如与服务端的通讯方式,加解密算法、密钥,转账业务流程、软键盘技术实现等等。因此很有必要对JaVa代码进行加密保护,即采用加固方案。Y。APP加固一反编译保护JAVA层保护AndrOid平台采用使用JaVa作为原生语言进行开发。在最终的安装包中,所有的java代码编译并打包到APK中的CIaSSes.dex文件中,java代码的保护的目标就是dasses.dex。 1.0类加载加固技术原理对原ClaSSes.dex文件进行完整加密,另存为文件放入资源文件中,通过壳代码(壳dex)进行载入并解密运行 :*2.0方法替换加固技术原理将原CldSSes.dex中的所有方法的代码提取出来,单独加密,运行时动态劫持DalVik虚拟机中解析方法的代码,将解密后的代码交给虚拟机执行引擎实例:某加固应用 :反编译工具:dex2jar(ApkToolkit)jd-gui等 :反编译结果:无法获取到原dex代码或完整的dex代码privateStringbuilderJscn(StringparamStringlrStringparanString2)JS0N0bectIocalJSONObject=newJSONObjectO;tryIocalJSONObject.put("ansType"fpara5tring2);IocalJSONObject.put(wsnsPhone"rparamScringl);IocalJSONObject.put(wOinTyPe*rS55w);returnIocalJSONObject.toStringO;catch(JsClTExceptionIocaljSCNException)while(true)IocaljSONException.printStacTrace():privatefinalvoidChoiceUser1.oginIfNeedOi=this.InUserManager.getMltIpleUsers().size();If(i=O)Close1.oadingDialofWithBg();AhowToast(2131296976);return;if(!VerifyPhoneIfNeed()return;StringstrlString3tr2=Stringstr3三(String)this.BiUserManager.getUserIds().get(O);(String)thisInUserManagergetNares().get(O);this.sp.getString(-userId-rnull);if(!TextUtils.isfpty(str3)sc(!sr3.equals(scrl)Tool3.ClearNotifacationJPush(this.context);this.ap.editO.putString("userid",Strl).comic();this.sp.editO.putScring("username",str2).comc();Xequesc1.ogin(str2);return;privateStringbuilderJson(StringParaffiStlring1,StringparnString2)(returnnull;private(private(privateprivateprivate(refinalfinalfinalfinalvoidvoidvoidvoidChoiceUaer1.oginIfNeed()dlsablePhonelnputlfHeed()ParseJsonToObject(StringparamString)IequestAppPhoneQuery()voidZequest1.oadGSPassword()finalvoidrequestVerifIcationCode()privatevoidStartActivityWithClearTop(Class<7>pararoClass)privatebooleanVerifyPhone()(returnfalse;1代码抽取保护YOUAPP力!固-反&辑财/NatiVe层保护SO库是采用C/C+语言开发的动态库。So库的逆向要求攻击者需要有一定的汇编语言基础,相比JaVa的反编译,逆向分析的难度更高。反汇编原理:SO库的加密保护技术与PC领域的加壳技术类似。加壳技术是指利用特殊的算法,将可执行程序文件或动态链接库文件的编码进行改变,以达到加密程序编码的目的,阻止反汇编工具如IDA等的逆向分析SO加壳技术,对So库中的汇编代码加密保护E1.F数据信息的隐藏对So库中的动态定位信息,函数地址信息,符号表等E1.F数据信息做清除隐射隐藏保护。 SO文件的整体加密使用自定义链接器的技术,对SO文件进行整体的加密,完全阻止IDA等逆向工具的静态分析。 代码运行态动态清除解密代码动态清除的技术,防止运行时内存存在完整的解密后代码。AoP技术自实现Iinker、自定义So文件格式,完全阻止IDA等反汇编工具与内存dump。实例:某加固应用 So反汇编工具:IDA反汇编方法:使用IDA打开SO库文件,查看反汇编arm汇编代码反汇编结果:无法正常分析SO采用Ae)P技术加壳后,已不是一个正常的E1.F格式文件,如下图,IDA无法反汇编分析,也无法采用内存dump方式进行脱壳¾¾FileEditSearchNavigationViewToolsSpecialistOptionsWindowHelpC)GSQ昌囹涔S电国幽冷的怒爆鼠触-BsDHOffset0123456789ABCDEF,000000003A6121A5A74343D3FDAE576FBFCEFOIC:a!¥§CC6y®Wo4lS1.J00000010ABDEE7C733DOF538DFAFFCEF07FEFC7093D08uiup00000020CCF96CE6805DElAlEFID9DD62998C3D2Iulaelaii0)IAO0000003000000000000000000000000000000000000000400000000000000000000000000000000000000050000000000000000000000000000000000000006000000000000000000000000000000000000000700000000000000000000000000000000000000080000000000000000000000000000000000000009000000000000000000000000000000000自定义S。文件格式000000A000000000000000000000000000000000000000B000000000000000000000000000000000IDA无法识别ooooooco00000000000000000000000000000000000000D000000000000000000000000000000000000000E000000000000000000000000000000000000000F000000000000000000000000000000000000001000000000000000000000000000000000000000110000000000000000000000000000000000000012000000000000000000000000000000000YoursitehereAPP加固-防篡改保护信,修改转账目标账号、金额等等。防篡改原理:失败,即认为客户端为非法客户端并阻止运行。实例:某加固应用防篡改结果:篡改后无法正常运行客户端篡改是指对APP添加或修改代码,修改资源文件,配置信息,图标等,重新编译签名为新的APP,可能添加病毒代码、广告SDk,推广自己的产品;添加恶意代码窃取登录账号密码、支付密码、拦截验证码短APP加固保护后,对加固后的安装包的任何修改,包括代码,资源文件,配置文件等,运行时非法篡改的客户端将被检测到并终止运行。防篡改的技术原理是米用完整性校验技术对安装包自身进行校验,校验的对象包括原包中所有文件(代码、资源文件、配置文件等),一旦校验*APK篡改工具:APK改之理,AndrIidKiIIer动态调试攻击指攻击者利用调试器跟踪目标程序运行,查看、修改内存代码和数据,分析程序逻辑,进行攻击和破解等行为。对于各行业应用客户端,该风险可修改客户端业务操作时的数据,比如账号、金额等。逆向分析用户敏感数据,如登录密码、交易密码等反调试保护原理: 阻止附加调试通过双向PtraCe保护技术,阻止其他进程对本进程进行PtraCe操作 进程调试状态检查通过轮询方式,检测进程的状态是否处于调试状态 信号处理机制利用1.inUX信号机制,检测进程的状态是否处于调试状态实例:某加固应用动态调试工具:IDA 动态调试方法:附加应用进程调试,调试模式启动进程调试结果:无法正常动态调试由于ArldrOid平台没有禁止用于调试的ptrace系统调用,恶意程序在拿到root权限的情况下,可以使用这个API对目标进程的内存、寄存器进行修改,以达到执行shellcode注入恶意模块的目的。在注入恶意模块后,恶意模块就可以动态地获取内存中的各种敏感信息,例如用户的用户名、密码等。反注入原理: 阻止PtraCe注入行为通过双向PtTaCe保护技术,阻止其他注入行为对本进程进行注入操作实例:某加固应用 注入工具:injectIibhooktes1.so注入方法:获取目标进程名,编译mject,PUSh注入工具至手机或模拟器,赋于mject执行权限,运行 注入结果:无法注入目前加固技术已日渐成熟,市面上的反编译工具,脱壳工具基本被屏蔽,对于当前各厂商加固脱壳攻击只能通过人工逆向分析,突破反调试等防护,截获原始dex代码以某应用为例,进行脱壳攻击测试:某加固应用1:以调试模式启动加固后的程序,下断点于SO代码解密函数,解密jni_onload函数后,对其下断点,最后下断点于mmap函数,dump解密后的原始dex某加固应用2:以调试模式启动加固后的程序,下断点于fgets函数,以逆推方法找出判断反调试关键点,对其暴力修改返回值,下断dvmdex函数,dump解密后准备加载的原始dexBIeJumpSearchfewDebUggerOptionsEndowsHdpNbocVe二IUA八r"8×0831FAE)parpF<>ilvd,'-Une5“138zISynchroniiedwithPC>口6X©St<ckne/HM:13dump保存即可一BEXC9C0:Ick:BEDCCSeo(SynchronizedwithSP)UKXMCttX511e7K:d«bugX40:5D7827CCSZ2OC008。2OC99C325OC0033D139006C23OCee7A23eceed(StCk:8EDCCA1C(Stackz8EDCmStackzEDCCA34Stack:8CDCCA1C(&t3clc):8EDCC9DDdebug18z507827ECdebugl30:_ZNStl2_node_alloc8dllocatelFSe7100ooo86e“84F¼S0013ee"A8。0200»8eeee32aooIibdUR.o0831F9:IibdUR.soz31F9IibdVR.ox031F9Iibdvii.soz0831F9.Z21dvMDe×ile0penP4rtialPKvlPP6DvR0e×>«心,7hyg固i11t*8<c¥炉mnq>Hi囤京0o>1.ibraryfvbct>c<D«t«Kt<ultrMziQA'IVbxplM,4dXftsUuctiMtlxl«rtkdsy*bdIibdun.soz0631F96IibdVR.SOZ31F98IlbdUR.soz31F9AUR.SOZW31F9EVR.SOZ0831FA0UR.SO0831FA2it)dun.soz0831FAIibdUR.sox0831FA6ibduw.soz*l831FA8ibdun.%oz0e31FftftibduR.or0831FACibduR.zi31FBeHOUSB1.HOUCBHZIORNOUSIDRADDADDB1.XR2.«0Zl2de×FlleParsePKjiRS.R9RO.IOCJM31FB2R1,-(Dlviku11-e×M31FAC)RO,«6R2vJgxParsoFaJItteeB530IocM31FBEXFileQpeoPerciAl;M507t27ECwdebug1ez5D7827EC4RleSS5wR2BEDCC9EC。(Stack:BEDCC9tCR3831F95。-Z21dun0exFi1e0penPrti<lPKuiPP6DurR0SFS5uRSSD7827EC¼debug18zSD7827ECR6BEDCCM81stack:BE0Cm8.IlMwtIIug”Namefl.Z29javalanqn11gJa三tindexO÷JIijP6JVakjeAddrE40817464D82tC*D7S27FCg7828C;D78281C;D7S282CD78283CD7828CD78285CD78286CD78287CD78288CD78289CD7S28ACD7S2SBC2(MOO23OCOO23OC0023OC8029C002*9C002OC0025OCOB卜AV/1:1HH»9/318Fdrx3CFDCC9C1EDCC9E8DCC9CDCC9F0EDCC911CC9F89COCCAeaO(Xa(MIEOCCAWOCCAKDCealgBEDCC9DDt>00Q0003S36SDBEDCCA3BEDCCA1Cm5F555D7827EC5D1D5F6F90999000BED(XalCBEDCCA3UAPP加固的疑惑?APP采用加固(加壳)的最终目的是为了防止盗版、反编译、动态调试以及恶意注入行为等,但经过脱壳攻击测试后也可证明,加固后仍有被脱壳的风险,可能这个时候大家可能就有疑惑了,还有必要进行加固吗?答案是肯定的,我们举个例子:我们的房子都会安装防盗门,但全世界几乎每天都会有一些家庭失窃,但人们并没有因为安装了防盗门还被小偷偷了东西,从此放弃安装防盗门,加固其实就好比防盗门,并不能百分百保证不被脱壳,当然加固技术也在不断的提高和更新,我们需要选择一款安全性高的加固产品.移动APP安全测评APP安全测评项主要分为以下十项: :终端能力调用安全 :终端资源访问安全通信安全键盘输入安全ACtiVity组件安全。反逆向安全反调试反注入能力反盗版能力敏感信息安全 :认证因素安全检测项工具反编译Dex2jar>jd-gui>apktool反汇编与调试IDApro>Androic1.SerVer二次打包APk改之理、Androidkiller签名(APKSigr1、上上签)通信数据分析Tcpdump>Fiddler十六进制WinHex>Ultraedit进程注入与hookinject>hook贝面劫持hijackDDMS>RootExplorer>数据库(SQ1.iteDeveloper)截屏Screencap脱壳Gdb、ZjDroid前提:1 .调试目标进程不具备防调试机制;2 .设备(手机)需RooT权限。调试步骤:把IDA目录下的Hndroic1.serverPUSh到手机目录,如:data目录,androiC1.SerVer可改名PUSh失败时,可对data目录进行写操作(ChmOd777data)(3)PUSh成功后,对androic1.SerVe赋于执行权限(chmod777android_server 端口转发(adbforwardtcp:23946tcp:23946) 启动IDA-选择菜单DebUgger-AttdCh-RemoteArm1.inux-AndroidDebugger 写入参数HoStname=IoCalhOst,Port=23946选择目标进程名,进行附加调试YjDA调试之启动调试前提:1 .ro.debuggablel=1(11Tffladbshellgetpropro.JebuggabIeSO;2 .设备(手机)需ROoT权限。调试步骤:把IDA目录下的androiC1.SerVerPUSh到手机目录,如:data目录,androiC1.SerVer可改名PUSh失败时,可对data目录进行写操作(Chmod777data) PlJSh成功后,对android_serve赋于执行权限(ChmOd777android_server 端口转发(adbforwardtcp:23946tcp:23946) 反编译APP(应用程序)启动页面(可用反编译工具查看)并启动该页面,如adbshellamstart-D-n包名/页面开启DDMS启动IDA选择菜单DebUggerAttachRemoteArm1.inux-AndroidDebugger写入参数HOStname=IOCdIhOSt,Port=23946选择目标进程名,进行附加调试前提:1 .ro.debuggablel=1(11JBadbshellgetpropro.debuggable);2 .设备(手机)需RoOT权限。调试步骤:首先把apk安装到手机在电脑端把apk解压,用IDA打开解压后的ClaSSes.dex文件并完成分析(Theinitialautoanalysishasbeenfinished.),选择需要调试的断点进行F2下断,如下断在.MainActivity.OnCreate选择DebUgger菜单下的DebUggerOPtions.里面的SetspecificOPtionS选择设置adb路径,填写apk的PaCkagename和ACitiVty,最后F9运行,正常的话断在刚下的断点处.终端能力调用包括短信、彩信、通话、邮件、录音、截屏、摄像头以及推送等Android提供了丰富的SDK,开发人员可以根据开发Android中的应用程序。而应用程序对Android系统资源的访问需要有相应的访问权限,应用程序要想使用某种权限就必须进行明确申请,这种开放性一方面为开发带来了便利,另一方面权限的滥用也会产生很大的隐患,可能造成私人信息的泄漏等风险,如一款游戏app具有通讯录访问权限<intent-filter><service><application>拦截短信权限<uses-permissionandroid:name="androidpermission.RECEIVESMS">SmS短信拦截部分代码Datedatel三newDate(message.getTimestampMillis();SimPleDateFOPmatformat=newSimpleDateFormat("yyyy-MM-ddssn");Stringsendtime=format.format(datel);sb.append(sendtime);sb.append(”短息来源/获取接收短息的电话号码sbappend(message.getDisplayOriginatingAddress();sbappend("n短息内容-动态广癌拦截:nM);/获取短信的内容sb.append(message.getMessageBody();Toast.mfeeText(context,sb.toString(),Toast.1.ENGTH_1.ONG).show();Intentintentl=newIntent(context,MainActivity.class);intentl.addFlags(Intent.F1.AG_ACTIVITY_NEM_TASK);intentl.putExtra("sms",sb.toString();context.StartActivity(Intentl);serviceandroid:name="com.examp1.e.Sms1.istener.MyService"android:enabled-,true,><intent-filter><actionandroid:name="com.e×amp1.e.Sms1.istener.MyService">APP安全-终端资源访问安全检测终端资源主要包括通讯录、通话记录、位置信息、终端基本信息、应用信息、系统权限、用户文件、收藏夹、快捷方式、系统设置、系统资源以及无线外围接口等GPS位置获取部分代码*手机定位Start*/privatevoidsetCriteria()1.ocationManagerIocationManager;StringServiceName=Context.1.OCATION_SERVICE;IocationManager-(1.ocationManager)getSystemService(ServiceName);/Stringprovider=1.ocationManager.GPS_PROVIDER;Criteriacriteria=newCriteria();设置定位的精度criteria.setAccuracy(Criteria.4CClR4C-C04RSE);/获取大体的位置criteria.setAltitudeRequired(false);/海拔信息criteria.setBearingRequired(false);/海拔信息criteria.setCostAllowed(true);/允许产生费用criteria.SetPowerRequirement(Criteria.POwER_1.OW);低功耗Stringprovider-IocationManager.getBestProvider(criteria,true);/获取一个最符合查询条件的61.ocationlocation=IocationManager.get1.astKnown1.ocation(provider);UpdatewithNew1.ocation(Iocation);<!GPS定位权限><uses-permissionandroid:name="android.permission.ACCESS_COARSE_1.OCATION"><uses-permissionandroid:name="android.permission.ACCESS_FINE_1.OCATION">APP通信安全,主要是指客户端与服务器通信过程中,采用的什么协议,如:http简单加密、http安全加密、https加密,其中,Htp简单加密容易被劫持或破解;当采用https协议,是否对服务器证书进行校验,是否可导致中间人攻击风险。Client6:CompleteSS1.handshake1:Connecbonrouter2:Redirecbonmitmproxy3:InitiateSS1.handshakewithSNI4:InitiateSS1.7:Request图片来自(上图引自红黑联盟网对于中间人攻击的基本原理图:由于客户端没有对服务端的证书进行验证,也就是没有验证与其通信的服务端的身份,即客户端默认信任所有的服务端。利用这种信任,mitmproxy作为一个中间人,中转了SS1./T1.S的握手过程。所以实际上,与客户端通信的并不是服务端而是mitmproxy。mitmproxy知道由于通信加密的对称密钥,可以对HTTPS的通信数据进行窃听:mitmproxy将自己的证书提供给客户端,而客户端在不进行校验的情况下,信任并使用此证书对要传输的数据进行加密,之后再传给mitmprox