首页
论坛
课程
招聘
[原创]进程间通信之LPC解决实现
2011-12-20 21:34 23746

[原创]进程间通信之LPC解决实现

2011-12-20 21:34
23746
小弟最近因工作对某软件进行测试,发现由于一些模块设计过于简单,比较容易逆向分析,分析后发现存在比较严重的问题。具体问题涉及工作,现在不能公布。嘿嘿,今天小弟要开源的代码是进程间通信之LPC解决实现(我写的代码与该软件采用的通信方式没有任关系,与工作也没关系,所以可以公布了啦)!写这个代码当年是因为项目需要快速的同步的传输数据(本来是C/S架构的软件,由于WIN7的SESSTION隔离,不得不把C端又拆成了C/S模式)。C拆成C/S后就又涉及进程间通信了(其实SOCKET也是进程间通信方式中的一种)。
    因为LPC本身拥有优秀的条件,因此在众多的进程间通信方式的选择中,我们选择了LPC!
    LPC的优势:
    NO.1:微软未公开文档自己用的东西,传输速度不快能行么?
    NO.2:由于LPC本身实现了数据读写的同步处理,呵呵,读者写者问题,不需要我们去关心了!(这个才是我们看重的东西,小弟懒,真不想去关心读者写者同步问题)
    LPC缺点:
    我可以很负责任的告诉你,目前为止我还没发现有缺点!
    于是乎,小弟写了这个代码,我在实现上尽可能模拟SOCKET,现在回头看当年写的代码,依然挫(看了看CHROME的代码,真觉得自己太挫了啦),大伙凑合看吧!
    一点说明,这个代码是用于工程项目中的一部分(这个工程项目就不公开了啦),但源码肯定可以单独使用,是松藕合的了啦!
    如果你有不错的建议和想法,愿意指点下小弟,可以联系我!

