一次PEDIY---修改Windows自带的calc.exe
本人对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 ;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 ;来获得主Window的handle
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
01013745 .^ E9 03FCFEFF jmp 0100334D
之所以在SetWindowText之后要刷新窗口是因为sleep的时候窗口不会刷新
尽管我们是在调用sleep之前就执行的SetWindowText,程序执行速度很快,还没有刷新Window就sleep了
所以我们要主动刷新一次Window(感谢天杀大哥对我的提示)
好了,整个过程差不多就是这样拉,现在运算之后按下=号键,就会先显示我的名字,然后再显示计算结果拉
在此附上我修改过的calc.exe
[ 本帖最后由 zhangke 于 2008-7-9 10:05 编辑 ] 先支持 再慢慢看 学习一下~哈哈,谢谢楼主 谢谢捧场啊:loveliness: 功力没达到,看不懂/:L 附件好象无法下载! 原帖由 rabbithua 于 2008-7-7 20:55 发表 https://www.chinapyg.com/images/common/back.gif
附件好象无法下载!
不会吧,应该可以下载呀 刚试了下附件可以下载! 楼主好厉害啊,下载来欣赏了 不错,看看看 !!!
页:
[1]