使用gdb和gdbserver调试Android C/C++程序

1,http://www.gnu.org/software/gdb/download/,下载最新版本的gdb源代码包,我使用的是gdb-7.6.tar.gz,使用tar命令进行解包(tar -xvzf gdb-7.6.tar.gz),cd进gdb-7.6/gdb目录,使用vi找到remote.c中的如下代码:
if(buf_len > 2 * rsa->sizeof_g_packet)

error(_(“Remote ‘g’ packet reply is too long: %s”),rs->buf);

将上面两行注释掉,添加如下代码

if(buf_len > 2 * rsa->sizeof_g_packet)
{
rsa->sizeof_g_packet = buf_len;
for(i = 0; i < gdbarch_num_regs(gdbarch); i++)
{
if(rsa->regs[i].pnum == -1)
continue;
if(rsa->regs[i].offset >= rsa->sizeof_g_packet)
rsa->regs[i].in_g_packet = 0;
else
rsa->regs[i].in_g_packet = 1;
}
}
使用如下命令对代码进行配置、编译和安装

./configure –target=arm-linux –prefix=/usr/local/arm-gdb -v

make

make install

2,gdbserver使用android4.2模拟器中自带的版本(v7.1)

3,将NDK编译好的C/C++可执行程序,上传到模拟器中/data/test目录下,假设可执行程序的名称为testHello。

4,使用命令:gdbserver :7000 /data/test/testHello 启动模拟器端的调试。

5,启动arm-linux-gdb之前,使用vi打开~/.bash_profile文件,在其中添加:

export PATH=$PATH:/usr/local/arm-gdb/bin,以便在程序的其他目录可以直接启动arm-linux-gdb程序

6,cd至ndk编译好的testHello文件所在目录

7,使用如下命令进行端口映射:adb forward tcp:7000 tcp:7000,将模拟器的7000端口和本机的7000端口进行映射

8,使用命令:arm-linux-gdb testHello启动gdb调试

9,使用target remote :7000 链接模拟器中gdbserver启动的服务。

10,自此,我们就可以使用gdb命令进行代码调试了。

爱加密和梆梆加固的破解方法

By Bob Pan

原始链接: http://blog.csdn.net/pxb1988/article/details/17167795

梆梆与爱加密都使用了将原有的dex隐藏, 在运行时解压, 并且通过修改app的类加载器的方式实现加固. 参考:AndoridAPK反逆向解决方案:梆梆加固原理探寻

然而, 不管如何隐藏dex, 最终在运行时都必须释放到内存, 所以本文的思路是从内存中找到解密后的dex文件, 进而得到加固前的apk.

爱加密

爱加密的app并没有做反调试的保护. 打开app之后直接使用gdb连接, 然后用gcore, 产生core dump.

使用ps查看pid

使用gdb连接pid

使用gcore产生core dump

 

将产生的core.1033复制回电脑, 并使用编辑器打开, 通过类名找到dex中string-data段, 然后通过查找’dex.035’可以找到多离string-data最近的个dex头. dex文件头偏移32的整形值就是dex的文件长度. 使用dd命令可以从内存中抠出dex.

通过类名找string-data段

找到最近的dex文件头(0x4f87a08)和dex文件大小0x07c0

使用dd抠出dex

这个文件是个完整的dex文件, 并且可以被dexdump直接打印

梆梆

梆梆加固的程序做了anti-ptrace, 表现为使用gdb –pid 连接不上对应的进程, 利用kernel-model打印ptrace的记录, 可以看出梆梆

l  使用了3个进程互相ptrace.

l  发送错误指令来检查ptrace是否被劫持(反回值是-3行, 尝试让1568进程继续执行, 但是1568并未被ptrace, 必须出错),

l  利用ptrace修改另一个进程的数据(action是5的行).

ptrace系统调用的记录, 右边是ptrace的参数

虽然连不上1552, 但是dalvik是一个多线程的程序, 里面包含主进程, gc线程, binder线程等, 虽然我们用gdb连不上主线程, 但是我们可以连上其他线程, 这些线程的tid在/proc/[pid]/task/目录下.

Gdb连接任意一个tid

拿到coredump后与爱加密一样做相同的处理, 可以拿到dex.

总结

爱加密和梆梆通过隐藏dex确实可以让大部分静态分析工具找不到执行代码, 但是在动态运行的时候无可避免的需要将dex在内存中还原. 虽然梆梆做了反调试, 但是通过其他方式也同样可以获取其内存. 通过本文的方法分析其内存然后恢复dex, 更进一步可以完全恢复原始apk. 从这个角度说, 爱加密和梆梆的加固形同虚设.

 

金山手机毒霸工作原理

本文章由Jack_Jia编写,转载请注明出处。
文章链接:
http://blog.csdn.net/jiazhijun/article/details/8804402

作者:Jack_Jia    邮箱: 309zhijun@163.com

 

一、序言

 

