Android锁屏解锁总结

1. 使用adb命令完成解锁

——stub

 

2. 通过KeyguardManager子类KeyguardLock的Disable方法来取消锁屏:

我们可以使用java.lang.Object.android.app.KeyguardManger中的子类KeyguardLock可以控制Disable掉这些屏幕锁界面,从而达到不用输入密码,直接过掉屏幕锁界面来使用手机

原文: http://www.wooyun.org/bugs/wooyun-2010-09978

 

3. adb删除密码文件:

首先执行cd data/system进入系统文件目录,执行ls列举文件目录,这里有三个与用户相关的文件accounts.db(gmail账号管理),gesture.key(手势识别文件),password.key(密码文件)

若锁屏手势忘记,删除gesture.key, 手势锁屏消失.

若gmail用户密码忘记.删除accounts.db 以及 password.key 文件, 则gmail消失.重启手机需要重新输入gmail以及密码.

 

4. adb手机密码的加密保存原理以及破解密码方法:

九宫格锁屏图案,自左上, 由上而下,由左而右.分别分配数字00, 01, 02, … ,08 共计九个触点.

解锁手势密码明文便是所有划过的触点编号依次连接. 例如

000102050403060708

便是一个2字形的解锁图案. (自己用手画一下自然明白)

 

而解锁密文是解锁明文的sha1加密的密码. 保存在/data/system/gesture.key文件中.

 

使用adb push将该文件dump出来, objdump -C gesture.key即可看到sha1密文形式.

 

依该问题, 明文形式为奇数位定为0, 而偶数位为0-8, 且触点个数为4-6个. 所以形成的明文数据集在10万个左右, 此规模甚小. python写一个小循环, 生成密码库. 查询sha1即可得到手势密码. 时间以秒计.

 

http://www.kanxue.com/bbs/showthread.php?t=166933

python类型转换、数值操作

代码

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/–> 1 函数 描述
int(x [,base ]) 将x转换为一个整数
long(x [,base ]) 将x转换为一个长整数
float(x ) 将x转换到一个浮点数
complex(real [,imag ]) 创建一个复数
str(x ) 将对象 x 转换为字符串
repr(x ) 将对象 x 转换为表达式字符串
eval(str ) 用来计算在字符串中的有效Python表达式,并返回一个对象
tuple(s ) 将序列 s 转换为一个元组
list(s ) 将序列 s 转换为一个列表
chr(x ) 将一个整数转换为一个字符
unichr(x ) 将一个整数转换为Unicode字符
ord(x ) 将一个字符转换为它的整数值
hex(x ) 将一个整数转换为一个十六进制字符串
oct(x ) 将一个整数转换为一个八进制字符串

 

 

代码

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/–> 1 操作 描述
s + r 序列连接
s * n , n * s s的 n 次拷贝,n为整数
s % d 字符串格式化(仅字符串)
s[i] 索引
s[i :j ] 切片
x in s , x not in s 从属关系
for x in s : 迭代
len(s) 长度
min(s) 最小元素
max(s) 最大元素
s[i ] = x 为s[i]重新赋值
s[i :j ] = r 将列表片段重新赋值
del s[i ] 删除列表中一个元素
del s[i :j ] 删除列表中一个片段

 

 

代码

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/–> 1 x << y 左移
x >> y 右移
x & y 按位与
x | y 按位或
x ^ y 按位异或 (exclusive or)
~x 按位翻转
x + y 加
x – y 减
x * y 乘
x / y 常规除
x // y 地板除
x ** y 乘方 (xy )
x % y 取模 (x mod y )
-x 改变操作数的符号位
+x 什么也不做
~x ~x=-(x+1)
abs(x ) 绝对值
divmod(x ,y ) 返回 (int(x / y ), x % y )
pow(x ,y [,modulo ]) 返回 (x ** y ) x % modulo
round(x ,[n]) 四舍五入,n为小数点位数
x < y 小于
x > y 大于
x == y 等于
x != y 不等于(与<>相同)
x >= y 大于等于
x <= y 小于等于

 

原始链接: http://www.cnblogs.com/jenry/archive/2010/05/27/1744861.html

用 dalvikvm 执行一个运行于命令行的 Hello World

Windows 操作系统也有五花八门的应用 ,可是想当年学习编程语言的第一个程序,却是在 Turbo C  蓝漆漆的界面里笨拙地敲一个 Hello World 程序 ,然后又在黑漆漆的命令行里打印出的一行输出结果 ,“Hello World”。

Android 上也能实现类似的效果 ,可以使用 dalvikvm 执行一个运行于命令行的 Hello World 。

简要的过程如下:
写代码 Hello.java
编译成 Android Dalvik Virtual Machine 的可执行文件 Hello.dex
使用 ADB 运行测试
内容主要参考 Android 4.4 源码里 dalvik / docs / hello-world.html 文件 。

