通过逆向工程给HP手提电脑的触摸板自定义快捷键控制启用/禁用
过年前打算入手一台手提,挑选对比了不少型号,终于买了一台HP541手提,主要是看上它价格比较低廉,不过有着还算靠谱的性能,特别是IO性能非常令人满意。验货时已经觉得它外表非常普通,而且快捷键非常少,很明显连触摸板的控制键都没有,不过那时对这个也不太在意,反正基本上都是用鼠标操作,安装完触摸板驱动后还把它禁用了,免得打字的时候拇指不小心碰到它导致误操作。
清明节放假三天回了三水,因为家里有无线路由器,因此可以休闲地坐在大厅里一边看电视一边把手提放在大腿上上网,不过比较苦闷的每次从电脑桌上拿到大厅里的时候都要先打开触摸板控制界面,然后将触摸板启用,之后才能将鼠标拔掉,否则的话就出现鼠标拔掉了但触摸板也用不了的尴尬场面。
虽然HP541的模具有局限,不过山人自有妙计,我想到可以用Windows的组合键来控制触摸板的开关。大部分的触摸板都是使用synaptics的驱动的,于是到http://www.synaptics.com找了 synaptics的sdk和samples。打开samples看了一下,只有com形式的调用,并非驱动级的调用。当时也没太在意就兴冲冲地建了一个mfc工程打算丰富一下它的功能,至少可以随windows启动、最小化时显示任务栏图标和通过组合键来控制它的开关吧。
花了半天的时间把工具写好并测试过没什么问题了,但却发现了一个致命的弱点,那就是务必要让SynTPEnh.exe(安装好synaptics驱动后随windows启动的进程)先运行,否则采用synaptics sdk里那几个samples的做法是无法初始化和加载synaptics的com指针的,用Ollydbg调试了一下SynTPEnh.exe,发现原来SynTPEnh.exe会在运行时通过LoadLibrary加载%Winroot%/System32目录里的Syntcom.dll的,看来这个才是正主。我的原意是用我写的这个工具来替代SynTPEnh.exe的,但现在如果要两个进程同时存在,这样多恶心啊。
现在星期一至星期五的晚上一般是逛街和散步,就算用电脑也只是玩一下游戏,因此一直到这个周六才继续搞。增加全局快捷键一般是用键盘钩子的,钩子是一定要通过dll来加载的。但怎样安装这个钩子呢?想了很多种方法,想过使用创建远程线程的方式将钩子注入到SynTPEnh.exe中,也想到过用注册表来注入,但都否定了,因为这些方法都新开一个进程或线程来安装钩子,最终想到修改SynTPEnh.exe,将安装钩子的代码插入到SynTPEnh.exe的某个地方里。
步骤如下:
1 建立一个名为HOOK的vc dll工程,dll导出一个函数InitializeHook,在此函数里先初始化synaptics的com指针,然后使用SetWindowsHookEx安装低级键盘钩子;在dll的退出函数里卸载钩子。
2 在钩子回调函数里检测是否设定的组合键(这里是Win键和加号键的组合),如果是的话就将触摸板禁用/启动。
3 由于要在SynTPEnh.exe的某处插入InitializeHook这个函数,因此要增加SynTPEnh.exe的空间,切记新开辟的空间要以DWORD对齐。还需要修改SynTPEnh.exe的导入表,将HOOK的InitializeHook导入到SynTPEnh.exe里,当然你也可以显式地通过LoadLibrary在SynTPEnh.exe里加载这个dll,不过那要写多几行代码了。这里建议使用Topo和Stud_PE这两个工具,不但可以极大地增加你对PE格式的了解,而且用起来非常方便。
4 使用反汇编工具,例如OllyDbg,将call dword ptr [5020F9]这个指令写到SynTPEnh.exe文件里的某个地方。一开始我打算修改SynTPEnh.exe的入口点,先执行call dword ptr [5020F9]这个指令,然后再跳回原来的入口,但发现这样行不通,因为此时SynCom.dll还没加载呢。经过一轮的调试逆向摸索,发现SynTPEnh.exe除了主线程外,还新开了3个线程和1个定时器,分别用作加载任务栏图标、加载驱动和响应用户的触摸使任务栏图标活动起来。我分别以CreateThread和Shell_NotifyIcon等Win32 API作断点观察了很久,将call dword ptr [5020F9]这个指令放到线程创建完毕或者图标创建完毕之后调用,但还是失败,总是无法初始化synaptics的com指针。最后出动到IDA Pro,将Call指令放到WinMain函数的消息泵前面,结果还是饮恨,代码如下:
sub_4310E0((int)&v18);
//Call指令放在这里
PostMessageW((HWND)*(&dword_4781C0 + 56), 0x47Fu, 0, 0);
while ( GetMessageW(&Msg, 0, 0, 0) )
{
if ( !*(&dword_4781C0 + 58) || !IsDialogMessageW((HWND)*(&dword_4781C0 + 58), &Msg) )
{
TranslateMessage(&Msg);
DispatchMessageW(&Msg);
}
}
5 此路不通,而且我调试了半天也没发现到底是调用了SynCom.dll里那个函数来初始化驱动的。我想到一个比较折衷的方法,在钩子的回调函数里发现用户是按下了预设的组合键时(默认是Win键和加号键),先检测一下SynAPI的com指针实例化是否成功,如果还没实例化则先实例化。看代码:
void InitializeSynDevice()
{
if(bFoundDevice == FALSE)
{
CoInitialize(NULL);//这里是关键,应该将这行移到DLL的入口。
if( CoCreateInstance(_uuidof(SynAPI), 0,
CLSCTX_INPROC_SERVER, _uuidof(ISynAPI), (void **) &pAPI))
{
//com初始化失败
AfxMessageBox(_T("Fail to Initialize Com"));
return;
}
//初始化synapi
if ( pAPI->Initialize() == SYNE_FAIL)
{
AfxMessageBox(_T("Fail To Initialize SynApi"));
bFoundDevice = FALSE;
return;
}
long lHandle = -1;
//查找设备
if (pAPI->FindDevice(SE_ConnectionAny, SE_DeviceTouchPad, &lHandle) || pAPI->CreateDevice(lHandle, &pDevice))
{
AfxMessageBox(_T("Find Device is failing"));
bFoundDevice = FALSE;
return;
}
bFoundDevice = TRUE;
}
}结果令我大跌眼镜,竟然还是不行。每一次按Win键和加号组合键,总是提示:Fail to Initialize Com。看看时间,是时候跟老婆去产检了,回来后在楼下跟街坊打了一会麻将,虽然胡了几把,但感觉还是很不爽也很不甘心。于是跑回楼上继续捣鼓,突然灵光一闪:当SynAPI还没实例化的时候,每一次按下组合键都会调用一次:CoInitialize(NULL),是否由于多次调用CoInitialize(NULL)而导致Com失败呢?于是将CoInitialize(NULL)移到DLL的入口,果然成功了!下面附上使用Ollydbg修改SynTPEnh.exe的截图。
通过逆向工程给HP手提电脑的触摸板自定义快捷键控制启用/禁用相关推荐
- 终于禁止了HP本本的触摸板
此困扰有年头了.我的HP本本 ProBook4326s 13寸屏.不大不小很好用. 唯一缺陷,键盘小了后.来爱碰触摸板.之前也就忍了.敲代码时突然跑了,鼠标重定位就可以.估计这样的操作也有上万次了. ...
- 如何禁用笔记本电脑触摸板_您如何永久禁用笔记本电脑上的触摸板?
如何禁用笔记本电脑触摸板 A touchpad can be extremely useful for most people, but there are times when it is litt ...
- linux触摸板开关快捷键,Ubuntu增加快捷键打开或关闭触摸板
在笔记本上装了Linux-mint7,它是基于Ubuntu 9.04的一个发行版.装上后有个小问题一直没解决,就是不能用键盘上的功能键关闭触摸板,只能在鼠标设置的图形界面去设置,如果每次想切换时都要这 ...
- 【GestureSign】触摸板自定义/自用手势推荐/助记
触摸板手势,基本常用推荐.按基本的逻辑设置,就根本不需要去特意记忆,在使用的时候就会自然想起. 双指左向或右向:负责基本操作 ↑ ↑ 代表标签,左就是上一个标签,右就是下一个标签(浏览器.pdf) ↓ ...
- linux触摸板开关快捷键,linux 增多快捷键打开或关闭触摸板
当前位置:我的异常网» Linux/Unix » linux 增多快捷键打开或关闭触摸板 linux 增多快捷键打开或关闭触摸板 www.myexceptions.net 网友分享于:2013-06 ...
- 联想y7000笔记本触摸板开启快捷键_联想拯救者y7000电脑,录屏的快捷键是什么?...
Y7000上也有屏幕录制的实体按键,但是与之前R720等电脑功能不同的是,由于不再预装LenovoNerveCenter软件,因此Y7000的默认录屏功能是通过调用Win10自带的DVR功能实现的,联 ...
- opensuse 禁用触摸板
打字时经常被触摸板干扰 禁用触摸板synclient TouchpadOff=1 启用触摸板synclient TouchpadOff=0 如果触摸板无效 反正我就无效 vi /etc/X11/xo ...
- win7触摸板怎么关闭_笔记本电脑触摸板如何开关 笔记本电脑触摸板设置方法【详解】...
如今使用笔记本的用户开始越来越多,当然也有不少人喜欢把笔记本当作电视来使用,笔记本可以随意挪动,不管是打游戏还是看电视都非常方便.一般笔记本上都会有个触摸板,方便我们平时使用,但是也仍然有很多朋友不喜 ...
- 神舟笔记本触摸板驱动_关闭笔记本触摸板的四种方法
从某种意义上说,触摸板的使用,能够帮助我们解放一部分的工作.但是很多时候,我们都会用不到触摸板,因为我们还是会使用鼠标更多.这时,触摸板的存在就会显得有点碍事,因为我们会出现误触的情况.这时,我们就要 ...
最新文章
- android京东秒杀倒计时,js实现京东秒杀倒计时功能
- 如何配置一台计算机预计3500元,玩游戏用的电脑主机应该怎么配置?3500元组装游戏电脑主机配置推荐...
- get_magic_quotes_gpc异常
- python的类型 变量 数值和字符串
- python3.6 django部署_Centos7 django+uwsgi+nginx+python3.6.8部署
- Spring batch 2.0例子(lineMapper)
- Redis持久化-数据丢失及解决
- RTP/RTCP/RTSP/SIP/SDP简介
- web前端基础(08html5新标签)
- canvas 擦除动画_帧动画的多种实现方式与性能对比
- xshell密码保存位置_文件管理密码相册app下载-文件管理密码相册 v1.8 手机版
- awk学习笔记(8) - 简单的正则匹配
- 【Java小工匠聊密码学】--对称加密--DES
- 使用VSTO开发Excel WorkBook文档级项目中出现的Bug及处理办法
- 2021年3月CISSP考试顺利通过,超详细的经验介绍
- 123321是一个非常特殊的数,它从左边读和从右边读是一样的。输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。
- 2022-10-11 myql-exists子查询外表关联记录
- html前端开发学年论文,web前端毕业设计论文.doc
- iOS开发-类似微信录音上滑取消功能
- C++ snippets
热门文章
- HTML中的css选择器
- SpringMVC汇总
- medoo连接mysql_medoo修改版适合mysql使用
- python爬虫简单爬取天天基金的基金信息和每日净值
- python 路由转发_python 洋葱路由列表创建
- php%3ca%3e传值,开服openAPI文档
- AI行业精选日报_人工智能0916
- 小程序引入iconfont多色图标
- NLP自然语言处理实战(三):词频背后的语义--5.距离和相似度反馈及改进
- ui设计需要做android和苹果版本,UI知识,安卓和苹果的界面设计之尺寸规范