能力值:
( LV4,RANK:50 )
|
-
-
2 楼
0041326B nop掉
|
能力值:
( LV9,RANK:160 )
|
-
-
3 楼
。。。。。
有效
nop掉程序不会自动退出除了。。
可是我还是没找到出来Timer的地方
下GetMessageA也没找到。。
|
能力值:
( LV9,RANK:160 )
|
-
-
4 楼
又小研究了下:
漫长旅程:
对时间的CM没怎么弄过,对DIY这个程序费了不少劲
1、首先当然是想到SetTimer这个函数了,果然可以定位,而且时间设置的是1s,应该就是这个了
可惜他没有回调函数,也就是说Timer事件的响应是通过消息了(弄的时候忽略了可以用KillTimer函数定位)
2、到网上查到这个 113H 是windows的timer消息,因此右键查找常量,只找到一处,可怎么看也不像处理的关键代码
3、想下个202消息断点看看,但程序不允许对他上面的控件下消息断点
4、程序到时间就退出,那么好,设置ExitProcess断点吧。堆栈窗口得到如下信息
0012FF28 004254A1 /CALL 到 ExitProcess 来自 BG.0042549B
0012FF2C 00000000 \ExitCode = 0
0012FF30 7C92E920 ntdll.7C92E920
0012FF34 004253CB 返回到 BG.004253CB 来自 BG.004253FE
0012FF38 00000000
0012FF3C 00000000
0012FF40 00000000
0012FF44 00424ECD 返回到 BG.<模块入口点>+0E9 来自 BG.004253BE
0012FF48 00000000
一直查到这里BG.<模块入口点>+0E9 (程序入口+0E9)
结果发现程序正常退出也是途径这里,应该都是接收了退出消息的反应
5、最后,既然是退出消息,那么应该会调用SendMessage发送消息吧,
先将程序运行起来(运行的时候程序会多次调用SendMessageA),再下SendMessageA断点,等时间到了被断下
0041238C . 8B3D 34474800 mov edi, dword ptr [<&USER32.SendMessageA>] ; USER32.SendMessageA
在这里发现了很多东西: SetDlgItemTextA, 还剩下时间: %d,那很有可能就是这里了。
向上看看:
004122EE > \8B0D E0B84700 mov ecx, dword ptr [47B8E0] ; Case 113 (WM_TIMER) of switch 004122A8
这是他消息处理的分支(没有常量113)
004122A8 . 81E9 10010000 sub ecx, 110 ; Switch (cases 110..219)
004122AE . 0F84 EF0C0000 je 00412FA3
004122B4 . 49 dec ecx
004122B5 . 0F84 CD000000 je 00412388
004122BB . 49 dec ecx
004122BC . 0F84 A9000000 je 0041236B
004122C2 . 49 dec ecx
004122C3 . 74 29 je short 004122EE ; 这个是WM_TIMER消息的处理函数
004122C5 . 83E9 0C sub ecx, 0C
004122C8 . 74 11 je short 004122DB
004122CA . 81E9 FA000000 sub ecx, 0FA
004122D0 . 0F85 91120000 jnz 00413567
004122D6 . E9 E6120000 jmp 004135C1 ; Case 219 (WM_DEVICECHANGE) of switch 004122A8
现在没找到的是哪里让他退出的呢?
在设置倒计时显示的那个控件的时候,发现这条指令
00412360 . FF0D E0B84700 dec dword ptr [47B8E0]
程序开始的时候会对他进行初始化,通过在内存窗口改变它的值,发现程序退出的时间就是和这个变量有关。
在哪里设置的这个值呢?重新加载程序,在[47B8E0]上设置内存访问断点,被断在如下位置:
00413FF2 . 50 push eax ; /pDisposition
00413FF3 . 68 8CB94700 push 0047B98C ; |pHandle = BG.0047B98C
00413FF8 . 53 push ebx ; |pSecurity
00413FF9 . 68 3F000F00 push 0F003F ; |Access = KEY_ALL_ACCESS
00413FFE . 53 push ebx ; |Options
00413FFF . 53 push ebx ; |Class
00414000 . 53 push ebx ; |Reserved
00414001 . 68 841A4700 push 00471A84 ; |software\winternals\bginfo
00414006 . 68 01000080 push 80000001 ; |hKey = HKEY_CURRENT_USER
0041400B . FF15 583D4800 call dword ptr [<&ADVAPI32.RegCreateK>; \RegCreateKeyExA
00414011 . FF75 F8 push dword ptr [ebp-8]
00414014 . 8D45 FC lea eax, dword ptr [ebp-4]
00414017 . 50 push eax
00414018 . 68 E42D4700 push 00472DE4 ; silent
0041401D . E8 39D4FEFF call 0040145B
00414022 . 83C4 0C add esp, 0C
00414025 . 85C0 test eax, eax
00414027 . 74 07 je short 00414030
00414029 . C605 9CB94700>mov byte ptr [47B99C], 1
00414030 > FF75 F8 push dword ptr [ebp-8]
00414033 . 8D45 FC lea eax, dword ptr [ebp-4]
00414036 . C705 E0B84700>mov dword ptr [47B8E0], 0A ; 这里内存访问断点被断下
竟然是个常数0A
程序有个命令行选项的说明,似乎可是设置这个时间,但是我没看明白他的命令行是怎么用的,就到此为止吧!
LZ参考吧!!
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
谢谢.回答.呵呵.我试试.我别的不太会NOP还是会的.但是是不退出了.是退不出了.所以发上来让大家看下.我先试试二楼的.在看三楼的.好长.长知道.真是太感谢了.
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
二楼的有效.可能是我没NOP对地方.呵呵.谢谢二楼.
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
三楼的我也看了下.呵呵.讲的很好...就是我看不懂.对这方面不太了解.哎.呵呵,我还是要向坛子里的人学习.在次谢谢两位帮助.学习了很多东西.
|
能力值:
( LV4,RANK:50 )
|
-
-
8 楼
00414036 C705 E0B84700 2C010000 mov dword ptr ds:[0x47B8E0],0x12C
|
|
|