Android 程序中卸载其它App的几种方法

1. 直接使用Intent卸载

//android自带了一个安装程序---/system/app/PackageInstaller.apk.
//大多数情况下,我们手机上安装应用都是通过这个apk来安装
Uri uri = Uri.fromParts("package", "com.example.demo", null);
Intent intent = new Intent(Intent.ACTION_DELETE, uri);
startActivity(intent);

2. 通过pm命令方式实现静默卸载

//pm命令可以通过adb在shell中执行,同样,我们可以通过代码来执行
public static String execCommand(String... command) {
    Process process = null;
    InputStream errIs = null;
    InputStream inIs = null;
    String result = "";
    try {
        process = new ProcessBuilder().command(command).start();
        ByteArrayOutputStream baos 
Read More

IDA 调试条件断点的使用示例

经常在用IDA调试时, 一些断点如文件打开, 或是发送数据会频繁的断下来, 每次断下去查看是不是我们关注的数据, 以此判断来源, 这太费时间, 也常导致程序超时, 正常流程没法继续, 强大的IDA为我们提供了 脚本条件, 可以选择IDC或是Python.

如图:

在断点处右键编辑断点,

点击右边的按钮在输入框中输入脚本即可, 返回False表示不中断
返回 True 断点将激活中断下来. 以此我们还可以在条件中增加msg, 从而实现不中断而显示信息的功能. 下面给出一个示例脚本:

def dumpbytes(pdata, blen):
    msg("%03d: " % blen)
	for i in range(blen):
		msg("%02X " % get_byte(pdata+i))
	msg("\n")	
	
phead = get_dword(cpu.r1+4)
pdata = get_dword(phead)
binlen = get_word(phead+4)
dumpbytes(pdata, binlen)
if (binlen 
Read More

Arm 标志位与条件判断

EQ(等于,Equal) == Z set
NE(不等于,Not Equal) != Z clear
CS(高于或同于,进位设置,Carry Set) = C set
CC(低于,进位清除,Carry Clear) < C clear

MI(负号,MInus) < 0 N set
PL(正号,PLus) =0 N clear
VS(溢出设置,oVerflow Set) V set
VC(溢出清除,oVerflow Clear) V clear

HI(高于,HIgher) C set and Z clear (unsigned higher,无符号大于)
LS(低于或同于,Lower or Same) <= C clear … Read More

串口通讯中的55AA

许多串口通讯中测试或握手信号使用AA或55这两个特殊的十六进制数,在许多PIC内部的EEPROM改写也使用这两个数作为敲门砖,初学者可能不解何为,其实如果将这两个数展开成二进制就可明白为什么:
AA展开为10101010, 55展开为01010101,
变成串行电平的话就是一个占空比为50%的方波,这种方波在电路中最容易被分辨是否受干扰或者畸变,在实际波形的观察中也最容易看出毛病所在,以异步串口通讯为例,通讯的每一个字节开始为一个数据位的低电平作为起始位,字节发送结束后是一个或两个数据位的高电平作为停止位,在测试程序阶段,我们可尝试发送0xAA,利用示波器来验证发送是否正确,以9600BPS的波特率计算,每个BIT的所用的时间大约是104.17μS,这里我们选择停止位占一个数据位,然后照此写一个反复连续发送AA的发送程序,那么在正确发送时在IO口看到的波形应该是一个大约4.8KHZ的方波,周期大约为208.34μS,占空比为50%。这样我们可以很快断定发送是否正确。由于这两个数值的特殊性,还被用到其他一些地方,比如PC机引导过程中,bios程序在加载完MBR后,还要对MBR的最后两个字节进行验证,必须为0x55和0xAA。

对于存储的应用:
除了55AA/AA55展开是二进制0、1间隔排列,电路好检测之外,在存储方面,用这两个数组合还有另外的道理:
Flash的存储位,只能从1变成0,所以擦除完后,单元里是1的,此时可以直接写,当写成0后,再要写成1是不行的,一定要擦除,擦除后就变成1了.
每个字节先写成55,再写成AA,这样每个bit都写了一遍又擦了一遍,说明这个字节的位置是好用的

那么AA55/55AA这样的二进制排列来作为数据Pattern,是可以测试每一个位是否可以从1变成0,也能测试是否可以从0变成1的, 如果都可以,就说明存储位没有死 … Read More

DOS 程序知识点

1. bioskey(0): 返回用户按键。

如果返回值的低 8 位非 0,该值表示按键的 ASCII 码;

如果返回值的低 8 位为 0,该值表示按键的键码。

作为替代,VC 中可以使用 getch() 返回用户按键。对于功能键(如光标键),getch() 需要调用两次,第一次返回 0 或 0xE0,第二次返回键码。

2. bioskey(1): 返回是否有按键发生。

如果没有按键,返回 0;

如果有按键,返回该按键值。(该按键仍然保留)

作为替代,VC 中可以使用 kbhit() 返回是否有按键发生。

3. bioskey(2): 返回当前控制键的状态

返回值共 16 位,分别表示:

0 右 Shift 按下
1 左 Shift 按下
2 Ctrl 按下
3 … Read More