[招生]科锐逆向工程师培训46期预科班将于 2023年02月09日 正式开班

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (23)
雪    币: 201
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
swordzjj 活跃值 2011-12-20 22:37
2
0
写得挺好的,学习一下!
雪    币: 49
活跃值: 活跃值 (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
菜菜默 活跃值 2011-12-22 11:17
3
0
感谢! 正在苦恼 通信问题。
雪    币: 53
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
nomaster 活跃值 2011-12-22 12:18
4
0
额,好像很复杂的代码。。。
有没有简单的实例呀?
雪    币: 430
活跃值: 活跃值 (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ffceshi 活跃值 2011-12-22 12:22
5
0
不错,又多一种方法
雪    币: 285
活跃值: 活跃值 (34)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
飞心男孩 活跃值 2 2011-12-22 13:01
6
0
哇哦,不错哦!
雪    币: 677
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hezhang 活跃值 2011-12-22 15:25
7
0
学习了。   。。
雪    币: 8
活跃值: 活跃值 (62)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zuima 活跃值 2011-12-22 19:40
8
0
这几天正研究这东西呢,谢谢!
雪    币: 38
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
weinuan 活跃值 2011-12-23 21:10
9
0
写的不错. 多谢
雪    币: 2
活跃值: 活跃值 (63)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zgyknight 活跃值 2011-12-23 22:16
10
0
LPC相对于socket有什么优势?

LPC还有阻塞,socket可是完全支持异步的哦
雪    币: 200
活跃值: 活跃值 (77)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lsuper 活跃值 2011-12-24 13:53
11
0
阻塞模型结合线程写代码容易啊
雪    币: 83
活跃值: 活跃值 (27)
能力值: ( LV13,RANK:220 )
在线值:
发帖
回帖
粉丝
instruder 活跃值 4 2011-12-24 14:22
12
0
笑笑要开始搞精华了啊 顶
雪    币: 336
活跃值: 活跃值 (29)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
microdebug 活跃值 6 2011-12-28 14:28
13
0
进程通信与数据传递的需求,我一般就用命名管道做了;
不过LPC也挺好
雪    币: 336
活跃值: 活跃值 (29)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
microdebug 活跃值 6 2011-12-28 14:32
14
0
模块设计,如果能满足需求,那当然是越简单越好,哪里有为了防止逆向分析而故意把设计弄的负责的道理?
雪    币: 283
活跃值: 活跃值 (126)
能力值: ( LV12,RANK:236 )
在线值:
发帖
回帖
粉丝
nvtester 活跃值 5 2011-12-28 23:09
15
0
嗯,小弟表述不当,其实不是模块设计简单的问题了啦!
你的关点也没错,软件设计不是在于复杂,而是在于设计的可扩展性、健壮性、可维护性、可伸缩性!当然这是我对于好的设计的评价标准!一个好的设计就像一个优雅的建筑设计是一样的,是符合大众的审美观的!
设计归设计,防逆向归防逆向,首先小弟描述不当,再者设计与抗逆向也没因果关系,这两个都是小弟没表述好的!
这贴子主要是开源了啦!小弟愿意与各位探讨软件设计(OOD,重构),逆向分析,安全技术(攻与防),UI也行(不要说小弟好像什么都不懂,什么都不精,主要在于你怎么看,放大扩大那么你就是精一门,缩小细化你就变成懂几门了)!当然如果你愿意指点下的话,可以联系我!

name space ChinaPower
{

enum
{
FEMALE,
MALE
}Sex;

enum
{
UGLY;
NORMAL,
BEAUTY,
}

Class Topic
{
public:
   BeTalked();
}

Class People : public Topic
{
public:
   BeTalkd();
   Sex GetSex();
   Looks GetLooks();
private:
   Sex m_Sex;
   Looks m_Looks;
}

Class DesignTopic : public Topic
{
public:
   DesignTopic(Topic* pTopic)
   {
      m_pTopic = pTopic;
   }
   BeTalked()
   {
      m_pTopic->BeTalked();
      AboutOOD();
      AboutRefactor();
   }
   AboutOOD();
   AboutRefactor();
private:
   Topic *m_pTopic;
}   

Class ReversTopic : public Topic
{
public:
   ReversTopic(Topic *pTopic)
   {
      m_pTopic = pTopic;
   }
public:
   BeTalked()
   {
      m_pTopic->BeTalked();
      AboutFuckEncrypt();
      AboutFuckAsm();
   }
   AboutFuckEncrypt();
   AboutFuckAsm();
}

Class DefendAttackTopic : public Topic
{
public:
   DefendAttackTopic(Topic *pTopic)
   {
       m_pTopic = pTopic;
   }
public:
    BeTalked()
   {
       m_pTopic->BeTalked();
       AboutDefend();
       AboutAttack();
   }
    AboutDefend();
    AboutAttack();
}

Class UiTopic : public Topic
{
public:
    UiTopic(Topic *pTopic)
    {
       m_pTopic = pTopic;
    }

public:
    BeTalked()
    {
       m_pTopic->BeTalked();
       AboutCustomDraw();
       AboutDui();
    }
    AboutCustomDraw();
    AboutDui();
}

Class SiftOut;
{
public:
BOOL ChoosePeople(People* pPeople)
{
   swith (pPeople->GetSex())
   {
      case FEMALE:
           swith (pPeople->GetLooks())
           {
              case UGLY:
                   printf("Oh My GOD,算了不要交流了啦\n");
                   return FALSE;
              case NORMAL:
                   printf("Oh 可以接受了啦\n");
                   return TRUE;
              case BEAUTY:
                   printf("Oh太好了,美女交流下吧\n");
                   return VERY TURE;
           }
       case MALE:
            printf("哎是男人啊,交流看看是不是大牛\n");
            return TRUE;
           
   }

}
}
}

void Main()
{
     People stranger;
     SiftOut  Siftor;
     Topic *pTopic = NULL;
     if (Siftor.ChoosePeople(&stranger))
     {
           pTopic = new DesignTopic(new ReversTopic(new DefendAttackTopic((new UiTopic(&stranger)))));         
     }
     if (NULL != pTopic)
     {
          pTopic->BeTalked();
     }
}
雪    币: 2
活跃值: 活跃值 (63)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zgyknight 活跃值 2012-1-13 10:00
16
0
很感谢楼主能够开源把这么好的通信机制告诉大家~

但是楼主的这个代码有一点问题,那就是,见下图~

楼主将通讯端口封装为类的成员,那么在一对多的时候,当前的通讯端口在accept之后会被新的连接覆盖~~
上传的附件:
雪    币: 2
活跃值: 活跃值 (63)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zgyknight 活跃值 2012-1-13 15:17
17
0
我想了下,准备从以下两个方法中选择一个来使用楼主的开源代码(感谢万能的楼主):

1:将连接句柄从类的成员变量中分离,不再作为CXlpC的成员
   因为不分离的话,会导致共享内存区多线程/多进程同步的问题,而且请求/应答容易被干扰
   很容易出问题。
2:将封装的LPC方法从CXLPC中分离

******************************************************************

按照方法1试了下,不行,估计LPC只能单对单,在一次服务结束之前,不能接受下一个~这样的话,比socket就差远了……
雪    币: 283
活跃值: 活跃值 (126)
能力值: ( LV12,RANK:236 )
在线值:
发帖
回帖
粉丝
nvtester 活跃值 5 2012-1-13 21:32
18
0
当初看很多资料(主要是毛德操的那本Windows内核情景分析),提到是1对多,类似SOCKET,其实不然,是1对1的。我认为我这种封装是符合OO设计原则的。实现1对多,其实有变通的实现方法,你可以再写一个管理类,管理类里面vector存一下,这样可以看似成这个管理类,是在1对多服务,其实是1对1,一个Server一个Client。
对于Socket就看,你怎么看这个1对多了,你listen后,然后Accept后不是也创建了一个socket么,然后这个socket与client通信。
相对于那个listen的socket来讲,就是1对多。
相对于accept创建的socket来讲,就是1对1。
所以,LPC也可以模拟实现1对多通信,自己再增加一上管理类吧!
雪    币: 2
活跃值: 活跃值 (63)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zgyknight 活跃值 2012-1-13 21:45
19
0
牛哥的代码是无可挑剔的,万分感谢

但是后面的“相对于那个listen的socket来讲,就是1对多。”这个我试过,也不是一对多,也是一对一的。

当再次listen监听端口的时候,已经创建好的服务线程和客户端线程的通信就会挂起

所以,“相对于那个listen的socket来讲,就是1对多。”是错的。

按照你文档里面的术语:服务端的LPC线程、服务线程与客户端线程是1:1:1的。

如果这样的话,LPC比双向通信的命名管道要复杂的多,但是功能一样,可能速度占优。

------------------------------------------------------------------------------------------------
我倒,看的仓促了,误解了大牛的意思了。。。。原来这句是说socket的
雪    币: 27
活跃值: 活跃值 (1071)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
sungy 活跃值 1 2012-1-14 03:27
20
0
学习中没有发言权,希望高手们能开源一个能承受高强并发的C/S通信源码
雪    币: 1267
活跃值: 活跃值 (11)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
suiyu 活跃值 2012-1-14 10:13
21
0
进程间通信,我也一般用命名管道了,数据量小的话,可能直接就用WM_Copy消息来整了,呵呵学习一下楼主的!
雪    币: 104
活跃值: 活跃值 (169)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
eGirlAsm 活跃值 2012-1-15 11:44
22
0
好东西啊,正需要进程间通讯的东西
雪    币: 134
活跃值: 活跃值 (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
crystalxp 活跃值 2020-5-24 11:16
23
0
非常好的学习资料。感谢。
雪    币: 58
活跃值: 活跃值 (198)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
hhstudy 活跃值 1 2020-12-18 18:17
24
0
Mark
游客
登录 | 注册 方可回帖
返回