zhangke 发表于 2008-7-7 17:16:08

一次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 编辑 ]

sufeiyu 发表于 2008-7-7 17:19:49

先支持 再慢慢看

言申言舌 发表于 2008-7-7 17:23:00

学习一下~哈哈,谢谢楼主

zhangke 发表于 2008-7-7 17:38:22

谢谢捧场啊:loveliness:

金华 发表于 2008-7-7 18:05:42

功力没达到,看不懂/:L

rabbithua 发表于 2008-7-7 20:55:52

附件好象无法下载!

zhangke 发表于 2008-7-8 11:09:02

原帖由 rabbithua 于 2008-7-7 20:55 发表 https://www.chinapyg.com/images/common/back.gif
附件好象无法下载!
不会吧,应该可以下载呀

hggg 发表于 2008-7-8 12:57:54

刚试了下附件可以下载!

yuehuaqishi 发表于 2008-7-9 14:26:04

楼主好厉害啊,下载来欣赏了

pygcnm 发表于 2010-12-3 14:56:00

不错,看看看 !!!
页: [1]
查看完整版本: 一次PEDIY---修改Windows自带的calc.exe