小问题,小问题,能得到切实的解决方案再开帖加分。1、监视注册表子键打开。当某个键被打开时能返回一个通知,让我的程序可以在对方进程读取数值前改变这个数值。2、如何知道其他进程中的某个线程处于:
   A、“闲置”状态,即正在等待键盘鼠标的操作
   B、“加载完毕”状态,即该线程的加载工作已经完成
A、B其实差不多,实现哪个都行。3、VB.NET写的DLL应该如何处理才可以注入其他进程后正常使用。

解决方案 »

  1.   

    第一个问题HOOK API可以实现
    第二个问题估计这个函数可以得到答案"NtQuerySystemThread"
    第三个问题豆子回答
      

  2.   

    第3个问题基本上很难,.net的dll不同于动态链接库或ActiveX DLL。
      

  3.   

    第3个问题如果是用vb6的话可能比较容易解决,找一下"增强link.exe"看看,这个软件通过修改编译时的参数使输出的dll文件和规范的dll文件一样带导出函数,vb.net没怎么用过,可能也差不多吧~~~
      

  4.   

    恩第三个问题到现在我的理解是这样的:这个VB6呢,可以看作是解释性的,形成的DLL有入口点啥的一些东东,只需要进行一定的符合就可以了(昨天看了豆豆一一篇大作,哈哈)。至于.NET,我的认识是它是二次编译,一次编译形成的程序由相应的CLR来编译成本机可运行的2进制代码,然后就不知道别的了。
    至于第一个问题,chenhui530(陈辉) 兄提出的方法我是知道的,可是如果第三个问题不解决恐怕比较麻烦。我想如果能解决第三个问题,那么改造一下使用SetWindowsHookEx的方法就可以注入了(昨天刚完成一个VB.NET利用这个函数来屏蔽WINDOWS键的东东)。我也曾经尝试使用根据豆豆的HOOK API改造的一个.NET版本的HOOK API的半成品的思路去搞这个,整个程序正好是基于调试的,但非常非常的麻烦——需要对每一个进程进行处理的话,将启动非常多的线程,效率要比注入一个DLL低很多(个人认为)。第二个问题,还得请教chenhui530(陈辉) 兄,这个NtQuerySystemThread的VB6声明是如何的?函数原型当然更好,如果有VB.NET的声明那就更更好了:)查找GOOGLE,BAIDU,MSDN都没有啊。。么办法,还得再次求助。。
    至于分么,一定要给的,前段时间来的比较少,一方面是时间像水里的海绵……而且还在写几个游戏的修改器,一方面是挂了好几个问题还没解决,有点郁闷:-)来的少了可用分自然不多,不过尽量凑吧,绝对不会少的,再者就是我们坛子里“高科技”多一些学习的同志就更多,而且部分或全部开源我是超级拥护~~~~~~~~~~~~~~~~~~~~~~~估计很多同志也是把自己的东西拿出来分享,促进国产软件的发展喽。
      

  5.   

    不好意思大意把函数名称写错了
    申明是这样的
    Private Declare Function NtQueryInformationThread Lib "Ntdll.dll" (ByVal hThread As Long, ByVal ThreadInformationClass As Long, ByVal ThreadInformation As Long, ByVal ThreadInformationLength As Long, ReturnLength As Long) As Long  这里有个实例你可以看下
    http://vbsystemlibrary.free.fr/code.php?ID=34
      

  6.   

    阿门,都回答得差不多了…….net hook总觉得不是什么好事,还是用vc.net写个native dll吧如果楼主最后研究出来的话,那记得拿来分享哦,哈继续闭关……
      

  7.   

    豆豆终于露面的,可惜来的晚了9s。
    否则 2007-09-22 22:22:22 多BT呀。
      

  8.   

    我晕,不是差不多啊,还差不少。。这个NtQuerySystemThread函数~~~~~看了一下啊,在.NET下更改声明如下:
    Private Declare Function NtQueryInformationThread Lib "Ntdll.dll" (ByVal hThread As Integer, ByVal ThreadInformationClass As IntPtr, ByRef ThreadInformation As THREAD_BASIC_INFORMATION, ByVal ThreadInformationLength As Integer, ByVal ReturnLength As IntPtr) As Integer
        Private Structure THREAD_BASIC_INFORMATION
            Dim ExitStatus As Integer
            Dim TebBaseAddress As Integer
            Dim UniqueProcess As Integer
            Dim UniqueThread As Integer
            Dim AffinityMask As Integer
            Dim Priority As Integer
            Dim BasePriority As Integer
        End Structure
    调用方式如下:
        Dim TBI As New THREAD_BASIC_INFORMATION
        
                        NtQueryInformationThread(ProInfo.hThread, IntPtr.Zero, TBI, Len(TBI), IntPtr.Zero)
                    Debug.Print(TBI.AffinityMask)
    可惜啊,获取回来一直都是一个数字。。忘记了。。我用CreateProcess创建的进程,dwCreationFlags标志为4(暂停),然后ResumeThread恢复主的线程执行,直到进程到达等待输入状态,NtQueryInformationThread的返回的结构都是同一个值。上面的代码我虽然修改了THREAD_BASIC_INFORMATION的声明,但没有任何影响的,本来想用INTEGER数组代替了,不过可读性会下降,就没那么做。
    又开始头疼了,试了很多函数都不大行,例如WaitForInputIdle,WaitForSingleObject啥的,看MSDN上的进程和线程操作列表又看不大明白,鸟语不过关啊。。还得继续求。继续求啊
      

  9.   

    哎,变态变态,.NET里面明明可以直接取线程状态,,,,第二个问题自己解决了,将就着第二个也把第一个搞定了。