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

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

让Win10 Shift+右键显示<在此处打开命令窗口>

计算机\HKEY_CLASSES_ROOT\Directory\Background\Shell

计算机\HKEY_CLASSES_ROOT\Directory\shell

这二个项目下面

分别有cmd和Powershell二个文件夹项
首先获取权限, 在这二个目录上面点右键 权限

如下图, 输出 Administrators 用户组,
确定后, 再像图1 一样, 让Administrators 有全部权限
然后将cmd 项下的 HideBasedOnVelocityId 重命名为 ShowBasedOnVelocityId
即可显示 打开命令行提示符
PowerShell 下面的也是
HideBasedOnVelocityId  隐藏
ShowBasedOnVelocityId 显示
Read More

x64dbg 常用表达式

读取内存:

  • [addr] read a DWORD/QWORD from addr.
  • n:[addr] read n bytes from addr.   在32位程序中 n<4, 64位程序中 n<8
  • seg:[addr] read a DWORD/QWORD from a segment at addr.
  • byte:[addr] read a BYTE from addr.
  • word:[addr] read a WORD from addr.
  • dword:[addr] read a DWORD from addr.
Read More

VS2015 使用 yasm

最近做一个64位下的Hook, VS在64位下没有了内联汇编
于是来体验一下 yasm 编译 asm 文件, 首先从 yasm 官网下载 vs专用包, 普通版的不能在vs中直接调用

下载地址如下:
Win32 VS2010 (for use with VS2010+ on 32-bit Windows)
Win64 VS2010 (for use with VS2010+ on 64-bit Windows)

虽然写的是 2010没有更新过, 实际上可以在VS2015中直接使用.
下载相应的包. 将   vsyasm.props   vsyasm.targets  vsyasm.xml
三个文件放在
C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\BuildCustomizations

将 vsyasm.exe 放在
C:\Program Files … Read More