1. 本文的测试环境
Ubuntu 12.04 64-bit
JDK 1.6
安装 Android SDK,并安装 Android SDK build_tools , 最新版是 19.0.1
具有 Root 权限的 ADB shell

2. 创建 java 源文件 ,内容如下

代码:
public class Hello
{
  public static void main(String[] argc)
  {
    System.out.println("Hello, Android!\n");
  }
}

3.编译
(1)编译成 java class 文件
执行命令 : javac Hello.java
编译完成后 ,目录下生成 Hello.class 文件 。可以使用命令 java Hello 来测试下 ,会输出代码中的 “ Hello, Android!” 的字符串 。
(2) 编译成 dex 文件
编译工具在 Android SDK 的路径如下 ,其中 19.0.1 是Android SDK build_tools  的版本 ,请按照在本地安装的  build_tools 版本来 。建议该路径加载到 PATH 路径下 ,否则引用 dx 工具时需要使用绝对路径 。
./build-tools/19.0.1/dx
执行命令 : dx –dex –output=Hello.dex Hello.class
编译正常会生成 Hello.dex 文件 。

4. 使用 ADB 运行测试
测试命令和输出结果如下 :
$ adb root
$ adb push Hello.dex  /sdcard/
$ adb shell
root@maguro:/ # dalvikvm -cp /sdcard/Hello.dex Hello
Hello, Android!

说明 :
(1)测试环境使用真机和 Android 虚拟机都可以的 。核心的命令是
dalvikvm -cp /sdcard/Hello.dex Hello
-cp 是 class path 的缩写 ,后面的 Hello 是要运行的 Class 的名称 。网上有描述说输入 dalvikvm  –help 可以看到  dalvikvm 的帮助文档 ,但是在 Android4.4 的官方模拟器和自己的手机上测试都提示找不到 Class 路径 ,在Android 老的版本 ( 4.3 ) 上测试还是有输出的 。
(2)因为命令在执行时 , dalvikvm 会在 /data/dalvik-cache/  目录下创建 .dex 文件 ,因此要求 ADB 的执行 Shell 对目录 /data/dalvik-cache/  有读、写和执行的权限 ,否则无法达到预期效果 。

原链接: http://bbs.pediy.com/showthread.php?t=184592

JAVA不定参数探秘

JAVA中可以使用不定参数,

例如 public void test(String …args){…} 这里test方法可以传入参数的情况是:

1.不使用参数,如test()

2.使用一个或多个参数,如test(“1”); test(“1″,”2”);

3.使用数组 test(new String[]{“1″,”2”});

在test方法内部,我们可以像使用数组的访问方式一样来访问参数args.如:args[i] 这样就有一个好处,在参数输入不定的情况下,使用这个方法非常简单。非常易于使用。

有几点需要注意的就是  

  我们见到的是不定参数,其实编译器编译之后它会将这个test(String …args){…} 编译成为数组调用的方式test(String[] args){} ,这个过程是编译中就完成了的,我们程序编写过程中看不到这个实际的转换过程。  而我们调用这个test方法时,编译器同样会把参数转换成new String[]{“”}的形式调用,所以,本质上来讲,就是一个以数组为参数的调用方法,我们看不到而已,具体详细情况可以反编译class类就可以明了。

如果同时同一个类中还有一个test方法,例如test(),或者test(String args) ,我们采用 test(“1”)的方式调用,我们就可以知道了,因为有这个方法存在,所以编译器就会优先使用这个 test(String args)    方法,而不会使用不定参数的方法,这个原因很明确,因为不定参数本质上是一个数组为参数的方式。所以,如果你定义了一个不定参数的test方法,如果你再定义一个test(String[] args)的以数组为参数的方法,编译器就会提示你方法定义重复。道理就在这里。

  希望以上的解释能够帮助到大家。

原链接: http://www.cnblogs.com/lovingprince/archive/2008/05/20/2166386.html

MySQL中授权(grant)和撤销授权(revoke)

授权命令:

grant select,delete on database.table to user@’ip/localhost’ identified by ‘password’

取消授权:

revoke select,delete on database.table to user@’ip/localhost’ identified by ‘password’

注意,revoke只能取消用户的某权利(select,delete,update等),而即使取消掉所有权利,该用户还仍然存在.该用户仍然可以登陆该mysql.

若想要删掉该用户行,或者不让该用户从某一地址登陆,则只能使用delete命令删除掉mysql.user表中对应的行.

命令:

delete from mysql.user where user=’username’ and host = ‘hostip/localhost’;

你懂的.

 

权限变更或者用户变更之后需要立即刷新授权列表,才能生效.

命令:

flush privileges;

 

参阅文章:

http://blog.csdn.net/andy_yf/article/details/7487519

http://leeon.me/a/mysql-delete-authorization

Android DEX加壳技术草案

Android DEX加壳技术方案

一、什么是加壳?

加壳是在二进制的程序中植入一段代码,在运行的时候优先取得程序的控制权,做一些额外的工作。大多数病毒就是基于此原理。PC EXE文件加壳的过程如下:

 

 

