以下哪些不是android应用的升级的显卡驱动有必要升级吗步骤

 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
android应用开发流程
下载积分:30
内容提示:android应用开发详细开发流程
文档格式:PDF|
浏览次数:1634|
上传日期: 22:54:17|
文档星级:
该用户还上传了这些文档
android应用开发流程
官方公共微信三星S7562为什么更新不了,什么你的手机被设置为阻止安装非Android市场的应用程序_百度知道
三星S7562为什么更新不了,什么你的手机被设置为阻止安装非Android市场的应用程序
//support,祝您生活愉快!您可以按照以下步骤进行设置:http.samsung您好
其他类似问题
为您推荐:
android的相关知识
其他1条回答
进去设置-安全-在允许安装不是电子市场里的应用程序!
问题解决了吧!
谢谢采纳啦~生活愉快!
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁当前访客身份:游客 [
这个人很懒,啥也没写
:引用来自“Neoman”的评论 其实,我相信你过两个...
:很快就会忘记的
:其实,我相信你过两个月又会忘记。这些东西,记住...
:引用来自“programes”的评论为什么不用vundle?...
:引用来自“LeeDylan”的评论youcompleteme 自动补...
:引用来自“programes”的评论 为什么不用vundle?...
:youcompleteme 自动补全插件很是强大,可以看看...
:为什么不用vundle?而选择vim-addins,有什么理由...
今日访问:77
昨日访问:73
本周访问:236
本月访问:797
所有访问:7396
逆向Android软件的步骤
发表于6个月前( 13:30)&&
阅读(95)&|&评论()
0人收藏此文章,
逆向Android软件的步骤:
&&&&&&&&首先使用反编译的工具对反编译,然后阅读反汇编代码,如果有必要还会对其进行动态调试,找到突破口后注入或直接修改反汇编代码,最后重新编译软件进行测试。整个过程可分为反编译、静态分析、动态调试、重编译等4个环节。
&&&&& & 结论:反破解技术也是从这四个方面进行的。
一、对抗反编译工具(如ApkTool、BackSmali、dex2jar),使其无法进行反编译,或者反编译后无法得到软件正确的反汇编代码。
思路是:寻找反编译工具在处理apk或dex文件时的缺陷,然后在自己的软件中加以利用。主要方法有:
1、阅读反编译工具源码,找出漏洞。
2、压力测试。测试大量apk文件,找到反编译工具反编译不了的,分析其特征。
此方法难度较大,而且反编译工具不断升级,方法容易过时,因此不太建议。(不行)
二、对抗静态分析。
1、代码混淆技术:
Android2.3的SDK中正式加入了ProGuard代码混淆工具,开发人员可以使用该工具对自己的代码进行混淆。Android2.3以前的项目同样可以使用此工具。
2、NDK保护。
NDK简介:“android原生开发套件”。他是一款功能强大的工具,可以将原生C,C++代码的强大功能和android应用的图形化界面结合到一起,解决软件的跨平台问题。通过使用该工具,一些应用程序直接通过JNI调用(ps:java native interface,允许Java代码和其他语言编写的代码进行交互)与CPU打交道使性能得到提升。同时能够将程序的核心功能封装进基于“原生开发套件”的模块中,从而大大提高性能!(PS:C/C++的抗攻击能力比Java强)
优势:逆向NDK程序是很困难和繁琐的,安全性很高。
缺点:程序员开发成本提高。
3、外壳保护。
java由于其语言自身特殊性,没有外壳保护这个概念,只能通过混淆方式对其进行保护。外壳保护重点针对使用NDK编写的Native代码,逆向Native本身就已经够困难了,如果添加了外壳保护则更是难上加难,目前已知可用于ARM Linux内核程序的加壳工具只有upx。
PS:关于upx:& &&支持的平台
三、对抗动态调试。
1、检测调试器:
动态调试使用调试器来挂钩软件,获取软件运行时的数据,我们可以在软件中加入检测调试器的代码,当检测到软件被调试器连接时,中止软件的运行。
首先,在AndroidManifest.xml文件的Application标签中加入android:debuggable="false",让程序不可调试,这样,如果别人想调试该程序,就必然会修改它的值,我们在代码中检查它的值来判断程序是否被修改过。代码如下:
if&(0!=(getApplicationInfo().flags&=ApplicationInfo.FLAG_DEBUGGABLE))&{&&
&&&&&&&&&&&&Log.e("DEBUG",&"程序被修改为可调试状态!!!");&&
&&&&&&&&&&&&android.os.Process.killProcess(android.os.Process.myPid());&&
另外,Android SDK中提供了一个方法方便程序员来检测调试器是否已经连接,代码如下:
android.os.Debug.isDebuggerConnected()
如果方法返回真,说明了调试器已经连接。我们可以随机地在软件中插入这行代码来检测调试器,碰到有调试器连接就果断地结束程序运行。
(PS:感觉这是个好的办法!但是不知道是否有破解的方法???如果有必要留待以后查资料)
对抗检测调试器的方法:
方法1:IsDebuggerPersent()/查找PEB中BeingDebugged内容
方法2:检查是否有异常处理器
方法3:利用调试器约定特殊指令检测
方法4:查找当前硬件断点
方法5:在执行特殊函数后检查GetLastError()值
方法6:DebugPort: CheckRemoteDebuggerPresent()/NtQueryInformationProcess()
方法7:检测SetUnhandledExceptionFilter()
方法8:ThreadHideFromDebugger
方法9:进程遍历
方法10:父进程检查
方法11:SeDebugPrivilege()
方法12:FindWindow
方法13:STARTUPINFO
方法14:timecheck
方法N:利用调试器漏洞
(未扩展 &&但是不知道能不能在android上实现这些对抗)
2、检测模拟器。(ps:只是增加了逆向的成本,必须有一台android机器)
软件发布后会安装到用户的手机中运行,如果有发现软件运行在模拟器中,很显然不合常理,可能是有人试图破解或分析它,这种情况我们必须予以阻止。
模拟器与真实的Android手机有许多差异,我们可以在命令提示符下执行"adb shell getprop"查看并对比它们的属性值,经过对比发现如下几个属性值可以用来判断软件是否运行在模拟器中:
ro.product.model、ro.build.tag、ro.kernel.qemu。
编写检测代码如下:
boolean&isRunningInEmualtor()&{&&
&&&&&&&&boolean&qemuKernel&=&&&
&&&&&&&&Process&process&=&&&
&&&&&&&&DataOutputStream&os&=&&&
&&&&&&&&try{&&&&
&&&&&&&&&&&&process&=&Runtime.getRuntime().exec("getprop&ro.kernel.qemu");&&&&
&&&&&&&&&&&&os&=&new&DataOutputStream(process.getOutputStream());&&
&&&&&&&&&&&&BufferedReader&in&=&new&BufferedReader(new&InputStreamReader(process.getInputStream(),"GBK"));&&
&&&&&&&&&&&&os.writeBytes("exit\n");&&&&
&&&&&&&&&&&&os.flush();&&
&&&&&&&&&&&&process.waitFor();&&
&&&&&&&&&&&&qemuKernel&=&(Integer.valueOf(in.readLine())&==&1);&&
&&&&&&&&&&&&Log.d("com.droider.checkqemu",&"检测到模拟器:"&+&qemuKernel);&&&&&&&&&&&&&&&
&&&&&&&&}&catch&(Exception&e){&&&&
&&&&&&&&&&&&qemuKernel&=&&&
&&&&&&&&&&&&Log.d("com.droider.checkqemu",&"run&failed"&+&e.getMessage());&&&
&&&&&&&&}&finally&{&&
&&&&&&&&&&&&try{&&&&
&&&&&&&&&&&&&&&&if&(os&!=&null)&{&&&&
&&&&&&&&&&&&&&&&&&&&os.close();&&&&
&&&&&&&&&&&&&&&&}&&&&
&&&&&&&&&&&&&&&&process.destroy();&&&&
&&&&&&&&&&&&}&catch&(Exception&e)&{&&
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&}&&&&
&&&&&&&&&&&&Log.d("com.droider.checkqemu",&"run&finally");&&&
&&&&&&&&}&&
&&&&&&&&return&qemuK&&
&&&&public&static&String&getProp(Context&context,&String&property)&{&&
&&&&&&&&try&{&&
&&&&&&&&&&&&ClassLoader&cl&=&context.getClassLoader();&&
&&&&&&&&&&&&Class&SystemProperties&=&cl.loadClass("android.os.SystemProperties");&&
&&&&&&&&&&&&Method&method&=&SystemProperties.getMethod("get",&String.class);&&
&&&&&&&&&&&&Object[]&params&=&new&Object[1];&&
&&&&&&&&&&&&params[0]&=&new&String(property);&&
&&&&&&&&&&&&return&(String)method.invoke(SystemProperties,&params);&&
&&&&&&&&}&catch&(Exception&e)&{&&
&&&&&&&&&&&&return&&&
&&&&&&&&}&&
四、防止重编译。
1、检查签名。
每一个软件在发布时都需要开发人员对其进行签名,而签名使用的密钥文件是开发人员所独有的,破解者通常不可能拥有相同的密钥文件,因此,签名成了Andriod软件一种有效的身份标识,如果软件运行时的签名与自己发布时的不同,说明软件被篡改过,这个时候我们就可以让软件中止运行。
获取签名hash值的代码如下:
public&int&getSignature(String&packageName)&{&&&&&&&&
&&&&&&&&PackageManager&pm&=&this.getPackageManager();&&
&&&&&&&&PackageInfo&pi&=&&&
&&&&&&&&int&sig&=&0;&&
&&&&&&&&try&{&&
&&&&&&&&&&&&pi&=&pm.getPackageInfo(packageName,&PackageManager.GET_SIGNATURES);&&
&&&&&&&&&&&&Signature[]&s&=&pi.&&
&&&&&&&&&&&&sig&=&s[0].hashCode();&&&&
&&&&&&&&}&catch&(Exception&e1)&{&&
&&&&&&&&&&&&sig&=&0;&&
&&&&&&&&&&&&e1.printStackTrace();&&
&&&&&&&&}&&
&&&&&&&&return&&&
可使用Eclipse自带的调试版密钥文件生成的apk文件的hash值,与上面的函数获取的hash比较,可以判断签名是否一致。
2、校验保护。(PS:通过联网的方式检验)
重编译Andriod软件的实质是重新编译classes.dex文件,代码经过重新编译后,生成的classes.dex文件的hash值已经改变,我们可以检查程序安装后classes.dex文件的Hash值,来判断软件是否被重打包过。
private&boolean&checkCRC()&{&&
&&&&boolean&beModified&=&&&
&&&&long&crc&=&Long.parseLong(getString(R.string.crc));&&
&&&&ZipFile&&&
&&&&zf&=&new&ZipFile(getApplicationContext().getPackageCodePath());&&
&&&&ZipEntry&ze&=&zf.getEntry("classes.dex");&&
&&&&Log.d("com.droider.checkcrc",&String.valueOf(ze.getCrc()));&&
&&&&if&(ze.getCrc()&==&crc)&{&&
&&&&&&&&beModified&=&&&
}&catch&(IOException&e)&{&&
&&&&e.printStackTrace();&&
&&&&beModified&=&&&
return&beM&&
五:动态修改dalvik字节码 增加逆向分析的难度,这个技术比较新 搜不到相应的比较详细的技术介绍
六:将核心代码隐藏,增加分析的难度,这个技术有待查询
转载自梦想天涯的博客:
更多开发者职位上
1)">1)">1" ng-class="{current:{{currentPage==page}}}" ng-repeat="page in pages"><li class='page' ng-if="(endIndex<li class='page next' ng-if="(currentPage
相关文章阅读您的举报已经提交成功,我们将尽快处理,谢谢!
是不是你sd卡没挂上埃或者把sd卡里面的文件删除了埃重启一下试试。
在电脑安装Sony PC Companion 2.1后打开直接点更新手机就 可以了。
/cn/tools/pc...
大家还关注
(window.slotbydup=window.slotbydup || []).push({
id: '2081942',
container: s,
size: '1000,60',
display: 'inlay-fix'android 版本检测 Android程序的版本检测与更新实现介绍
字体:[ ] 类型:转载 时间:
做个网站的安卓客户端,用户安装到自己手机上,如果我出了新版本怎么办呢?要有版本更新功能,感兴趣的朋友可以了解下
做个网站的安卓客户端,用户安装到自己手机上,如果我出了新版本怎么办呢?要有版本更新功能。 本来版本检测最好可以自动进行。但如果每次开启程序,都要先检测一轮,是一种浪费,毕竟版本更新是小概率的事情。或许可以程序开启的时候,判断一下时间,单日就检测,双日就不检测,或者随机什么的,降低一下检测的频率? 我采取的做法是将检测功能做到了菜单上,用户有需要,就手动打开自己检测一下。反正我们这个是网站客户端,有版本更新,在网站上发个通告就行了。 版本检测与更新有以下几个关键步骤: 1、检测有无新版本 2、下载新版本 3、安装替换新版本 我处理的方案是 1、在assets文件夹新增一个文件:ver.cfg,记录版本信息,纯文本格式,内容只有一句话:
代码如下: Version=1.0
&这个会随安装包装到用户的手机上 然后在网站里面,设置一XML文件ver_apk.xml,内容也只有这么一点:
代码如下: &?xml version="1.0" encoding="utf-8" ?& &string&1.0&/string&
检测的时候,就先访问网站的这个XML,得到最新版本号,然后与手机上的ver.cfg文件里记录的进行比对,不同的话就可以认为存在新版本,提示进行更新。 2、下载的话就是直接下载的,我还不知道怎么弄断点续传 3、安装替换,关键在于签名。就是每个版本的签名要保持一致。否则新的无法替换旧的,提示安装未完成。 ------------------- 天气太冷,咯咯咯 ------------------------------------ 这个功能做在菜单上,触发代码如下:
代码如下: //========================================================================== // 菜单 //========================================================================== private static final String urlApk = "http://3g.***.com/tool/***.apk"; private static final String urlVer = "http://3g.***.com/tool/ver_apk.xml"; @Override public boolean onCreateOptionsMenu(Menu menu) { menu.add(Menu.NONE, Menu.FIRST + 1, 5, "检测更新").setIcon( android.R.drawable.ic_menu_upload); menu.add(Menu.NONE,Menu.FIRST+2,4,"退出").setIcon(android.R.drawable.ic_lock_power_off);
} @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case Menu.FIRST + 1: Toast.makeText(this, "正在检测版本", Toast.LENGTH_LONG).show(); UpdateVer uv = new UpdateVer(urlApk,urlVer,MainActivity.this); uv.checkVer();
case Menu.FIRST + 2: confirmExit();
检测更新因为代码比较多,写成一个类进行封装 UpdateVer.java
代码如下: package android.***; import android.app.A import android.app.AlertD import android.app.D import android.app.ProgressD import android.content.C import android.content.DialogI import android.content.I import android.net.U import android.os.AsyncT import android.util.L import android.webkit.URLU import android.widget.T import java.io.F import java.io.FileNotFoundE import java.io.FileOutputS import java.io.IOE import java.io.InputS import java.net.MalformedURLE import java.net.URL; import java.net.URLC import java.util.P import org.xml.sax.InputS import java.text.SimpleDateF import java.util.D public class UpdateVer extends Activity{ private static final String TAG = "DOWNLOADAPK"; private String PastV private String NowV public ProgressDialog pB private String currentFilePath = ""; private String fileEx=""; private String fileNa=""; private String strURL=""; private String VersionUri =""; private Context mC private final String fileVer = "ver.cfg"; public UpdateVer(String urlapk,String urlver,final Context context){ SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss"); String ver = "?ver=" + df.format(new Date());//主要是避开手机的缓存 strURL = urlapk + VersionUri = urlver + mContext = } public void checkVer() { // 解析Version网页,获取版本号 getVersionxml(VersionUri); } private void compareVer() { load(); //当有最新版本的时候 if(PastVersion != null && !PastVersion.equals(NowVersion)){ Dialog dialog = new AlertDialog.Builder(mContext).setTitle("系统更新") .setMessage(String.format("发现新版本%s,目前版本为%s,请更新!",NowVersion,PastVersion))// 设置内容 // 设置确定按钮 .setPositiveButton("确定" ,new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { pBar = new ProgressDialog(mContext); pBar.setTitle("正在下载"); pBar.setMessage("请稍候..."); pBar.setProgressStyle(ProgressDialog.STYLE_SPINNER); fileEx = strURL.substring(strURL.lastIndexOf(".") + 1,strURL.length()).toLowerCase(); fileEx = fileEx.substring(0,fileEx.lastIndexOf("?")); fileNa = strURL.substring(strURL.lastIndexOf("/") + 1,strURL.lastIndexOf(".")); getFile(strURL); } }).setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int whichButton) { // 点击"取消"按钮之后退出程序 } }).create();// 创建 // 显示对话框 dialog.show(); } else{ Toast.makeText(mContext, String.format("当前为最新版本%s",PastVersion), Toast.LENGTH_LONG).show(); } } private void getFile(final String strPath) { pBar.show(); try{ if (strPath.equals(currentFilePath) ){ getDataSource(strPath); } currentFilePath = strP Runnable r = new Runnable(){ @Override public void run() { try{ getDataSource(strPath); } catch (Exception e){ Log.e(TAG, e.getMessage(), e); } } }; new Thread(r).start(); } catch(Exception e){ e.printStackTrace(); } } /*取得远程文件*/ private void getDataSource(String strPath) throws Exception { if (!URLUtil.isNetworkUrl(strPath)) { Log.d("Tag","error"); } else { /*取得URL*/ URL myURL = new URL(strPath); /*建立联机*/ URLConnection conn = myURL.openConnection(); conn.connect(); /*InputStream 下载文件*/ InputStream is = conn.getInputStream(); if (is == null) { Log.d("tag","error"); throw new RuntimeException("没有读取到文件内容"); } /*建立临时文件*/ File myTempFile = File.createTempFile(fileNa, "." + fileEx); myTempFile.getAbsolutePath(); /*将文件写入临时盘*/ FileOutputStream fos = new FileOutputStream(myTempFile); byte buf[] = new byte[128]; do{ int numread = is.read(buf); if (numread &= 0) {
} fos.write(buf, 0, numread); }while (true); /*打开文件进行安装*/ openFile(myTempFile); try { is.close(); } catch (Exception ex){ Log.d("Tag","error"); Log.e(TAG, "error: " + ex.getMessage(), ex); } } } /* 在手机上打开文件 */ private void openFile(File f) { pBar.cancel(); Intent intent = new Intent(); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setAction(android.content.Intent.ACTION_VIEW); /* 调用getMIMEType()来取得MimeType */ String type = getMIMEType(f); /* 设定intent的file与MimeType */ intent.setDataAndType(Uri.fromFile(f),type); mContext.startActivity(intent); } /* 判断文件MimeType的method */ private String getMIMEType(File f) { String type = ""; String fName = f.getName(); /* 取得扩展名 */ String end = fName.substring(fName.lastIndexOf(".")+1,fName.length()).toLowerCase(); /* 按扩展名的类型决定MimeType */ if(end.equals("m4a") || end.equals("mp3") || end.equals("mid") || end.equals("xmf") || end.equals("ogg") || end.equals("wav")){ type = "audio"; } else if(end.equals("3gp") || end.equals("mp4")){ type = "video"; } else if(end.equals("jpg") || end.equals("gif") || end.equals("png") || end.equals("jpeg") || end.equals("bmp")){ type = "image"; } else if(end.equals("apk")){ /* android.permission.INSTALL_PACKAGES */ type = "application/vnd.android.package-archive"; } else{ type = "*"; } /*如果无法直接打开,就跳出软件清单给使用者选择 */ if(!end.equals("apk")){ type += "/*"; }
} private void getVersionxml(String resourceUrl){ GetVer gv = new GetVer(); gv.execute(resourceUrl); } private boolean load(){ Properties properties = new Properties(); try{ InputStream stream = mContext.getAssets().open(fileVer); //FileInputStream stream = mContext.openFileInput(fileVer); //读取文件内容 properties.load(stream); } catch (FileNotFoundException e){
} catch(IOException e){
} catch(Exception e){
} PastVersion = String.valueOf(properties.get("Version").toString());
} //========================================================================== // GetVer //========================================================================== class GetVer extends AsyncTask&String, Integer, String& { @Override protected String doInBackground(String... urlVer) { String db = URL url = try { url = new URL(urlVer[0]); } catch (MalformedURLException e) { e.printStackTrace(); } InputSource is = try { is = new InputSource(url.openStream()); is.setEncoding("UTF-8"); db = SAXGetVersionService.readRssXml(is); } catch (Exception e) { e.printStackTrace(); }
} @Override protected void onCancelled() { super.onCancelled(); } @Override protected void onPostExecute(String result) { NowVersion = compareVer(); } } }
AndroidManifest.xml要加上几句
代码如下: &uses-permission android:name="android.permission.INTERNET" /& &uses-permission android:name="android.permission.INSTALL_PACKAGES"/& &uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/& &uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/& &uses-permission android:name="android.permission.RESTART_PACKAGES" /& &uses-permission android:name="android.permission.READ_PHONE_STATE" /& &uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /& &uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /& &uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /&
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具

我要回帖

更多关于 显卡驱动有必要升级吗 的文章

 

随机推荐