- UID
- 17680
注册时间2006-7-8
阅读权限10
最后登录1970-1-1
周游历练

该用户从未签到
|
本人对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 ; 来获得主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 [1014EE8]
01013745 .^ E9 03FCFEFF jmp 0100334D
之所以在SetWindowText之后要刷新窗口是因为sleep的时候窗口不会刷新
尽管我们是在调用sleep之前就执行的SetWindowText,程序执行速度很快,还没有刷新Window就sleep了
所以我们要主动刷新一次Window(感谢天杀大哥对我的提示)
好了,整个过程差不多就是这样拉,现在运算之后按下=号键,就会先显示我的名字,然后再显示计算结果拉
在此附上我修改过的calc.exe
mycalc.rar
(41.35 KB, 下载次数: 23)
[ 本帖最后由 zhangke 于 2008-7-9 10:05 编辑 ] |
评分
-
查看全部评分
|