Re: ETHREAD为什么会出错?
《软件调试》的示例程序
ETHREAD为什么会出错?
想睡觉
2008-11-11, 23:57 下午
1
ulETHREAD为得到的某进程的第1个线程的ETHREAD
2
ulETHNext 为下1个ETHREAD结构的首地址
ULONG dwETHNext = (*(ULONG*)(ulETHREAD+0x1b0))-0x1b0;
3
dwPIDTemp 为ETHREAD结构的进程ID
ULONG ulPIDTemp = (ULONG)((*(ULONG*)(ulETHREAD+0x220))+0x084);
4
while(dwETHNext != dwETHREAD)
{
//5
if(dwPID == dwPIDTemp)
{
datas.Address = dwETHREAD+0x248;//CrossThreadFlags的偏移
datas.Data = &g_dwProtectCode;
datas.Length = 4;
status = NtSystemDebugControl(0x9,&datas,
sizeof(MEMORY_CHUNKS),NULL,0,&dwRetLen);
}
//6
dwETHNext = (*(ULONG*)(dwETHREAD+0x1b0))-0x1b0;
dwPIDTemp = (ULONG)((*(ULONG*)(dwETHREAD+0x220))+0x084);
}
张老师,我的地址都是通过WINDGB计算得到的,可是程序运行出错(崩溃了),权限没有问题。
请帮我看看,主要作用是线程防杀。
代码写得很乱!!!
Re: ETHREAD为什么会出错?
王宇
2008-11-12, 00:20 上午
1. 硬编码太多无法跨平台
2. 这么硬生生的遍历线程链, 夸张了吧?
3. 分析Bug还是要贴DMP文件出来
4. 防杀有非常多的方法 APC就不错
(KiXXX Inline 一下过滤,另自己实现请参考:http://hi.baidu.com/iceboy%5F/blog/item/5267adc21300f853b319a8ef.html)
Re: ETHREAD为什么会出错?
MJ0011
2008-11-12, 03:08 上午
cross flag & systemdebugcontrol
both S H I T
Re: ETHREAD为什么会出错?
想睡觉
2008-11-12, 09:14 上午
我主要针对的是XP SP2,x86的系统。实际上第一个ETHREAD的MemChunks写入成功了,后面的遍历我用WinDbg调试跟踪也找到了第1个线程的ETHREAD的cross flag ,其标志为0x10是正确的。我不明白的是通过_LIST_ENTRY遍历线程为什么会出错???!!!地址偏移是匹配的。我是要在Ring3级实现。不是病毒啊,我只是要保护我的2个UI线程和4个工作线程。因为是关系到数据安全的,不能随便关闭的,要权限的。
我的防杀不能使用守护线程之类的方法,它不是病毒。是不是要设置什么线程的Alert状态?我是菜鸟,请高手指教!谢谢.
Re: ETHREAD为什么会出错?
格蠹老雷
2008-11-12, 12:49 下午
与王宇和MJ一样,我也不赞成使用这样的方法,从这个角度努力是不可能根本解决问题的,而且容易引入额外的问题。不清楚你要达到的根本目的是什么?防止线程被其它程序杀掉,还是防止意外退出?建议你还是从算法和设计方面彻底解决问题,比如要让每个工作线程的关键操作原子化,有守护线程来监视工程线程,等等。