|
|
[求助]OD中这是什么?
我认为不是误报——OD官方才到2.0,还是个BETA版的,不知LZ第三版是怎么来的。。。 |
|
|
[求助]rootkit是指的什么?与hook有什么关系啊 ?
引用第一个Windows NT rootkit的作者Greg Hoglund博士的说法: A rootkit is a "kit" consisting of small and useful programs that allow an attacker to maintain access to "root," the most powerful user on a computer. In other words, a rootkit is a set of programs and code that allows a permanent or consistent, undetectable presence on a computer. |
|
|
[求助]关于函数READ_PORT_UCHAR的断点设置!
简单而实用,好方法! |
|
|
[求助][求助]请高手赐教patch kifastcallentry()
看了你的错误日志,里面写的Single step exception - code 80000004 ,我推测十有八九是某个地方将你保存在堆栈中eflags的值修改了,将原来值中的TF值置1了,这说明在堆栈上面的操作还得进行严格的检查,具体如何检查?只能是调试了!软件本来就是调试出来的。 至于说同步的问题,在PATCH的时候肯定是要注意的,如果你的程序在多CPU的环境下运行,出错的可能性是比较大的。所以在PATCH的时候是应该使用interlock开头的函数,直接一次性将4个字节替换掉。用原子操作的好处是你既不需要屏蔽中断,也不需要考虑多CPU带来的同步问题。 至于写驱动,多查资料,internet足以应付你遇见的所有情况。冰冻三尺非一日之寒,在解决问题的同时重点学习解决问题的方法,这才是最主要的! |
|
|
[求助][求助]请高手赐教patch kifastcallentry()
之所以没将解决方案实现出来,是想让楼主明白问题的原因之后想办法自己解决,很简单的,相信你能够解决的。多试验几次就可以了,编译之后用IDA分析一下。另外可以参考一下《Undocumented Windows 2000 Secrets》,里面有探测NATIVE API的方法,可以参照。 至于要查找调用进程ID,也是比较非常容易的。先通过fs:124得到CurrentThread,得到的是一个KTHREAD型指针,然后在指针所指位置的20h偏移处得到TEB指针,然后在TEB的20h偏移处得到一个_CLIENT_ID结构,这个结构包含两个成员,一个是当前线程ID,另外一个是当前进程ID。 顺便啰嗦一句,在驱动编程中别用memcpy。驱动编程涉及字符串和内存拷贝的要使用RTL开头的函数,这样会比较安全,比如,这里可以用RtlCopyMemoryNonTemporal替换memcpy。 授人以鱼,不如授人以渔。这是我一向的原则。对了,称呼您我可不敢当,估计我比你大不了多少 |
|
|
[求助][求助]请高手赐教patch kifastcallentry()
中间代码需要屏蔽的问题出在KeQueryTickCount函数上。 先来看看是怎么分析出来的。将注释掉的代码重新启用并编译,加载到IDA中,截取片段如下(注意最后几行加的注释): PAGE:00010BE7 MyInfoHook proc near ; DATA XREF: GetHookInfo+7F PAGE:00010BE7 pushf PAGE:00010BE8 pusha PAGE:00010BE9 test eax, 3000h PAGE:00010BEE jnz loc_10CE9 PAGE:00010BF4 mov serviceId, eax PAGE:00010BF9 mov eax, serviceId PAGE:00010BFE push eax PAGE:00010BFF call _PsGetCurrentProcessId@0 ; PsGetCurrentProcessId() PAGE:00010C04 push eax PAGE:00010C05 push offset aProcessIdIsLdS ; "process id is : %ld, service id is %x\n" PAGE:00010C0A call _DbgPrint PAGE:00010C0F add esp, 0Ch ;到这里,MyInfoHook函数的堆栈是平衡的 PAGE:00010C12 mov ecx, ds:KeTickCount PAGE:00010C18 mov [ebp-4], ecx ;注意,这里对堆栈进行了操作!! ...skipping 不说后面的,先来看看00010C18处对堆栈的操作会有什么影响。 先来看看MyInfoHook被调用时函数的堆栈情况。 kd> u nt!KiFastCallEntry+0x41: 8053d751 ff33 push dword ptr [ebx] 8053d753 c703ffffffff mov dword ptr [ebx],0FFFFFFFFh 8053d759 8b6e18 mov ebp,dword ptr [esi+18h] 8053d75c 6a01 push 1 8053d75e 83ec48 sub esp,48h 8053d761 81ed9c020000 sub ebp,29Ch 8053d767 c6864001000001 mov byte ptr [esi+140h],1 8053d76e 3bec cmp ebp,esp ;注意!这里进行的比较操作! 8053d770 759a jne nt!KiFastCallEntry2+0x47 (8053d70c) 8053d772 83652c00 and dword ptr [ebp+2Ch],0 8053d776 f6462cff test byte ptr [esi+2Ch],0FFh 8053d77a 89ae34010000 mov dword ptr [esi+134h],ebp 8053d780 0f854afeffff jne nt!Dr_FastCallDrSave (8053d5d0) 8053d786 8b5d60 mov ebx,dword ptr [ebp+60h] 8053d789 8b7d68 mov edi,dword ptr [ebp+68h] 8053d78c 89550c mov dword ptr [ebp+0Ch],edx 8053d78f c74508000ddbba mov dword ptr [ebp+8],0BADB0D00h 8053d796 895d00 mov dword ptr [ebp],ebx 8053d799 897d04 mov dword ptr [ebp+4],edi 8053d79c fb sti 8053d79d 8bf8 mov edi,eax ;检查序号的12、13位来判断是用哪个表 8053d79f c1ef08 shr edi,8 通过你的驱动代码看出,你的函数MyInfoHook是在地址8053d79d处开始执行的。而在地址8053d76e处比较了ebp和esp的值,从地址8053d79d正常执行到8053d76e处,这说明在比较时ebp和esp是相等的!正常执行,中间也不再有push和pop操作,说明一直到MyInfoHook函数的入口处,ebp和esp都是相等的! 我们来构建从调用函数MyInfoHook到函数执行到00010C18处对堆栈进行操作时的堆栈,因为在执行时是直接从KiFastCallEntry中jmp过去的,所以堆栈应该是下面这个样子的: edi esi ebp esp ebx ebx ecx eax eflag here=esp,ebp 这个时候问题就非常明朗了,00010C18处的"mov [ebp-4], ecx"就已经将pushfd保存的值修改了! 那为什么会这样呢?来看看ntddk.h中对KeQueryTickCount的定义: #define KeQueryTickCount(CurrentCount ) { \ volatile PKSYSTEM_TIME _TickCount = *((PKSYSTEM_TIME *)(&KeTickCount)); \ while (TRUE) { \ (CurrentCount)->HighPart = _TickCount->High1Time; \ (CurrentCount)->LowPart = _TickCount->LowPart; \ if ((CurrentCount)->HighPart == _TickCount->High2Time) break; \ _asm { rep nop } \ } \ } 这表明了KeQueryTickCount其实是一个宏,而且宏在一开始就定义了一个局部变量_TickCount,我们知道,局部变量是在栈上分配的。本来,编译器有责任对堆栈进行自动平衡,但是这里的MyInfoHook不仅是naked调用方式,更是在整个驱动代码中看不见对MyInfoHook的明显调用,造成编译器不知道怎样去平衡堆栈,所以问题就出现了! |
|
|
[原创]qq2008之前的视频解码---告别中关村之一
看完了所有的回复,首先,对程序员们致以诚挚的问候! 看到楼主的帖子,发现我的处境困难度和你的差得不远了,只是我还没到三十而已。我也寂寞、也穷困、也勤劳、也迷茫、也无奈——即使我还乐观。大环境下,程序员的生活就是这样的。在中国,你当然也可以将自己的代码写得如高德纳所谓的艺术般美丽,然而想从中得到足够的物质报酬却是一个未知的问题。以前就看过一篇文章讲中国的程序员的工资总是会低于项目经理的工资云云,这说明在IT界也充斥着官本位的思想,加上一系列的其他因素,造就了中国IT业的畸行,结果是程序员们成为了新时代里的IT界民工,作为IT界最底层的人物承受着最痛苦的磨难。 然而,现实也是要面对的。对于IT之路,to be or not to be,自己选择;然后坚强的生活,坚强的走完人生之路。 以前无缘看见这个帖子,时隔许久,希望楼主已经走上了人生的光明大道! 祝你一路走好! 祝正在辛勤劳作的程序员们一路走好! 祝自己一路走好! |
|
|
[原创]对api 名字 hash的一点理解
海风太谦虚了!仅从C上讲,你就比我高出近一个数量级了。 |
|
|
[原创]对api 名字 hash的一点理解
我完全没有否认你的意思,我用VC6编译了你的代码,结果和你的一样,会出现那条指令的!我只是由此说明了一下这是VC的一种优化手段。呵呵,至于那个文件嘛,VC6在安装时默认是不会安装那些文件的,便于调试,我将那些文件从安装包里面拷贝进去了。安装包里面VC98\CRT下面就是的。 我贴出来是想说,VC6之所以编译成这个样子,是由于那个函数完全可以用一条汇编编译器指令指令来实现,结果编译的时候检查_lrotl()函数是否是被调用了,如果是被调用了,编译器会破例把这个函数直接用一条汇编指令实现之。 |
|
|
[原创]对api 名字 hash的一点理解
我认为海风那个代码的优化是VC6做了手脚的,当判断出是调用那个函数的时候,直接用汇编指令代替。原因有三个,如下: 1.看编译器安装目录中库文件代码中的rotl.c,我同样用VC6试验了,同样的函数无论如何优化总是不能只得到一条汇编指令。 /*** *unsigned _rotl(val, shift) - int rotate left * *Purpose: * Performs a rotate left on an unsigned integer. * * [Note: The _lrotl entry is based on the assumption * that sizeof(int) == sizeof(long).] *Entry: * unsigned val: value to rotate * int shift: number of bits to shift by * *Exit: * returns rotated value * *Exceptions: * None. * *******************************************************************************/ unsigned long __cdecl _lrotl ( unsigned long val, int shift ) { return( (unsigned long) _rotl((unsigned) val, shift) ); } unsigned __cdecl _rotl ( unsigned val, int shift ) { register unsigned hibit; /* non-zero means hi bit set */ register unsigned num = val; /* number to rotate */ shift &= 0x1f; /* modulo 32 -- this will also make negative shifts work */ while (shift--) { hibit = num & 0x80000000; /* get high bit */ num <<= 1; /* shift left one bit */ if (hibit) num |= 1; /* set lo bit if hi bit was set */ } return num; } 2.海风的代码在编译之后,查看obj文件的时候代码里面就出现了那条汇编指令。针对一般的库函数没有这种搞法的,都是需要再连接一下。 3.这个更有意思,就算在c文件中只想声明一个名叫_rotl的函数都不行,编译的时候提示 error C2169: '_rotl' : intrinsic function, cannot be defined 这里可以看出那是VC优化手段中的一种。 我凑凑热闹,不好意思,跑题了。。。 |
|
|
[求助]关于fs寄存器的问题
名叫《Intel@64 and IA-32 Architectures Software Developer Manual》的pdf文档,自己google吧。顺便八卦一下,内事不决问百度,外事不决问谷歌 |
|
|
[求助]关于fs寄存器的问题
说说问题二吧,这里我用实例证明一下。 我这里gdtr=8003f00003ff,某个进程空间中ring 3下的fs=0038h。 08h用二进制表示为00000000 00111000,按照intel文档的说明,最低的2位表示将要访问的段的权限级为0,第3位这里是0,表示将要访问的段的段描述符从全局描述符表(即GDT)里面取得,剩下的高13位是所为索引值用的,这里是7。每个段描述符占8个字节,8003f000处存放有一个NULL描述符。 lkd>dd 8003f000+8*7 8003f038 f0000fff 7f40f3fd 0400ffff 0000f200 每个描述符8个字节,按照intel文档的说明,8003f038处的双字的高16位是段起始地址的低16位,8003f03c处双字的高8位是段起始地址的高8位,8003f03c处双字的低8位是段起始地址的中间的8位,综合起来就是7ffdf000。 验证一下。 lkd> dd 7ffdf000+18 l1 7ffdf018 7ffdf000 |
|
|
[原创]为大家提供工作机会呀
可以先搞个网络面试。。。 |
|
|
[求助]8088或8086中中断向量表
实模式下这个是对的 |
|
|
[原创]为大家提供工作机会呀
可以试一下的 |
|
|
[原创]为大家提供工作机会呀
呵呵,一石激起千层浪呀,看来我得尽快改呀。 |
|
|
[原创]为大家提供工作机会呀
不是说了嘛,请指教一下的。我暂时还没得到具体的信息,到时候我会修改相应的项目。 |
|
|
|
|
|
|
操作理由
RANk
{{ user_info.golds == '' ? 0 : user_info.golds }}
雪币
{{ experience }}
课程经验
{{ score }}
学习收益
{{study_duration_fmt}}
学习时长
基本信息
荣誉称号:
{{ honorary_title }}
勋章
兑换勋章
证书
证书查询 >
能力值