能力值:
( LV6,RANK:90 )
|
-
-
26 楼
我没有崩溃过 我也难得录像了
|
能力值:
( LV5,RANK:70 )
|
-
-
27 楼
|
能力值:
( LV6,RANK:90 )
|
-
-
28 楼
我按照你的回复弄了 是不是要再弄个视频啊
|
能力值:
( LV5,RANK:60 )
|
-
-
29 楼
十一的时候在家里调试了一会,32位系统,但是我没出现这个情况。不知道能不能表达清楚。
我在循环创建线程的下一句下了硬件断点(改了程序代码),然后断下来,取消,f8/f9。(刚又调试了下)
0041152F ^\EB B6 jmp short 004114E7 ; 循环创建线程
00411531 8BF4 mov esi, esp ; 线程函数的0x401000改成了0x411531
00411533 68 3C574100 push 0041573C ; ASCII "pause"
00411538 FF15 0C834100 call dword ptr [<&MSVCR90D.system>] ; MSVCR90D.system
0041153E 83C4 04 add esp, 4
00411541 3BF4 cmp esi, esp
00411543 E8 07FCFFFF call 0041114F
不理解为什么会SetThreadContext失败(我没失败),好像是挂起所有线程再设置的硬件断点,但是又不知道是不是x64的问题,是我没有理解原理吗。
还有个问题,取值*(DWORD *) 0x401000 和Post(0,0,0,0)为什么能起到保护作用呢。
|
能力值:
( LV5,RANK:70 )
|
-
-
30 楼
SetThreadContext 失败的原因很多,比如线程状态,模式等等.
取值*(DWORD *) 0x401000 和Post(0,0,0,0)为什么能起到保护作用;因为他们能触发1号中断(因为SetThreadContext失败了),而这个中断是调试器不处理的异常,造成程序报错!
而且啊 我说的保护地方是函数跟地址,而不是我写的那几个线程.
|
能力值:
( LV5,RANK:60 )
|
-
-
31 楼
我还是没理解,为什么开了线程,就会SetThreadContext失败,好像我没失败。整个过程像下面的代码可以吗,改了一下。(调试的时候线程居然没有断,不理解,上班偷偷发帖晚上再研究。。)
#include <windows.h>
#include <stdio.h>
DWORD dwTarget = 123;
VOID WINAPI CheckThread(LPVOID lp)
{
while (TRUE){
Sleep(3 * 1000);
DWORD dwPorcet;
// VirtualProtect((PVOID)0x00417014, 5, PAGE_EXECUTE_READWRITE, &dwPorcet);
VirtualProtect((PVOID)&dwTarget, 5, PAGE_EXECUTE_READWRITE, &dwPorcet);
// DWORD dwAdder = *(DWORD*)0x401000; ///保护这个地址
DWORD x = dwTarget;
PostMessageA(NULL, NULL, NULL, NULL); ///保护这个函数执行过程
}
}
HANDLE hThread[25];
int main(int argc, char* argv[])
{
for (int i = 0; i < 25; i++)
{
Sleep(10);
hThread[i] = ::CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)CheckThread, NULL, NULL, NULL);
}
__asm nop //调高优先级
__asm nop
int x = dwTarget; //下硬件断点,然后删除,F9
__asm nop
__asm nop
Sleep(1000); //让线程访问
// x = dwTarget; //下硬件断点,然后删除,F9
system("pause");
return 0;
}
|
能力值:
( LV2,RANK:10 )
|
-
-
32 楼
OD确实有很多问题,系统自带的计算器,od附加上去,点运行都会崩溃!
|
|
|