二、加壳作用

加壳的程序可以有效阻止对程序的反汇编分析,以达到它不可告人的目的。这种技术也常用来保护软件版权,防止被软件破解。

 

三、Android Dex文件加壳原理

PC平台现在已存在大量的标准的加壳和解壳工具,但是Android作为新兴平台还未出现Dex加壳工具。Android Dex文件大量使用引用给加壳带来了一定的难度,但是从理论上讲,Android Dex加壳也是可行的。

在这个过程中,牵扯到三个角色:

1、加壳程序:加密源程序为解壳数据、组装解壳程序和解壳数据DEX文件

2、解壳程序:解密解壳数据,并运行时通过DexClassLoader动态加载

3、源程序:需要加壳处理的被保护代码

阅读该文章,需要您对DEX文件结构有所了解,您可以通过以下网址了解相关信息:

http://blog.csdn.net/jiazhijun/article/details/8664778

 

根据解壳程序和解壳数据在DEX文件中的不同分布,本文将提出两种Android Dex加壳的实现方案。

 

(一)解壳数据位于解壳程序文件尾部

 

该种方式简单实用,合并后的DEX文件结构如下。

 

 

加壳程序工作流程:

1、加密源程序DEX文件为解壳数据

2、把解壳数据写入解壳程序Dex文件末尾,并在文件尾部添加解壳数据的大小。

3、修改解壳程序DEX头中checksum、signature 和file_size头信息。

4、修改源程序AndroidMainfest.xml文件,修改程序入口Activity为解壳程序入口Activity。

 

解壳DEX程序工作流程:

1、读取DEX文件末尾数据获取借壳数据长度。

2、从DEX文件读取解壳数据,解密解壳数据。以文件形式保存解密数据到a.dex

3、通过DexClassLoader动态加载a.dex,并启动源程序入口Activity。

 

(二)解壳数据位于解壳程序文件头

 

该种方式相对比较复杂, 合并后DEX文件结构如下:

 

 

 

加壳程序工作流程:

1、加密源程序DEX文件为解壳数据

2、计算解壳数据长度,并添加该长度到解壳DEX文件头末尾,并继续解壳数据到文件头末尾。

(插入数据的位置为0x70处)

3、修改解壳程序DEX头中checksum、signature、file_size、header_size、string_ids_off、type_ids_off、proto_ids_off、field_ids_off、

method_ids_off、class_defs_off和data_off相关项。  分析map_off 数据,修改相关的数据偏移量。

4、修改源程序AndroidMainfest.xml文件,修改程序入口Activity为解壳程序入口Activity。

 

解壳DEX程序工作流程:

1、从0x70处读取解壳数据长度。

2、从DEX文件读取解壳数据,解密解壳数据。以文件形式保存解密数据到a.dex

3、通过DexClassLoader动态加载a.dex,并启动源程序入口Activity。

 

接下来的工作就是验证上面两种方案是否可行!

原文链接: http://www.myexception.cn/android/1246428.html

 

关于dex格式有些话要说

dex头:

[1] offset:0 – 7:

magic信息:

0x 00 35 33 30 0a 78 65 64

[2] offset: 8 – B

checksum:

计算方法: adler32算法计算dex除前12byte之外的其他dex内容(即除了magic以及checksum之外的dex内容的adler32算法).

———————————————————————–计算代码:

byte[] dexbytes = readFileAsBytes(dexpath);

Adler32 crcGenerator = new Adler32();
byte[] dex2 = new byte[dexbytes.length – 12];
for (int i = 0; i < dex2.length; i++) {
dex2[i] = dexbytes[i + 12];
}
crcGenerator.update(dex2);
long crc = crcGenerator.getValue();
String crcStr = Long.toString(crc, 16);

System.out.println(“crc:\t” + crcStr);

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

[3] offset: C – 1f

sha1 是自0x20开始至结尾的dex部分的sha1值. (dex除去magic,checksum,sha1自身部分的其他部分)

java代码:

----------------------------------------------------

byte[] dexbytes = readFileAsBytes(dexpath);

byte[] dex2 = new byte[dexbytes.length – 0x20];
for (int i = 0; i < dex2.length; i++) {
dex2[i] = dexbytes[i + 0x20];
}

MessageDigest sha1gen = MessageDigest.getInstance(“sha1”);
sha1gen.update(dex2);
byte[] sha1value = sha1gen.digest();
String sha1hex = “”;
for (byte b : sha1value) {
sha1hex += HEX_V[b>>4 & 0xf];
sha1hex += HEX_V[b & 0xf];
}
System.out.println(“sha1 signauture : \t” + sha1hex);

----------------------------------------------------

 

 

使用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命令进行代码调试了。

jad批量反编译的用法

jad -o -r -sjava -dc:/src com/**/*.class

其中src是反编译后的文件夹路径,com/**/*.class是目标反编译路径。使用该方法后,会把整个
com文件夹下的*.class反编译到c:/src文件夹下。