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

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