calc.exe
转自看雪论坛:http://bbs.pediy.com/thread-68066.htm 作者:stalker
【文章标题】: 一次PEDIY---修改windows自带的calc.exe
【文章作者】: stalker
【作者邮箱】: zhangke_1989@hotmail.com
【软件名称】: calc.exe
【下载地址】: \windows\system32\calc.exe
【使用工具】: OD
【操作平台】: Windows XP Sp2
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
本人对PEDIY比较感兴趣,最近瞄上了calc.exe,于是diy之
我的想法是,在计算之后,按下=号键,首先显示我的ID,然后再显示计算结果
首先我们要找到消息处理函数,这样才能找到按下=号键之后执行的代码
怎么找呢?首先我想到的是下202消息断点,在OD中运行calc.exe
点"W"
可以看到如图所示的信息
可以看到WinProc处是空的,此时直接下消息断点的话会下在ClsProc上,OD将会报错
这个方法不行,就换个思路吧
我们可以看到,在ID一栏,=号的ID值为70H
我们知道程序在收到WM_commaND之后将会判断ID,这样应该存在一个分支结构
于是在OD中点右键--查找--所有分支,可以看到如下信息
70H就位于50H-13DH内
在此处双击,然后往下查找
01003348 > A1 E84E0101 mov eax, dword ptr [1014EE8] ; Case 70 of switch 01002F67
上面就是=号键被按下之后将会跳来的地方,我们就可以在这个地方跳走,然后执行我们的代码,再跳回去执行原来的代码
现在要做的就是随便找一个地方,写入我们想执行的代码
我找的地方位于010136C0
010136C0 > \60 pushad
010136C1 . 68 6C6C0000 push 6C6C ; 此处压入的是
010136C6 . 68 33322E64 push 642E3233 ; user32.dll的ASCII码
010136CB . 68 75736572 push 72657375 ; 也可以找个地方直接写字符串
010136D0 . 8BC4 mov eax, esp
010136D2 . 50 push eax ; /FileName
010136D3 . FF15 24100001 call dword ptr [<&KERNEL32.LoadLibrar>; \loadlibraryA
010136D9 . 68 646F7700 push 776F64 ;
010136DE . 68 6457696E push 6E695764 ;
010136E3 . 68 726F756E push 6E756F72 ;
010136E8 . 68 6F726567 push 6765726F
010136ED . 68 47657446 push 46746547 ; GetForeGroundWindow的ASCII码
010136F2 . 8BDC mov ebx, esp
010136F4 . 53 push ebx ; /ProcNameOrordinal
010136F5 . 50 push eax ; |hModule
010136F6 . FF15 28100001 call dword ptr [<&KERNEL32.GetProcAdd>; \GetProcAddress
010136FC . FFD0 call eax ; 调用GetForegroundWindow
010136FE . 50 push eax ; 保存handle,因为后面刷新的时候还要使用
010136FF . 68 93010000 push 193 ; /ControlID = 193 (403.)
01013704 . 50 push eax ; |hWnd
01013705 . FF15 70110001 call dword ptr [<&USER32.getdlgitem>] ; \GetDlgItem
0101370B . 6A 65 push 65
0101370D . 68 67006B00 push 6B0067
01013712 . 68 61006E00 push 6E0061
01013717 . 68 7A006800 push 68007A ; 我的名字的unicode码
0101371C . 8BDC mov ebx, esp
0101371E . 53 push ebx ; /Text
0101371F . 50 push eax ; |hWnd
01013720 . FF15 10110001 call dword ptr [<&USER32.SetWindowTex>; \SetWindowTextW
01013726 . 83C4 10 add esp, 10
01013729 . 58 pop eax ; 弹出主Window的handle
0101372A . 50 push eax ; /hWnd => 0068007A
0101372B . FF15 34110001 call dword ptr [<&USER32.UpdateWindow>; \UpdateWindow
01013731 . 68 E8030000 push 3E8 ; /Timeout = 1000. ms
01013736 . FF15 40100001 call dword ptr [<&KERNEL32.Sleep>] ; \Sleep
0101373C . 83C4 20 add esp, 20
0101373F . 61 popad
01013740 . A1 E84E0101 mov eax, dword ptr [1014EE8]
01013745 .^ E9 03FCFEFF jmp 0100334D
在上面的过程中我使用了GetForegroundWindow来获得主Window的句柄,因为程序当前正在被我们操作所以应当是处于Topmost的(当然也不排除有特殊情况,主要是我没有找到更好的办法来获得这个handle,那位兄弟有更好的
办法,希望能够告诉我)。
之所以在SetWindowText之后要刷新窗口是因为sleep的时候窗口不会刷新
尽管我们是在调用sleep之前就执行的SetWindowText,程序执行速度很快,还没有刷新Window就sleep了
所以我们要主动刷新一次Window(感谢天杀大哥对我的提示)
好了,整个过程差不多就是这样拉,现在运算之后按下=号键,就会先显示我的名字,然后再显示计算结果拉
在此附上我修改过的calc.exe
相关阅读
详解如何下载JDK和如何配置JDK的环境变量--Windows10
目录 一.前言: 二.jdk安装 三.教你零基础配置环境变量 1.去哪里设置? 2.怎么设置?(先不讲缘由,后面再讲) (1)新建JAVA_HOME (2)新建CLASSPAT
Windows远程时无法复制文件--杀进程rdpclip.exe,然后再
1.远程登陆到主机上2.任务管理器杀进程rdpclip.exe3.【开始】,搜索rdpclip.exe,点击运行此时重新复制文件,可以跨主机复制啦原以为是
重点方法二!! 小易有一些彩色的砖块。每种颜色由一个大写字母表示。各个颜色砖块看起来都完全一样。现在有一个给定的字符串s,s中每
Windows 7 with SP1简体中文专业版(微软MSDN原版)
Windows 7 with SP1简体中文专业版(微软MSDN原版)32位版本:ed2k://|file|cn_windows_7_professional_with_sp1_vl_build_x86_dvd_u_6
Windows自动弹出MSN中文网界面解决办法 原因:每当用户连接到网络时,Windows 会向微软的一个域名发送访问请求,访问结果作为网络连接