金山手机毒霸(http://m.duba.com/)是金山网络推出的首款Android APP行为管理软件,是首家拦截软件恶意广告、智能防御病毒行为、查杀最新病毒和自主管理高危隐私权限的安卓手机安全管理软件。

它具有如下特色功能:

1、有效清除软件内置广告,拦截软件恶意广告。

2、依托于首创的Java虚拟机拦截技术,更精准更深入的拦截APP的高危行为。

本文将对金山手机毒霸的进行简单的逆向分析,以达到了解其工作原理的目的。金山手机毒霸的最新版本为V2.0,但为了使我们的分析过程简单高效,我们特意选择金山手机毒霸V1.0Beta版本作为分析样本。博友可以通过如下链接下载(http://bbs.xda.cn/thread-11186508-1-1.html)。

 

二、基本信息

 

1、安装包关键路径文件信息

 

lib\srmeabi\:

res\raw :

其中ksremote.mp3、libksrootclient.mp3、rootkeeper.mp3通过后缀名伪装成mp3文件,其实这三个文件为jar包。

 

AndroidMainfest.xml:

 

  1. <application android:theme=”@style/MainStyle” android:label=”@string/app_name_desktop” android:icon=”@drawable/main_icon_big” android:name=”com.ijinshan.duba.main.MobileDubaApplication” android:allowClearUserData=”false” android:debuggable=”false”>
  2.     <activity android:label=”@string/app_name” android:name=”com.ijinshan.duba.main.MainActivity” android:launchMode=”singleTask” android:screenOrientation=”portrait” />
  3.     <activity android:name=”com.ijinshan.duba.main.SplashActivity” android:clearTaskOnLaunch=”true” android:launchMode=”singleTop” android:screenOrientation=”portrait”>
  4.         <intent-filter>
  5.             <action android:name=”android.intent.action.MAIN” />
  6.             <category android:name=”android.intent.category.LAUNCHER” />
  7.         </intent-filter>
  8.     </activity>
  9.     <activity android:name=”com.ijinshan.duba.main.AuthorityActivity” android:screenOrientation=”portrait” />
  10.     <activity android:name=”com.ijinshan.duba.AdUI.AdwareNotifyListActivity” android:screenOrientation=”portrait” />
  11.     <activity android:name=”com.ijinshan.duba.AdUI.AdPrivacyActivty” android:screenOrientation=”portrait” />
  12.     <activity android:name=”com.ijinshan.duba.AdUI.AdScanActivty” android:screenOrientation=”portrait” />
  13.     <activity android:name=”com.ijinshan.duba.AdUI.AdwareLogActivty” android:screenOrientation=”portrait” />
  14.     <activity android:name=”com.ijinshan.duba.AdUI.AdDetailActivty” android:screenOrientation=”portrait” />
  15.     <activity android:name=”com.ijinshan.duba.common.NotifyEntryActivity” android:screenOrientation=”portrait” />
  16.     <activity android:name=”com.ijinshan.duba.malware.MalwareActivity” android:screenOrientation=”portrait” />
  17.     <activity android:name=”com.ijinshan.duba.malware.ScanResultListActivity” android:screenOrientation=”portrait” />
  18.     <activity android:name=”com.ijinshan.duba.malware.VirusDetailActivity” android:screenOrientation=”portrait” />
  19.     <activity android:name=”com.ijinshan.duba.defend.defendActivityTest” android:screenOrientation=”portrait” />
  20.     <activity android:name=”com.ijinshan.duba.privacy.PrivacyActivity” android:screenOrientation=”portrait” />
  21.     <activity android:name=”com.ijinshan.duba.privacy.PrivacyDetailActivity” android:screenOrientation=”portrait” />
  22.     <activity android:name=”com.ijinshan.duba.privacy.PrivacySortActivity” android:screenOrientation=”portrait” />
  23.     <activity android:theme=”@style/DialogActivityStyle” android:name=”com.ijinshan.duba.malware.PcConnectActivity” android:launchMode=”singleInstance” android:screenOrientation=”portrait”>
  24.         <intent-filter>
  25.             <action android:name=”” />
  26.         </intent-filter>
  27.     </activity>
  28.     <activity android:theme=”@style/DialogActivityStyle” android:name=”com.ijinshan.duba.watcher.FileInstNoticeActivity” android:launchMode=”singleInstance” android:screenOrientation=”portrait” />
  29.     <activity android:theme=”@style/DialogActivityStyle” android:name=”com.ijinshan.duba.watcher.AppLaunchMonitorActivity” android:launchMode=”singleInstance” android:screenOrientation=”portrait” />
  30.     <activity android:name=”com.ijinshan.duba.malware.BadNetActivity” android:screenOrientation=”portrait” />
  31.     <activity android:name=”com.ijinshan.duba.main.ShowProtocolActivity” android:screenOrientation=”portrait” />
  32.     <activity android:name=”com.ijinshan.duba.defend.Activity.IngnoreAppActivity” android:screenOrientation=”portrait” />
  33.     <activity android:theme=”@style/DialogActivityStyle” android:name=”com.ijinshan.duba.main.ShowRestartTipDialog” android:launchMode=”singleInstance” android:screenOrientation=”portrait” />
  34.     <service android:name=”com.ijinshan.duba.service.PcConnectService”>
  35.         <intent-filter>
  36.             <action android:name=”” />
  37.         </intent-filter>
  38.     </service>
  39.     <service android:name=”com.ijinshan.duba.defend.DefendService” android:exported=”false” android:process=”:DefendService” />
  40.     <receiver android:name=”com.ijinshan.duba.receiver.AutoRunReceiver” android:permission=”android.permission.RECEIVE_BOOT_COMPLETED” android:exported=”false”>
  41.         <intent-filter>
  42.             <action android:name=”android.intent.action.BOOT_COMPLETED” />
  43.             <category android:name=”android.intent.category.DEFAULT” />
  44.         </intent-filter>
  45.     </receiver>
  46.     <receiver android:name=”com.ijinshan.duba.receiver.ShutdownReceiver”>
  47.         <intent-filter>
  48.             <action android:name=”android.intent.action.ACTION_SHUTDOWN” />
  49.         </intent-filter>
  50.     </receiver>
  51.     <provider android:name=”com.ijinshan.duba.main.DubaConfigProvidor” android:exported=”false” android:authorities=”com.ijinshan.duba.config” />
  52.     <provider android:name=”com.ijinshan.duba.Provider.AdRuleProvidor” android:exported=”false” android:process=”:DefendService” android:authorities=”com.ijinshan.duba.adrule” />
  53.     <provider android:name=”com.ijinshan.duba.Provider.MalwareDBProvidor” android:exported=”false” android:process=”:DefendService” android:authorities=”com.ijinshan.duba.malwaredb” />
  54. </application>

 

 

2、手机毒霸运行时涉及进程及进程组件分布

 

通过对手机毒霸代码逆向分析及运行时进程状态变化,金山手机毒霸代码共在四类进程中被加载运行。

 

(1)com.ijinshan.duba 进程

 

广告扫描引擎、病毒扫描引擎、金山版本控制等逻辑都在该进程中运行,

另外手机毒霸还在15997端口建立监听,PC端可以通过该TCP连接发送命令手机端毒霸扫描。

 

(2)com.ijinshan.duba:DefendService进程

 

广告规则和扫描病毒信息由该进程通过Provider提供。

 

 

(2)com.ijinshan.duba.rootkeeper进程

该进程以ROOT身份运行,该进程提供了手机毒霸其它进程运行需要root身份才能执行的命令的Binder接口,第三方程序进程的代码注入由该进程完成。

 

 

(4)第三方(injected process)被注入程序进程

 

通过ptrace()注入到第三方程序的代码,ksremote.jar和libksrootclient.so完成java虚拟机hook和底层Socket hook。

 

 

三、JAVA虚拟机hook实现原理

目前Android进程代码的注入都是靠ptrace函数来完成。ptrace进程后完成底层函数的重定向。金山毒霸代码注入包括两部分:

 

1、底层C函数HOOK

2、JAVA虚拟机HOOK

 

代码注入基本流程如下:

 

1、com.ijinshan.duba.rootkeeper进程ptrace第三方进程,并注入libksrootclient.so文件

2、libksrootclient.so代码完成底层C函数hook并调用ksremote.jar代码,ksremote.jar完成java虚拟机hook

(1)C代码如何完成对java代码的调用呢?

 

基本代码实现如下:

 

  1. int (*callStatic)(const char* className, const char* methodName);
  2.        JavaVM* (*getJavaVM)();
  3.        JNIEnv* (*getJNIEnv)();
  4. void* handle = dlopen(“/system/lib/libandroid_runtime.so”, RTLD_NOW);
  5. getJNIEnv = dlsym(handle, “_ZN7android14AndroidRuntime9getJNIEnvEv”);
  6.        JNIEnv* env = getJNIEnv();
  7.        jclass classloaderClass = (*env)->FindClass(env,”java/lang/ClassLoader”);
  8.        jmethodID getsysloaderMethod = (*env)->GetStaticMethodID(env,classloaderClass<span style=”font-family: Arial, Helvetica, sans-serif;”> </span>, “getSystemClassLoader”, “()Ljava/lang/ClassLoader;”);
  9.        jobject loader = (*env)->CallStaticObjectMethod(env, classloaderClass, getsysloaderMethod);
  10.        jstring dexpath = (*env)->NewStringUTF(env, “dex文件路径”);
  11.        jstring dex_odex_path = (*env)->NewStringUTF(env,”odex文件路径”);
  12.        jclass dexLoaderClass = (*env)->FindClass(env,”dalvik/system/DexClassLoader”);
  13.        jmethodID initDexLoaderMethod = (*env)->GetMethodID(env, dexLoaderClass, “<init>”, “(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;)V”);
  14.        jobject dexLoader = (*env)->NewObject(env, dexLoaderClass, initDexLoaderMethod,dexpath,dex_odex_path,NULL,loader);
  15.        jmethodID findclassMethod = (*env)->GetMethodID(env,dexLoaderClass,”findClass”,”(Ljava/lang/String;)Ljava/lang/Class;”);
  16.        jstring javaClassName = (*env)->NewStringUTF(env,”加载类名”);
  17.        jclass javaClientClass = (*env)->CallObjectMethod(env,dexLoader,findclassMethod,javaClassName);
  18.        jmethodID start_inject_method = (*env)->GetStaticMethodID(env, adInjectClient_class, “调用方法名”, “()V”);
  19.        (*env)->CallStaticVoidMethod(env,javaClientClass,start_inject_method);

 

(2)java虚拟机hook如何实现呢?
java虚拟机hook都是通过java反射修改系统关键类的关键字段来实现的,我们通过替换LocationManager来看看如何实现的:

 

 

当用户代码运行ServiceManager.getService(“location”)的时候,得到就是手机毒霸的LocationManager了。

 

三、广告拦截原理

 

广告拦截逻辑大致包含以下几个方面:

1、Banner类型广告

当Activity显示的时候,手机毒霸遍历Activity View树,判断View类包名是否为广告平台包名,如果是则添加手机毒霸广告关闭图标,当用户点击关闭图标时,隐藏Banner          广告View。

2、WebView类型广告

判断WebViewClient类名判断是否为广告。

3、Notification类型广告

主要是通过RemoteViews的action来判断是否为广告。

 

另外手机毒霸通过hook Socket接口来完成广告的拦截,通过网络层的拦截来完成广告的拦截。

Android逆向分析必备网址大全||图书资源

几本android安全基础书籍

Android Apps Security

http://www.itpub.net/forum.php?mod=viewthread&tid=1730861

Application Security for the Android Platform: Processes, Permissions, and Other Safeguards

http://www.itpub.net/forum.php?mod=viewthread&tid=1557863

Decompiling Android 一本介绍apk的入口书籍,对dex进入了很形象的剖析!

http://www.itpub.net/forum.php?mod=viewthread&tid=1709054

Android Security: Attacks & Defenses 新出的书籍,没有下载哦!

http://www.amazon.cn/Android-Security-Attacks-and-Defenses-Misra-Anmol/dp/1439896461

支持正版,大家多买实体书!

几个简单教程:

http://securitycompass.github.io/AndroidLabs/lab8.html。一些基础知识。

http://www.mcafee.com/us/resources/white-papers/foundstone/wp-pen-testing-android-apps.pdf。简单渗透。

https://viaforensics.com/category/mobile-security/ 。一个疯狂的网站,里面有大量的信息。

 

 

以下Jack_Jia编写,转载请注明出处。
文章链接:
http://blog.csdn.net/jiazhijun/article/details/8815175

作者:Jack_Jia    邮箱: 309zhijun@163.com

 

以下是本人在日常的应用安全分析及Android病毒分析中收集的与Android逆向分析相关的工具网站,欢迎博友提供未收录的网址。
androidterm:
Android Terminal Emulator
http://code.google.com/p/androidterm/

droidbox:
Android Application Sandbox
https://code.google.com/p/droidbox/

TaintDroid:
Realtime Privacy Monitoring on Smartphones
https://github.com/TaintDroid
http://appanalysis.org/index.html

apktool:
A tool for reverse engineering Android apk files
http://code.google.com/p/android-apktool/

smali:
An assembler/disassembler for Android’s dex format
 https://code.google.com/p/smali/

AndBug:
a debugger targeting the Android platform’s Dalvik virtual machine intended for reverse engineers and developers
https://github.com/swdunlop/AndBug

apkinspector:
APKinspector is a powerful GUI tool for analysts to analyze the Android applications.
https://code.google.com/p/apkinspector/

androguard:
Reverse engineering, Malware and goodware analysis of Android applications … and more (ninja !)
https://code.google.com/p/androguard/

jad:
Java Decompiler tool
 http://www.varaneckas.com/jad/

dex2jar:
Tools to work with android .dex and java .class files
http://code.google.com/p/dex2jar/

ded:
Decompiling Android Applications
http://siis.cse.psu.edu/ded/

ARE:
Virtual Machine for Android Reverse Engineering
https://redmine.honeynet.org/projects/are

STOWAWAY:
A static analysis tool and permission map for identifying permission use in Android applications
http://www.android-permissions.org/

COMDROID:
A static analysis tool for identifying application communication-based vulnerabilities.
http://www.comdroid.org/

dex-decomplier:
Dex decompiler
https://code.google.com/p/dex-decomplier/

amatutor:
Android恶意代码分析教程
 https://github.com/secmobi/amatutor

mobile sandbox:
Provide an Android application file (apk-file) and the Mobile-Sandbox-System will analyze the file for malicious behaviour.
http://mobilesandbox.org/

apkstatics:
a tool for APK static security check
https://code.google.com/p/apkstatics/

DexGuard:
DexGuard is specialized optimizer and obfuscator for Android
 http://www.saikoa.com/dexguard

android-stuff:
This is a repository for random scripts and files using for Android reversing
https://github.com/jlarimer/android-stuff

Dexter:
Dexter is a static android application analysis tool
http://code.google.com/p/android-market-api/

JEB:
The Interactive Android Decompiler.
 http://www.android-decompiler.com/

APK_OneClick:

decompile & disassemble APKs

 http://forum.xda-developers.com/showthread.php?t=873466

 

APK IDE:

小米人APK改之理(Apk IDE)是一款可视化的用于修改安卓Apk程序文件的工具

http://bbs.pediy.com/showthread.php?t=168001

 

ApkToolkit
是一款可视化的用于修改安卓Apk程序文件的工具
http://bbs.pediy.com/showthread.php?t=169975

 

smali-cfgs:

Smali Flow Graphs
https://code.google.com/p/smali-cfgs/

droidwall:
Android Firewall
https://code.google.com/p/droidwall/

connectbot:
Secure shell (SSH) client for the Android platform

https://code.google.com/p/connectbot/

 

金山火眼:

在线APK文件扫描及行为分析

https://fireeye.ijinshan.com/

 

Android安全监测网:
在线监测Android病毒检测
http://www.apk32.com/index.php

 

Virustotal:
VirusTotal is a free service that analyzes suspicious files and URLs and facilitates the quick detection of viruses, worms, trojans, and all kinds of malware.
https://www.virustotal.com/en/

 

SandDroid
An APK Analysis Sandbox
http://sanddroid.xjtu.edu.cn/

 

AndroTotal:
AndroTotal is a free service to scan suspicious APKs against multiple mobile antivirus apps.
http://beta.andrototal.org/

持续更新中…….

Android Bundle类

From:  http://blog.csdn.net/randyjiawenjie/article/details/6651437

今天发现自己连Bundle类都没有搞清楚,于是花时间研究了一下。

根据google官方的文档(http://developer.android.com/reference/android/os/Bundle.html

Bundle类是一个key-value对,“A mapping from String values to various Parcelable types.”

类继承关系:

java.lang.Object
android.os.Bundle

Bundle类是一个final类:
public final class
Bundle
extends Objectimplements Parcelable Cloneable

两个activity之间的通讯可以通过bundle类来实现,做法就是:

(1)新建一个bundle类

  1. Bundle mBundle = new Bundle();

(2)bundle类中加入数据(key -value的形式,另一个activity里面取数据的时候,就要用到key,找出对应的value)

  1. mBundle.putString(“Data”, “data from TestBundle”);

(3)新建一个intent对象,并将该bundle加入这个intent对象

  1. Intent intent = new Intent();
  2. intent.setClass(TestBundle.this, Target.class);
  3. intent.putExtras(mBundle);

完整代码如下:android mainfest.xml如下:

  1. <?xml version=”1.0″ encoding=”utf-8″?>
  2. <manifest xmlns:android=”http://schemas.android.com/apk/res/android”
  3.       package=”com.tencent.test”
  4.       android:versionCode=”1″
  5.       android:versionName=”1.0″>
  6.     <application android:icon=”@drawable/icon” android:label=”@string/app_name”>
  7.         <activity android:name=”.TestBundle”
  8.                   android:label=”@string/app_name”>
  9.             <intent-filter>
  10.                 <action android:name=”android.intent.action.MAIN” />
  11.                 <category android:name=”android.intent.category.LAUNCHER” />
  12.             </intent-filter>
  13.         </activity>
  14.     <activity android:name=”.Target”></activity>
  15.     </application>
  16.     <uses-sdk android:minSdkVersion=”7″ />
  17. </manifest>

两个类如下:intent从TestBundle类发起,到Target类。类1:TestBundle类:

  1. import android.app.Activity;
  2. import android.content.Intent;
  3. import android.os.Bundle;
  4. import android.view.View;
  5. import android.view.View.OnClickListener;
  6. import android.widget.Button;
  7. public class TestBundle extends Activity {
  8.     private Button button1;
  9.     private OnClickListener cl;
  10.     public void onCreate(Bundle savedInstanceState) {
  11.         super.onCreate(savedInstanceState);
  12.         setContentView(R.layout.main);
  13.         button1 = (Button) findViewById(R.id.button1);
  14.         cl = new OnClickListener(){
  15.             @Override
  16.             public void onClick(View arg0) {
  17.                 // TODO Auto-generated method stub
  18.                 Intent intent = new Intent();
  19.                 intent.setClass(TestBundle.this, Target.class);
  20.                 Bundle mBundle = new Bundle();
  21.                 mBundle.putString(“Data”, “data from TestBundle”);//压入数据
  22.                 intent.putExtras(mBundle);
  23.                 startActivity(intent);
  24.             }
  25.         };
  26.         button1.setOnClickListener(cl);
  27.     }
  28. }

类2: Target

  1. import android.app.Activity;
  2. import android.os.Bundle;
  3. public class Target extends Activity{
  4.     public void onCreate(Bundle savedInstanceState) {
  5.         super.onCreate(savedInstanceState);
  6.         setContentView(R.layout.target);
  7.         <span style=”color:#ff6600;”>Bundle bundle = getIntent().getExtras();   </span> //得到传过来的bundle
  8.         String data = bundle.getString(“Data”);//读出数据
  9.         setTitle(data);
  10.     }
  11. }

布局文件:main.xml

  1. <?xml version=”1.0″ encoding=”utf-8″?>
  2. <LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”
  3.     android:orientation=”vertical”
  4.     android:layout_width=”fill_parent”
  5.     android:layout_height=”fill_parent”
  6.     >
  7. <TextView
  8.     android:layout_width=”fill_parent”
  9.     android:layout_height=”wrap_content”
  10.     android:text=”@string/hello”
  11.     />
  12. <Button
  13.     android:layout_width=”fill_parent”
  14.     android:layout_height=”wrap_content”
  15.     android:text=”@string/button”
  16.     android:id = “@+id/button1”
  17.     />
  18. </LinearLayout>

 

target.xml

  1. <?xml version=”1.0″ encoding=”utf-8″?>
  2. <LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”
  3.     android:orientation=”vertical”
  4.     android:layout_width=”fill_parent”
  5.     android:layout_height=”fill_parent”
  6.     >
  7. <TextView
  8.     android:layout_width=”fill_parent”
  9.     android:layout_height=”wrap_content”
  10.     android:text=”@string/target”
  11.     />
  12. </LinearLayout>

String.xml

  1. <?xml version=”1.0″ encoding=”utf-8″?>
  2. <resources>
  3.     <string name=”hello”>Hello World, TestBundle!</string>
  4.     <string name=”app_name”>测试Bundle用法</string>
  5.     <string name=”button”>点击跳转</string>
  6.     <string name=”target”>来到target activity</string>
  7. </resources>

结果:

跳转结果:

Android的logcat命令详解

    (1) 显示全部日志信息:adb logcat

(2) 显示某一TAG的日志信息:adb logcat -s TAG名称

(3) 显示某一TAG的某一级别的日志信息:adb logcat TAG名称:级别…..TAG名称:级别 *:S

注:日志级别(V-verbose,D-debug,I-info,W-warning,E-error,F-fatal,S-silent),*:S(确保日志输出的时候是按照过滤器的说明限制)

(4) 显示某一级别以上的全部日志信息:adb logcat *:级别

(5) 以某种格式显示日志信息:adb logcat -v 格式

注:日志格式(brief,process,tag,thread,raw,time,long)

(6) 显示缓冲区中的日志信息:adb logcat -b 缓冲区类型

注:缓冲区类型(radio-无线缓冲区,events-事件缓冲区,main-主缓冲区,默认)

(7) 清理已经存在的日志:adb logcat -c

(8) 将日志显示在控制台后退出:adb logcat -d

(9) 将日志输出到文件:adb logcat -f 文件名

 

注:DDMS的LogCat中文乱码:修改MultiLineReceiver类中的addOutput()方法,将其中的”ISO-8859-1″改成”UTF-8″,重新编译源码。

From: http://blog.csdn.net/mayingcai1987/article/details/6364657

MessageDigest的功能及用法

MessageDigest 类为应用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法。信息摘要是安全的单向哈希函数,它接收任意大小的数据,并输出固定长度的哈希值。

MessageDigest 对象开始被初始化。该对象通过使用 update()方法处理数据。任何时候都可以调用 reset()方法重置摘要。一旦所有需要更新的数据都已经被更新了,应该调用digest() 方法之一完成哈希计算。

对于给定数量的更新数据,digest 方法只能被调用一次。在调用 digest 之后,MessageDigest 对象被重新设置成其初始状态。

1、public static MessageDigest getInstance(String algorithm)
                                 throws NoSuchAlgorithmException
   返回实现指定摘要算法的 MessageDigest 对象。
   algorithm - 所请求算法的名称
2、public static MessageDigest getInstance(String algorithm,
                                        String provider)
                                 throws NoSuchAlgorithmException,
                                        NoSuchProviderException
  返回实现指定摘要算法的 MessageDigest 对象。
  algorithm - 所请求算法的名称
  provider - 提供者的名称。
3、public void update(byte[] input)
  使用指定的 byte 数组更新摘要。
4、public byte[] digest()
  通过执行诸如填充之类的最终操作完成哈希计算。在调用此方法之后,摘要被重置。
5、public static boolean isEqual(byte[] digesta,
                              byte[] digestb)
比较两个摘要的相等性。做简单的字节比较。

 

 

注意:Provider可以通过 java.security.Security.getProviders() 方法获取已注册提供者列表。比较常用的有“SUN”

SUN提供的常用的算法名称有:MD2
MD5
SHA-1
SHA-256
SHA-384
SHA-512

 

Code举例:

import java.security.*;
public class myDigest {
  public static void main(String[] args)  {
    myDigest my=new myDigest();
    my.testDigest();
  }
  public void testDigest()
  {
   try {
     String myinfo="我的测试信息";
    //java.security.MessageDigest alg=java.security.MessageDigest.getInstance("MD5");
      java.security.MessageDigest alga=java.security.MessageDigest.getInstance("SHA-1");
      alga.update(myinfo.getBytes());
      byte[] digesta=alga.digest();
      System.out.println("本信息摘要是:"+byte2hex(digesta));
      //通过某中方式传给其他人你的信息(myinfo)和摘要(digesta) 对方可以判断是否更改或传输正常
      java.security.MessageDigest algb=java.security.MessageDigest.getInstance("SHA-1");
      algb.update(myinfo.getBytes());
      if (algb.isEqual(digesta,algb.digest())) {
         System.out.println("信息检查正常");
       }
       else
        {
          System.out.println("摘要不相同");
         }
   }
   catch (java.security.NoSuchAlgorithmException ex) {
     System.out.println("非法摘要算法");
   }
  }
  public String byte2hex(byte[] b) //二行制转字符串
    {
     String hs="";
     String stmp="";
     for (int n=0;n<b.length;n++)
      {
       stmp=(java.lang.Integer.toHexString(b[n] & 0XFF));
       if (stmp.length()==1) hs=hs+"0"+stmp;
       else hs=hs+stmp;
       if (n<b.length-1)  hs=hs+":";
      }
     return hs.toUpperCase();
    }
}

关于Java加密的更多信息:http://www.ibm.com/developerworks/cn/java/l-security/

Android恶意软件分析

Android恶意软件分析

From: http://www.freebuf.com/articles/terminal/5524.html

@ 终端安全 2012-09-04 共 6746 人围观

Author:cs24
Site:http://www.freebuf.com 

这是SANS的研究报告《Dissecting Andro Malware》2011年的作品,在tobe的鼓励下,把他读完了,说不上一对一的翻译,把主要的大意摘录如下:

先说说恶意软件分析:

恶意软件分析其实是一个拆解它的过程,学习它的代码结构,操作,功能。通常以以下几点为目标:

 

理解漏洞如何被利用,系统受攻击的原因。
研究攻击的严重性以及防御措施
渗透到受攻击的数据,以便调查它的来源,获得更多其他受攻击机器的信息

 

取证调查员和系统工程师,通常利用逆向工程技术分析恶意软件,分析恶意软件的工作流程,执行了的操作,功能。由此来理解恶意软件对受害机器的文件,服务,代码和变量做了哪些增加或修改。这个分析通常有两种方法静态分析和动态分析,又叫行为分析和代码分析。

关于这个报告:

这个项目(指这篇报告)的目的就是理解Android恶意软件是如何工作的。这个项目会涉及到以下几个主要步骤:

 

创建独立的虚拟环境
静态分析
动态分析
总结每个分析的的发现和漏洞情况,编写统计结果报告
提出修复措施

 

这个项目还是一个逆向工程的参考材料,针对恶意软件用到的工具,方法论的一个参考。

转入正题:

 

静态分析,又称行为分析,通常分析和研究恶意软件的行为,研究恶意软件与所在环境如何交互,如何增加服务,篡改文件,截取数据,网络连接方式,端口打开情况等。把收集到的数据重新整合和映射到一起,以便进行全局的分析。

 

报告具体内容:

动态分析,又称为代码分析,也就是对恶意软件的代码进行分析,但是通常要对恶意软件的代码进行分析是非常困难,特别是要分析的通常是以编译过的二进制代码。所以需要反编译它为汇编代码,通过代码分析,逆向工程师从中提取内嵌的实际恶意代码。

恶意软件分析工具

 

实验环境工具--Virtual Box,VMware,Sandbox GFI
静态分析--Process Monitor,Wireshark,PEiD,TCPView,WinHex,Process Explorer,Winanalysis,Strings
动态分析--Ollydbg,IDA Pro,Dex2jar,JD-GUI,Baksmali,Apktool

 

恶意代码分析的目标终极目标当然是找出如何防范恶意软件的攻击了。这样就得回答两个问题,一个是,系统是怎样被攻击的,第二是恶意软件利用什么漏洞进行攻击。

 

(此处省略android系统架构性描述,android市场,android市场安全检测,一些目前已发现漏洞病毒,如CVExxx,都是些千篇一律的描述,没有翻译了。有兴趣的可以看原文,或者找对应的中文材料学习)

(此处在再次省略有关几个分析工具的简单介绍,包括VirtualBox的安装运行,android模拟器Emulator,反编译工具Apktool, 监控工具wireshark,其他Dex2Jar,JD-GUI,这些都是必备工具,想必也不是靠一个报告三言两语说得清楚,具体用法个人觉得可以参考其 他中文材料)

分析实例:

动态分析DroidKungFu2-A

首先,用7-zip解压恶意apk文件“droida.apk”,查看如下图所示:

包括了Android Manifest xml文件,classes.dex文件。恶意软件作者通常把自己的代码插入到原始代码中,以减少被怀疑的风险。他们修改了Android Manifest文件和其他apk中的文件后,用他们自己的key重新编译。下图显示了分析中发现修改过的Android Manifest文件。

 

当运行程序的时候,就会激活名为android.intent.action.MAIN的活动,而该获得会伴随激活 com.enguan.state.Dialog活动,这个活动会触发两个服务,分别为com.eguan.state.StateService和 com.eguan.state.Receiver。(<action
android:name=”android.intent.action.MAIN” />就是apk最先启动的东西了。)为了弄清楚这些活动,就需要反编译apk文件了。这里就要用到Apktool工具了。下图显示使用Apktool进行反编译

 

反编译后如下图所示包含有Android Mainifest文件和dex文件。

通过分析文件中包含StateService的activity的代码,我们发现这段代码启动了一个名为 com.eguan.state.StateService的服务。它创建了一个intent object的实例,创建了一个com.eguan.state.StateService类的对象,把这个对象传给constructor之后通过其启 动了名为startService的服务。然而要更深入的分析就必须分析Java代码了。于是就利用Dex2Jar工具,把Dalvik可执行文 件.dex转换为Java的.class文件。命令如下图所示:

 

转换后,把生成的jar文件导入JD-GUI工具中,就可以列出所有的包和它对应的java文件了从中查找启动服务的对应代码:

 

Intent intent = new Intent (this, com.eguan.state.StateService.class);
startService (intent);

 

由此com.eguan.state.Dialog Activity退出后,但是com.
eguan.state.StateService服务仍然在后台运行,最初的activity在已经在设备上运行,但是用户并没有察觉到可以的 activity在后台运行。一旦该服务启动,恶意软件就在后台收集窃取信息,包括IMEI号码,手机模式,Android版本等,如下图所示:StateService的java代码分析

 

UpdateInfo()函数负责把收集以上信息,利用StringBuilder函数写入到本地的/data/data如下图所示:

这些数据随后会发送到一个远程的服务器上。利用wireshark抓包分析可看到源地址10.0.2.15(手机)发生到目标服务器58.63.244.72,如下所示:

通过分析抓包文件,如下图所示:

 

对以下经过URL加密的请求解码

 

o r   r e t a i n s   f

http://gw.youmi.net/reqad?aid=dd598637f9461413&da={%22w%22%3A320%2C%22dd%22%3A%22HTC%20Magic%22%2C%22dv%22%3A%22smc_voda_wwe%22%2C%22ts%22%3A%220%22%2C%22sv%22%3A%221.1%22%2C%22po%22%3A%22android%201.5%22%2C%22cid%22%3A%22162fbcbb180446ef5573b679baad3f30%22%2C%22h%22%3A480}&out=0&rt=2010-05-29%2012%3A25%3A31&src=3&ver=1.0&sig=ERMdekHHiUYznbRN%2BK5MJ49Oyvw%3D

 

可发现

包括了mobile model名称“HTC MAGIC”Android的版本1.5,IMEI号码,和其他参数。

漏洞利用代码分析

当activity运行的时候,Service就会启动,从而加载create()函数的代码,如下图所示:

而该函数里面有一个getPermission()的方法,检查是否有root访问权限。通过检查su是否在设备上安装来实现。如下图所示。

通过checkPermission检查设备是否已经越狱。

如果没有,就尝试访问一个叫secbino的本地文件,并从asset 目录复制漏洞利用代码,并改变其访问权限,如下图代码所示:

成功后就会执行漏洞利用代码,由oldrun函数负责执行越狱操作。如下图所示:

 

当越狱成功后,就可在用户不知情情况下下载更多的恶意软件了,并进行安装,删除等操作。

静态分析:

首先是通过virutotal.com多引擎杀毒网站扫描,显示53%的杀毒引擎都报告有毒。

之后,通过adb命令把该apk应用往android模拟器–AVD(Android Virtual Device)安装。命令如下图所示:

安装成功后,运行该程序。原始的activity会载入com.al len.txthej包,同时内嵌了恶意代码com.eguan.state包,运行效果如下图所示:

恶意activity,com.state.eguan.Dialog在后台运行,这时它还不需要root访问权限,而原始的com.allen.txthej activity也是启动起来的。如下图所示,原始服务和恶意activity同时运行:

 

由于程序是运行在Android SDK环境中,该环境没有提供root访问权限,因此不运行SDK被越狱,所以当程序尝试去root权限访问时就会抛出异常

 

(此处个人觉得原文的静态分析这部分也简单了一点…很多前面提到的静态分析工具,Process Monitor,Wireshark,PEiD,TCPView,WinHex,Process Explorer,Winanalysis,Strings都没看到发挥用场。另外也有个疑问,对于那张同时看到原始服务和恶意activity同时运行的图是怎么看到的,直接看设置无需借助工具?还是用了什么工具呢?)

 

分析总结:

DroidKungFu-2A这个恶意软件,会截取IMEI号码,手机模块名称,SDK版本,然后存储到一个本地文件,随后通过HTTP GET请求的方式把信息使用URL加密发送到远程服务器。恶意软件还会检查设备是否已经被越狱,如果没有就会尝试访问SU,并改变其权限,成功后就会下载 更多的恶意软件包,实现远程安装和卸载程序包,修改浏览器主页等。

建议:

 

从可信源下载应用
在程序安装的时候,检查其许可要求
操作系统和软件都要更新到最新版本,安装必要的安全补丁
下载安装一个杀毒引擎并保持更新
检查正在浏览的网站,通过AD/Script拦截器保护免受恶意代码侵害
禁止自动运行特性,经常备份系统
启用防火墙
下载应用时,检查一下他的评分和评价情况
不要通过没有密码或不经过加密的wifi热点上网浏览敏感数据
警惕是否的警告,是否系统中出现了不正常的行为。

 

最后,本文需要用到的基础知识包括Android中activity的概念,Intent的概念,Android Manifest xml文件结构等等知识,所以这里所翻译的只是冰山一角,真正只能是抛砖引玉。而且后来找资料才发现原来这篇原文,多次出现在入门必看的list中,连诸 葛博士也推荐了一把。建议还是看原文的好。

Java代码到smali代码 | Java代码到Java字节码

在Android逆向中,经常有这样的需求,通过在smali文件中修改或者插入一个函数调用来显示(输出)这个apk中的一个变量或者函数trace或者去修改、去除apk的一个功能等。

java中的函数代码总是非常容易就能知道了。身为一个Java程序员而不是汇编程序员,想要直接写出smali代码总是那么困难。但是如果能把Java代码很方便的转成对应的smali代码的话,那就极为完美了。

这篇文章就这么来的。

在本例中我们想要查看 java反射机制里面的invoke函数的smali代码的写法,

1.首先,java代码写出如下: InvokeDemo.java :

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.Integer;
class A{
public int inv(String str)
{
return Integer.parseInt(str);
}
}

public class InvokeDemo {

/**
* @param args
*/

public static void main(String[] args) {

Integer i = new Integer(11);

try {
Class c = Class.forName(“A”);
Object obj = c.newInstance();
Method m = c.getMethod(“inv”, String.class);

String astr = “1122”;
int aint = (int) m.invoke(obj, astr);
System.out.println(“original string : ” + astr);
System.out.println(” + 1 : ” + (aint + 1));
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}

}

}//end of class

2.然后将.java文件编译成为.class文件。

javac InvokeDemo.java

会生成如下两个文件:

A.class 和 InvokeDemo.class

3. 然后将.class文件编译为.dex文件:

dx –dex –output=InvokeDemo.dex A.class InvokeDemo.class

恩生成.dex文件了.

4.将.dex文件反编译为.smali 文件

./baksmali InvokeDemo.dex

然后, InvokeDemo的.smali代码就在out目录里面了。

用gedit 就可以查看,大牛通常都用vi来看得,你懂的。装b青年会用vim..  小菜只能用gedit了。擦

ps. 如果jdk是1.7版本,在dx 将.class文件生成.dex文件的时候会提示:

trouble processing:
bad class file magic (cafebabe) or version (0033.0000)
…while parsing A.class
…while processing A.class
之类的错误。 这时候你应该知道,在jdk1.6下,是可以非常顺利的使用dx转成.dex的。不要对我说的这个方法有啥怀疑哦。。。。

就这样了,了做记录

keytool命令详解

 

转自http://hi.baidu.com/qianshuifanchuan/blog/item/6291b8510009ad3c42a75b8e.html

Keytool是一个Java数据证书的管理工具 ,Keytool将密钥(key)和证书(certificates)存在一个称为keystore的文件中在keystore里,包含两种数据:

密钥实体(Key entity)——密钥(secret key)又或者是私钥和配对公钥(采用非对称加密)

可信任的证书实体(trusted certificate entries)——只包含公钥

ailas(别名)每个keystore都关联这一个独一无二的alias,这个alias通常不区分大小写

 

JDK中keytool常用命令:

-genkey      在用户主目录中创建一个默认文件”.keystore”,还会产生一个mykey的别名,mykey中包含用户的公钥、私钥和证书

(在没有指定生成位置的情况下,keystore会存在用户系统默认目录,如:对于window xp系统,会生成在系统的C:\Documents and Settings\UserName\文件名为“.keystore”)

-alias       产生别名

-keystore    指定密钥库的名称(产生的各类信息将不在.keystore文件中)

-keyalg      指定密钥的算法 (如 RSA  DSA(如果不指定默认采用DSA))

-validity    指定创建的证书有效期多少天

-keysize     指定密钥长度

-storepass   指定密钥库的密码(获取keystore信息所需的密码)

-keypass     指定别名条目的密码(私钥的密码)

-dname       指定证书拥有者信息 例如:  “CN=名字与姓氏,OU=组织单位名称,O=组织名称,L=城市或区域名称,ST=州或省份名称,C=单位的两字母国家代码”

-list        显示密钥库中的证书信息      keytool -list -v -keystore 指定keystore -storepass 密码

-v           显示密钥库中的证书详细信息

-export      将别名指定的证书导出到文件  keytool -export -alias 需要导出的别名 -keystore 指定keystore -file 指定导出的证书位置及证书名称 -storepass 密码

-file        参数指定导出到文件的文件名

-delete      删除密钥库中某条目          keytool -delete -alias 指定需删除的别  -keystore 指定keystore  -storepass 密码

-printcert   查看导出的证书信息          keytool -printcert -file yushan.crt

-keypasswd   修改密钥库中指定条目口令    keytool -keypasswd -alias 需修改的别名 -keypass 旧密码 -new  新密码  -storepass keystore密码  -keystore sage

-storepasswd 修改keystore口令      keytool -storepasswd -keystore e:\yushan.keystore(需修改口令的keystore) -storepass 123456(原始密码) -new yushan(新密码)

-import      将已签名数字证书导入密钥库  keytool -import -alias 指定导入条目的别名 -keystore 指定keystore -file 需导入的证书

 

下面是各选项的缺省值。

-alias “mykey”

-keyalg “DSA”

-keysize 1024

-validity 90

-keystore 用户宿主目录中名为 .keystore 的文件

-file 读时为标准输入,写时为标准输出

1、keystore的生成:

分阶段生成:

keytool -genkey -alias yushan(别名) -keypass yushan(别名密码) -keyalg RSA(算法) -keysize 1024(密钥长度) -validity 365(有效期,天单位) -keystore

e:\yushan.keystore(指定生成证书的位置和证书名称) -storepass 123456(获取keystore信息的密码);回车输入相关信息即可;

一次性生成:

keytool -genkey -alias yushan -keypass yushan -keyalg RSA -keysize 1024 -validity 365 -keystore  e:\yushan.keystore -storepass 123456 -dname “CN=(名字与

姓氏), OU=(组织单位名称), O=(组织名称), L=(城市或区域名称), ST=(州或省份名称), C=(单位的两字母国家代码)”;(中英文即可)

2、keystore信息的查看:

keytool -list  -v -keystore e:\keytool\yushan.keystore -storepass 123456

显示内容:

———————————————————————

Keystore 类型: JKS

Keystore 提供者: SUN

您的 keystore 包含 1 输入

别名名称: yushan

创建日期: 2009-7-29

项类型: PrivateKeyEntry

认证链长度: 1

认证 [1]:

所有者:CN=yushan, OU=xx公司, O=xx协会, L=湘潭, ST=湖南, C=中国

签发人:CN=yushan, OU=xx公司, O=xx协会, L=湘潭, ST=湖南, C=中国

序列号:4a6f29ed

有效期: Wed Jul 29 00:40:13 CST 2009 至Thu Jul 29 00:40:13 CST 2010

证书指纹:

MD5:A3:D7:D9:74:C3:50:7D:10:C9:C2:47:B0:33:90:45:C3

SHA1:2B:FC:9E:3A:DF:C6:C4:FB:87:B8:A0:C6:99:43:E9:4C:4A:E1:18:E8

签名算法名称:SHA1withRSA

版本: 3

——————————————————————–

 

缺省情况下,-list 命令打印证书的 MD5 指纹。而如果指定了 -v 选项,将以可读格式打印证书,如果指定了 -rfc 选项,将以可打印的编码格式输出证书。

 

keytool -list  -rfc -keystore e:\yushan.keystore -storepass 123456

显示:

——————————————————————————————————-

Keystore 类型: JKS

Keystore 提供者: SUN

您的 keystore 包含 1 输入

别名名称: yushan

创建日期: 2009-7-29

项类型: PrivateKeyEntry

认证链长度: 1

认证 [1]:

—–BEGIN CERTIFICATE—–

MIICSzCCAbSgAwIBAgIESm8p7TANBgkqhkiG9w0BAQUFADBqMQ8wDQYDVQQGDAbkuK3lm70xDzAN

BgNVBAgMBua5luWNlzEPMA0GA1UEBwwG5rmY5r2tMREwDwYDVQQKDAh4eOWNj+S8mjERMA8GA1UE

CwwIeHjlhazlj7gxDzANBgNVBAMTBnl1c2hhbjAeFw0wOTA3MjgxNjQwMTNaFw0xMDA3MjgxNjQw

MTNaMGoxDzANBgNVBAYMBuS4reWbvTEPMA0GA1UECAwG5rmW5Y2XMQ8wDQYDVQQHDAbmuZjmva0x

ETAPBgNVBAoMCHh45Y2P5LyaMREwDwYDVQQLDAh4eOWFrOWPuDEPMA0GA1UEAxMGeXVzaGFuMIGf

MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCJoru1RQczRzTnBWxefVNspQBykS220rS8Y/oX3mZa

hjL4wLfOURzUuxxuVQR2jx7QI+XKME+DHQj9r6aAcLBCi/T1jwF8mVYxtpRuTzE/6KEZdhowEe70

liWLVE+hytLBHZ03Zhwcd6q5HUMu27du3MPQvqiwzTY7MrwIvQQ8iQIDAQABMA0GCSqGSIb3DQEB

BQUAA4GBAGoQQ1/FnTfkpQh+Ni6h3fZdn3sR8ZzDMbOAIYVLAhBb85XDJ8QZTarHbZMJcIdHxAl1

i08ct3E8U87V9t8GZFWVC4BFg/+zeFEv76SFpVE56iX7P1jpsu78z0m69hHlds77VJTdyfMSvtXv

sYHP3fxfzx9WyhipBwd8VPK/NgEP

—–END CERTIFICATE—–

——————————————————————————————————-

3、证书的导出:

keytool -export -alias yushan -keystore e:\yushan.keystore -file e:\yushan.crt(指定导出的证书位置及证书名称) -storepass 123456

4、查看导出的证书信息

keytool -printcert -file yushan.crt

显示:(在windows下可以双击yushan.crt查看)

———————————————————————–

所有者:CN=yushan, OU=xx公司, O=xx协会, L=湘潭, ST=湖南, C=中国

签发人:CN=yushan, OU=xx公司, O=xx协会, L=湘潭, ST=湖南, C=中国

序列号:4a6f29ed

有效期: Wed Jul 29 00:40:13 CST 2009 至Thu Jul 29 00:40:13 CST 2010

证书指纹:

MD5:A3:D7:D9:74:C3:50:7D:10:C9:C2:47:B0:33:90:45:C3

SHA1:2B:FC:9E:3A:DF:C6:C4:FB:87:B8:A0:C6:99:43:E9:4C:4A:E1:18:E8

签名算法名称:SHA1withRSA

版本: 3

———————————————————————–

5、证书的导入:

准备一个导入的证书:

keytool -genkey -alias shuany -keypass shuany -keyalg RSA -keysize 1024 -validity 365 -keystore  e:\shuany.keystore -storepass 123456 -dname “CN=shuany,

OU=xx, O=xx, L=xx, ST=xx, C=xx”;

keytool -export -alias shuany -keystore e:\shuany.keystore -file e:\shuany.crt -storepass 123456

 

现在将shuany.crt 加入到yushan.keystore中:

keytool -import -alias shuany(指定导入证书的别名,如果不指定默认为mykey,别名唯一,否则导入出错) -file e:\shuany.crt -keystore e:\yushan.keystore -storepass

123456

keytool -list  -v -keystore e:\keytool\yushan.keystore -storepass 123456

显示:

——————————————————————————

Keystore 类型: JKS

Keystore 提供者: SUN

您的 keystore 包含 2 输入

别名名称: yushan

创建日期: 2009-7-29

项类型: PrivateKeyEntry

认证链长度: 1

认证 [1]:

所有者:CN=yushan, OU=xx公司, O=xx协会, L=湘潭, ST=湖南, C=中国

签发人:CN=yushan, OU=xx公司, O=xx协会, L=湘潭, ST=湖南, C=中国

序列号:4a6f29ed

有效期: Wed Jul 29 00:40:13 CST 2009 至Thu Jul 29 00:40:13 CST 2010

证书指纹:

MD5:A3:D7:D9:74:C3:50:7D:10:C9:C2:47:B0:33:90:45:C3

SHA1:2B:FC:9E:3A:DF:C6:C4:FB:87:B8:A0:C6:99:43:E9:4C:4A:E1:18:E8

签名算法名称:SHA1withRSA

版本: 3

*******************************************

*******************************************

别名名称: shuany

创建日期: 2009-7-29

输入类型: trustedCertEntry

所有者:CN=shuany, OU=xx, O=xx, L=xx, ST=xx, C=xx

签发人:CN=shuany, OU=xx, O=xx, L=xx, ST=xx, C=xx

序列号:4a6f2cd9

有效期: Wed Jul 29 00:52:41 CST 2009 至Thu Jul 29 00:52:41 CST 2010

证书指纹:

MD5:15:03:57:9B:14:BD:C5:50:21:15:47:1E:29:87:A4:E6

SHA1:C1:4F:8B:CD:5E:C2:94:77:B7:42:29:35:5C:BB:BB:2E:9E:F0:89:F5

签名算法名称:SHA1withRSA

版本: 3

*******************************************

*******************************************

——————————————————————————

6、证书条目的删除:

keytool -delete -alias shuany(指定需删除的别名) -keystore yushan.keystore -storepass 123456

 

7、证书条目口令的修改:

keytool -keypasswd -alias yushan(需要修改密码的别名) -keypass yushan(原始密码) -new 123456(别名的新密码)  -keystore e:\yushan.keystore -storepass 123456

8、keystore口令的修改:

keytool -storepasswd -keystore e:\yushan.keystore(需修改口令的keystore) -storepass 123456(原始密码) -new yushan(新密码)

 

9、修改keystore中别名为yushan的信息

 

keytool -selfcert -alias yushan -keypass yushan -keystore e:\yushan.keystore -storepass 123456 -dname “cn=yushan,ou=yushan,o=yushan,c=us”