///

///

//


///

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


///