安卓反调试笔记

USB调试模式检测
int adb = Settings.Secure.getInt(context.getContentResolver(), Settings.Secure.ADB_ENABLED, 0);

Settings.Secure.ADB_ENABLED was deprecated in API level 17. Instead, use

Settings.Global.getInt(context.getContentResolver(), Settings.Global.ADB_ENABLED, 0)  

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

Com逆向

HRESULT DispCallFunc(
   void       *pvInstance,
   ULONG_PTR  oVft,
   CALLCONV   cc,
   VARTYPE    vtReturn,
   UINT       cActuals,
   VARTYPE    *prgvt,
   VARIANTARG **prgpvarg,
   VARIANT    *pvargResult
);

pvInstance 指向对象的实例指针( 在C++中就是this指针了 )
oVft 是函数在对象实例虚表中的偏移
如果函数不是在一个对象的虚表中, 那么 pvInstance 是 NULL
oVft 则指向函数地址

cc 是函数的调用约定方式.
FASTCALL=0
  CDECL=1
  STDCALL=4
vtReturn 是函数返回值的类型.
cActuals 是函数参数的个数.
prgvt 指向一个数组, 每一个值是函数相应参数的类型.
prgpvarg 是一个指针,指向一个 VARIANTARG* 数组,包含了传递给函数的每个参数(类型是 … Read More

常见函数识别

如下所示, 是NDK 中 STLPort库中的 basic_string的 M_allocate_block 函数

void __fastcall M_allocate_block(stlp_string *this, int len)
{
  stlp_string *v2; // r4
  STLP_alloc_proxy *pbuf; // r0
  int _len; // r3
  int len_; // [sp+4h] [bp-Ch]

  len_ = len;
  v2 = this;
  if ( len )
  {
    if ( (unsigned int)len 0x10 )
    {
      len_ 
Read More