///
///
//
///
OD按钮单击事件下断点脚本V1
//
///
//
///
/
///
2016/01/11 by friendan
/
/
/
/
本脚本用到的全局变量声明
/
var iBpCount
var startAddr
// 搜索起始地址
mov iBpCount,0
// 断点总数计数器
mov startAddr,401000
// 如果搜索不到,改下这里即可
// 我以为从入口处开始搜索会快一些,发现这样会漏结果哈
//gpi MAINBASE
// 取EXE模块基址,结果放到$RESULT中
//mov startAddr,$RESULT
//mov eax,startAddr
//add eax,[startAddr+3C]
// 得到PE标志地址
//add eax,4
// 跳过PE标志
//add eax,14
// 跳过PE文件头IMAGE_FILE_HEADER,0x14=20
//add eax,10
// 跳动PE入口点偏移地址 0x10=16
//mov eax,[eax]
// 获取入口偏移
//add eax,startAddr
// 基址+入口偏移=入口地址
//mov startAddr,eax
/
///
输入信息提示框
///
ask "输入相应数字下断点:1(Delphi/BC++) 2(VB) 3(MFC) 4(VC++) 5(易语言) 6(万能断点)"
cmp $RESULT, 1
je DelphiBnClick_Start
cmp $RESULT, 2
je VBBnClick_Start
cmp $RESULT, 3
je MFCBnClick_Start
cmp $RESULT, 4
je VCBnClick_Start
cmp $RESULT, 5
je ELBnClick_Start
cmp $RESULT, 6
je WNBnClick_Start
msg "骚年,输错了吧,只能输入数字1到6哈。。。"
ret
///
输入信息提示框 end
///
/
Delphi/BC++程序按钮单击事件脚本
DelphiBnClick_Start:
find startAddr, #740E8BD38B83????????FF93#
// Delphi单击事件特征码
cmp $RESULT,0
// 判断是否找到特征码
je DelphiBnClick_End
// 没找到就结束查找
mov eax,$RESULT
// 特征码起始地址入eax
add eax,A
// 起始地址+A(11)
bp eax
// 在CALL处下断点
mov startAddr,eax
// 更新查找起始地址
add iBpCount,1
// 断点计数器加1
jmp DelphiBnClick_Start
// 跳回去循环查找
DelphiBnClick_End:
itoa iBpCount,10.
// 断点计数器转为10进制,转换结果放到$RESULT中
eval "恭喜,下Delphi/BC++按钮单击事件断点完毕,断点总数:{$RESULT}"
msg $RESULT
ret
// 退出脚本
//
/
Delphi/BC++程序按钮单击事件脚本 end
///
/
VB程序按钮单击事件脚本
VBBnClick_Start:
find startAddr, #816C24#
// VB单击事件特征码
cmp $RESULT,0
// 判断是否找到特征码
je VBBnClick_End
// 没找到就结束查找
mov eax,$RESULT
// 特征码起始地址入eax
add eax,8
// 起始地址+0x8
bp eax
// 在CALL处下断点
mov startAddr,eax
// 更新查找起始地址
add iBpCount,1
// 断点计数器加1
jmp VBBnClick_Start
// 跳回去循环查找
VBBnClick_End:
itoa iBpCount,10.
// 断点计数器转为10进制,转换结果放到$RESULT中
eval "恭喜,下VB按钮单击事件断点完毕,断点总数:{$RESULT}"
msg $RESULT
ret
// 退出脚本
//
/
VB程序按钮单击事件脚本 end
///
/
MFC程序按钮单击事件脚本
MFCBnClick_Start:
//findcmd startAddr,"SUB EAX,0xA"
// MFC单击事件汇编命令特征
find startAddr,#83E80A#
// MFC单击事件汇编命令特征
cmp $RESULT,0
// 判断是否找到特征码
je MFCBnClick_End
// 没找到就结束查找
mov eax,$RESULT
// 特征码起始地址入eax
add eax,3
// 特征码起始地址+0x3,即获取JE指令地址
mov startAddr,eax
// 更新查找起始地址
opcode eax
// 反汇编eax地址处指令
readstr $RESULT_1,2
// 取反汇编指令字符串中的前2个字符,结果放到$RESULT中
scmpi "JE",$RESULT,2
// 判断是否是JE指令
jne MFCBnClick_Start
// 不是的话,就重新找下一个特征码
gci eax,DESTINATION
// 获取JE跳到的地址,结果放到$RESULT中
mov eax,$RESULT
// JE跳到的地址放入eax中
add eax,3
// 地址加3指向下一条指令地址
opcode eax
// 反汇编下一条指令,结果放到$RESULT中
readstr $RESULT_1,4
// 取反汇编指令字符串前4个字符,结果放到$RESULT中
scmpi "CALL",$RESULT,4
// 判断是否是CALL指令
jne MFCBnClick_Start
// 不是的话,就重新找下一个特征码
bp eax
// 在CALL处下断点
add iBpCount,1
// 断点计数器加1
jmp MFCBnClick_Start
// 跳回去循环查找
MFCBnClick_End:
itoa iBpCount,10.
// 断点计数器转为10进制,转换结果放到$RESULT中
eval "恭喜,下MFC按钮单击事件断点完毕,断点总数:{$RESULT}"
msg $RESULT
ret
// 退出脚本
//
/
MFC程序按钮单击事件脚本 end
///
/
VC++程序按钮单击事件脚本
VC++下断点和MFC是一样的,区别是VC++在CALL处断下后,
///
需要按一次F7,两次F8,才能进入真正的单击事件代码中。
VCBnClick_Start:
jmp MFCBnClick_Start
//
/
VC++程序按钮单击事件脚本 end
///
/
易语言程序按钮单击事件脚本
ELBnClick_Start:
find startAddr, #FF55FC5F5E#
// 易语言单击事件特征码
cmp $RESULT,0
// 判断是否找到特征码
je ELBnClick_End
// 没找到就结束查找
mov eax,$RESULT
// 特征码起始地址入eax
bp eax
// 在CALL处下断点
add eax,5
mov startAddr,eax
// 更新查找起始地址
add iBpCount,1
// 断点计数器加1
jmp ELBnClick_Start
// 跳回去循环查找
ELBnClick_End:
itoa iBpCount,10.
// 断点计数器转为10进制,转换结果放到$RESULT中
eval "恭喜,下易语言按钮单击事件断点完毕,断点总数:{$RESULT}"
msg $RESULT
ret
// 退出脚本
//
/
易语言程序按钮单击事件脚本 end
///
/
万能断点按钮单击事件脚本
注意哈万能断点在模块User32.dll中
WNBnClick_Start:
pusha
loadlib "user32.dll"
popa
mov startAddr,$RESULT
find startAddr, #F3A58BC883E103F3A4E8#
// 万能断点特征码
cmp $RESULT,0
// 判断是否找到特征码
je WNBnClick_End
// 没找到就结束查找
mov eax,$RESULT
// 特征码起始地址入eax
bp eax
// 在CALL处下断点
add eax,5
mov startAddr,eax
// 更新查找起始地址
add iBpCount,1
// 断点计数器加1
jmp WNBnClick_Start
// 跳回去循环查找
WNBnClick_End:
itoa iBpCount,10.
// 断点计数器转为10进制,转换结果放到$RESULT中
eval "恭喜,下万能断点单击事件断点完毕,断点总数:{$RESULT}"
msg $RESULT
ret
// 退出脚本
//
/
万能断点按钮单击事件脚本 end
///