| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 13260 人关注过本帖, 1 人收藏
标题:[虚心求教]后台窗口模拟按键;反外挂原理;进程隐藏;和一些WINFORM下的小问题 ...
只看楼主 加入收藏
lkwudi222
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2009-10-27
结帖率:50%
收藏(1)
已结贴  问题点数:20 回复次数:11 
[虚心求教]后台窗口模拟按键;反外挂原理;进程隐藏;和一些WINFORM下的小问题。
问题比较多,麻烦各位了。(以下全部基于C#)
1、
一直想做一个类似按键精灵的软件,前台的很简单,用SendKeys()就可以实现。但请问如何实现非活动窗口(非焦点)的按键模拟?
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
发完帖子后又奋战1小时,终于有了结果,哈哈哈哈,高兴中……
明天晚些时候尝试完美实现出来。HOHO。。。

2、
想问一下现在很多游戏都有自己的反外挂的技术,小弟想了解这个不是为了外挂技术。
反外挂策略除了扫描进程名、窗口名、代码特征以外,会不会很准确的通过API检测到?
使用SendKeys()或者API的SendMessage()有可能被游戏程序捕捉并判定到吗?
按键精灵使用的是API还是更加底层的技术?

3、又是一个敏感的话题,隐藏进程。软件不想让用户或者自主的脚本/软件/病毒关闭,比较有效的方法就是隐藏进程,让别人找不到,结束不了。
在网上搜的结果是:线程注入不适合C#,系统服务云云也不行。希望各位大侠给指条路。

4、一些零散的问题。
我写的小程序窗口比较多,同时打开的情况也时常发生,所以对窗口之间的互相响应怨念比较多
①假设主窗口A是始终显示的,此时需要在A运行时创建另一个窗口B,但想让B是不可见的,怎么实现?
如果不用B.show()窗口B就等于没有创建,我用B.show()后面紧跟B.hide(),但是会闪一下。如何改变思路?

②窗口A创建了窗口B,怎样在A中关闭B?B.close()似乎不能完全结束掉B。

③程序使用了API文件流操作INI文件,没有INI文件时新建它。问题在于创建INI文件的IO命令后需要几秒的延时后才可以写入,我只能用Sleep甚至timer来延时,感觉很别扭。
换句话说,怎样等待IO结束后再执行下面的代码?有没有什么更好的办法解决?

④如何最经济的判断一个可执行文件是否已经运行了至少一个实例。

⑤我想监视进程列表,有没有比timer更省资源的方式?

⑥GUI在某个控件上获得了绘图对象,鼠标点击事件如何做到先清除上一条线,然后再画一条线。刷新似乎不管用,会让新线条也画不上。

⑦我只有一个A.EXE,能不能给定一个变量int1=1,然后在运行时改变int1=2。下次运行A.EXE是,变量str已经==2?
似乎不可能?程序不能修改自身?修改会造成MD5改变? 望赐教。

⑧代码逻辑和调用到达一种什么状态就意味着严重印象了效率?
比如一个很长的字符串,拆成一个一个的分别通过一个10行左右的简单加密代码加密,最后返回一个很长的加密后的字符串,是否算是消耗很多资源?

新人就这20分,希望不要嫌少。。
不管你有没有回答,谢谢你将我的问题看完了,谢谢。

[ 本帖最后由 lkwudi222 于 2009-11-15 04:58 编辑 ]
搜索更多相关主题的帖子: 进程 原理 外挂 后台 WINFORM 
2009-11-15 02:21
jedypjd
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:9
帖 子:1096
专家分:4969
注 册:2009-7-27
收藏
得分:15 
1,不知道

2,SendMessage()发到目标Form的句柄上,Form的message可以捕捉到,postmessage,sendmessage已经是底层API了

3,https://bbs.bccn.net/thread-125633-1-1.html
10楼有上传dll,现在的病毒隐藏技术很多是封装成dll,由其他的exe来启动

4,①可以这样:
            
程序代码:
            Form2 f2 = new Form2();
            f2.Height=0;
            f2.Width = 0;
            f2.ShowInTaskbar = false;
            f2.FormBorderStyle = FormBorderStyle.None;
            f2.Show();

②B.Dipose();

③thead.jion();可以解决这个问题
用lock(){}好像也行


        
程序代码:
        public abstract class OneInstance
        {
            /// <summary> 
            /// 用来判断一个指定的程序是否正在运行 
            /// </summary> 
            /// <param name="appId">程序名称,长一点比较好,防止有重复</param> 
            /// <returns>如果程序是第一次运行返回True,否则返回False</returns> 
            public static bool IsFirst(string appId)
            {
                bool ret = false;
                if (OpenMutex(0x1F0001, 0, appId) == IntPtr.Zero)
                {
                    CreateMutex(IntPtr.Zero, 0, appId);
                    ret = true;
                }
                return ret;
            }

            [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
            private static extern IntPtr OpenMutex(
                uint dwDesiredAccess,  // access 
                int bInheritHandle,    // inheritance option 
                string lpName          // object name 
                );

            [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
            private static extern IntPtr CreateMutex(
                IntPtr lpMutexAttributes,  // SD 
                int bInitialOwner,                       // initial owner 
                string lpName                            // object name 
                );
        }

⑤用计时器就是轮询的方法,消耗资源是没办法的,进程改变不知道对应什么事件,可以把时间间隔设长点


            
            Graphics g = this.CreateGraphics();
            g.Clear(this.BackColor);//用背景色来擦除
            g.DrawLine();
            this.Refresh();

⑦用INI文件来保存读写吧,用XML也行,我曾看到用一个类来读写静态数据,也可行

⑧这算简单处理字符串,不至于影响效率,只要你算法合理

天涯无岁月,歧路有风尘,百年浑似醉,是非一片云
2009-11-15 14:39
lkwudi222
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2009-10-27
收藏
得分:0 
哇这么快就有人回帖了。
我正郁闷第一个问题呢,昨天晚上改了下代码实现了,可是今天重写又发现了新问题
我一开始是用一个 1.txt - 记事本 的窗口实验,句柄确实获得了,可是没有效果。
然后用一个控件的句柄实现了,然后又用QQ一个聊天窗口的句柄也实现了,很奇妙。
新的问题出来了,如果有2个名字一样的窗口,如何锁定某个窗口的句柄?或者窗口的句柄ID是唯一的?
问题2:
现在很多游戏反外挂会检测API使用情况,如果只使用findwindow和postmess去模拟键盘操作会很容易发现吗?
代码写的迷惑点有助于隐藏程序吗?
问题3:
我就是被帖子里10楼的代码吸引到贵论坛的,呵呵,源码和封装的DLL我都看过了,因为仅仅略懂.NET,C#语言主攻,所以代码看不懂,DLL封装也不能加载,如果有.NET或者直接C#版的就好了。
问题4:
①谢谢。但是如果这个窗口还要用到,还得再把样式改回来。有没有方法能让窗口实际已经运行,但是不调用show呢?
③thead.jion();线程的东西不经常用,能不能给一段简单的代码?谢谢
④非得用到API吗,我只想知道一个EXE是不是已经运行了。用某些操作报错的方法能不能更简单些?
⑦看来只有用外部文件了,呵呵,我这倒是有个类读写INI的,拿出来分享下。
程序代码:
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace Card1
{
    class IniFile
    {
        [DllImport("kernel32")]
        private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);
        //参数分别为
        //[section]
        //key=val
        //filePath是物理路径
        [DllImport("kernel32")]
        private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);

        public static void Write(string section, string key, string val, string filePath)
        {
            //string encodeval = Jiami.EnCode(val);
            //Jiami.EnCode()是自己写的一个加密类,可以略过这一行
            WritePrivateProfileString(section, key, encodeval, filePath);
        }

        public static string Read(string section, string key, string filePath)
        {
            StringBuilder temp = new StringBuilder(255);
            GetPrivateProfileString(section, key,null,temp,255, filePath);
            //return Jiami.DeCode(temp.ToString());//返回解密后的字符串
            return temp.ToString();
        }
    }
}


[ 本帖最后由 lkwudi222 于 2009-11-15 16:05 编辑 ]
2009-11-15 16:02
athenalux
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:河北石家庄
等 级:小飞侠
威 望:8
帖 子:975
专家分:2514
注 册:2008-11-26
收藏
得分:5 
1.利用API可以找到相应的窗口,来激活所要的窗口。一般先用findwinow来找到窗口的句柄,至于有多个相同的窗口的话,虽然它们看起来没什么区别,其实它们的进程句柄是不同的。对不同的句柄操作就可以了。
2.说实话,现在的游戏对于senkeys之类的方法早就屏蔽了,以为外挂这么容易的话可就错了。现在流行的方法是"CALL",例如一个游戏中,角色”攻击“怪物,一般先找分析游戏程序,找到“攻击“的函数,然后由外挂来调用这个函数(这些需要有一定的汇编知识,我是搞不定了,如果有心研究的,可以去“广海游戏论坛”去转转)。
3.......
4.1实例化窗口B类就可以了,在需要的时候调用show(),如果没有需要的话,可以不调用show().\
4.2用dispose(),有些资源用户无法真正的清理干净,因为C#的资源回收是由垃圾处理器在适当的时候自动处理的,用户无法控制这些。
4.3为什么要等几秒再执行下面的语句?如果没必要就不要了。
4.4..........
4.5把timer的间隔设大点,这样资源占用就少了。
4.6当然是先清除了再画了
4.7楼上说的不错,INI与XML都可以,.net有专门操作它们的方法。
4.8基本上来说,这个问题要看怎么来做了,使用数组,指针,stringbulder类,将提高效率。

[ 本帖最后由 athenalux 于 2009-11-15 16:58 编辑 ]

QQ:81704464
2009-11-15 16:54
jedypjd
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:9
帖 子:1096
专家分:4969
注 册:2009-7-27
收藏
得分:0 
1, findwindow,找的时候不止一个name参数吧,我记得,看看API吧,应该可以区分同名的Form的
2,这个得看反外挂程序怎么写了
3,其他语言的com组件在C#里也能使吧
4, ①可以调整Form的透明度为0
    ③代码找不到了
    ④用某些操作报错的方法也需要一个辨认的方法啊,除了API还能怎么辨认

天涯无岁月,歧路有风尘,百年浑似醉,是非一片云
2009-11-15 17:06
lkwudi222
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2009-10-27
收藏
得分:0 
谢谢楼上两位的回答。
进程注入那个组件我又试了一次发现能引用了,然后在一个Button的事件中中加上
{ 
    HideProcess hideProc = new HideProcess();
    hideProc.HideCurrentProcess();
}
运行起来点击按钮发现无反应,进程还在。
系统是XP SP3。
2009-11-15 22:01
jedypjd
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:9
帖 子:1096
专家分:4969
注 册:2009-7-27
收藏
得分:0 
1,如果能引用,用对象浏览器打开看这个dll里面有什么
2,不能引用,用dll导出查看工具看看它导出了什么API

天涯无岁月,歧路有风尘,百年浑似醉,是非一片云
2009-11-15 22:57
jedypjd
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:9
帖 子:1096
专家分:4969
注 册:2009-7-27
收藏
得分:0 
我看了一下,没有封装hideProc.HideCurrentProcess();

天涯无岁月,歧路有风尘,百年浑似醉,是非一片云
2009-11-15 22:58
tokoyoshi
Rank: 2
等 级:论坛游民
帖 子:99
专家分:67
注 册:2009-10-24
收藏
得分:0 
顶~
2009-11-16 09:04
ziyun1979
Rank: 1
等 级:新手上路
帖 子:7
专家分:2
注 册:2009-11-13
收藏
得分:0 
刚学,冒个泡.
2009-11-16 12:46
快速回复:[虚心求教]后台窗口模拟按键;反外挂原理;进程隐藏;和一些WINFORM下的小 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019799 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved