必威体育Betway必威体育官网
当前位置:首页 > IT技术

一次PEDIY---修改Windows自带的calc.exe (OD Switch大法)

时间:2019-07-11 00:40:00来源:IT技术作者:seo实验室小编阅读:91次「手机版」
 

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,点击运行此时重新复制文件,可以跨主机复制啦原以为是

【code】彩色砖块

重点方法二!! 小易有一些彩色的砖块。每种颜色由一个大写字母表示。各个颜色砖块看起来都完全一样。现在有一个给定的字符串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自动弹出MSN中文网界面解决办法 原因:每当用户连接到网络时,Windows 会向微软的一个域名发送访问请求,访问结果作为网络连接

分享到:

栏目导航

推荐阅读

热门阅读