首页
社区
课程
招聘
[原创]一次PEDIY---修改Windows自带的calc.exe
发表于: 2008-7-8 11:06 20991

[原创]一次PEDIY---修改Windows自带的calc.exe

2008-7-8 11:06
20991

【文章标题】: 一次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
  
mycalc.rar
  
--------------------------------------------------------------------------------
【经验总结】
  sleep函数将会导致窗口刷新停止
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2008年07月08日 11:07:52


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (43)
雪    币: 563
活跃值: (95)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
哈哈有创意学习!!!
2008-7-8 11:55
0
雪    币: 190
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
est
3
学习~~~~~
2008-7-8 16:44
0
雪    币: 102
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
我顶. ..
2008-7-8 21:10
0
雪    币: 415
活跃值: (34)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
5
恩,短小精悍。
2008-7-9 00:43
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
不懂,学习中
2008-7-9 09:11
0
雪    币: 213
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
学习~~~~
2008-7-9 09:36
0
雪    币: 208
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
一直想做一个靠按键调整16进制和10进制的,太懒了。
顶一下楼主
2008-7-9 11:00
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
好东西
谢谢了   学习;了
2008-7-9 12:01
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
学习,支持一下
2008-7-9 15:57
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
學習,學習~~
2008-7-9 19:42
0
雪    币: 239
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
12
楼主不错啊,我学习了啊,拚了命的学,我也要发贴
2008-7-9 21:43
0
雪    币: 211
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
不错,学习了!
2008-8-6 21:36
0
雪    币: 211
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
请问LZ
010136C0   > \60            pushad
  010136C1   .  68 6C6C0000   push    6C6C                             ;  此处压入的是
  010136C6   .  68 33322E64   push    642E3233                         ;  user32.dll的ASCII码
  010136CB   .  68 75736572   push    72657375                         ;  也可以找个地方直接写字符串
push字符串是怎么来得?怎么写的?
2008-8-6 21:54
0
雪    币: 193
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
想调用EXE中导入表的函数应该怎么做?
2008-8-6 22:28
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
这么强啊,得有相当的基础知识才行
2008-8-7 00:03
0
雪    币: 53
活跃值: (80)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
一直點擊 === 程序會快死機.
2008-8-7 08:38
0
雪    币: 1969
活跃值: (46)
能力值: (RANK:550 )
在线值:
发帖
回帖
粉丝
18
OD中点右键--查找--所有分支
学习
2008-8-7 09:25
0
雪    币: 399
活跃值: (38)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
19
就是在堆栈中构造一个字符串
假设要构造字符串"abc"
就这样
push 00636261H

此时堆栈是这个样子
00h
63h('c')
62h('b')
61h('a')
esp就指向栈顶,也就是61的地方
2008-8-7 16:19
0
雪    币: 211
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
谢谢LZ热心知道,我又学会了一点知识
2008-8-7 17:16
0
雪    币: 238
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
文章写得很好,但为何你的附件中的计算器计算后只出你的名字,等很久也不出正确的计算结果?再点=结果不正确,第三次点=才能正确了?
2008-8-30 11:13
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
学习.....
2008-8-30 11:20
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
哈哈,有趣~~~~~~~
2008-11-12 17:38
0
雪    币: 399
活跃值: (38)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
24
有这回事?我的电脑上不存在这样问题啊
你什么操作系统?
2008-11-12 18:27
0
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
25
如果想在程序启动是时动画效果的话,就在ShowWindow之后插入AnimateWindow就可以了
2008-11-12 18:52
0
游客
登录 | 注册 方可回帖
返回
//