【数字签名】在软件&系统安全领域的应用

这两年随着计算机信息安全问题越来越受关注,软件的数字签名(代码签名)技术也开始被大家所认识,在安全领域相关的应用也越来越多…

微软&数字签名

防篡改

  • Windows 文件保护

      作为操作系统厂商,微软很早就12^2^将软件 H~2~O的数字签名技术应用于其发布的Windows操作系统中,用来防止系统文件被恶意修改

Read More

Windows 与 Linux/Unix 的GCC交叉编译

昨天经过一通宵终于搞定了Windows 与 Linux/Unix 的GCC交叉编译,把去年手上的一个UDP文件广播的代码成功在Windows 与linux 和 Unix上编译成功, 主要是Windows上比较难,不过还是经过几种环境的搭配/测试,在早上终于成功了!

Windows上测试有

cygwin : 没有成功,经过Make文件的反复调整(因为也是才从Delphi转C ,又是从Win 转 Linux 所以一些东西都比较陌生.)也编译通过,只是无法摆脱cygwin1.dll的支持,在GCC 上用 -mno-cygwin 选项编译就不通过了(经过后面的测试,还是./configure文件配置问题)

mingw: 因为无法./configure,所以也行不通

mingw+msys:一次OK!

Linux有 PuppyLinux

Unix有 NetBSD

这两个都是一次成功


后记:

现在WIN平台也有不少GCC编译环境的IDE,如Dev c++ ,他们都是通过mingw 环境支持的GCC

现在也开始玩玩C/C++ 以后要向 Delphi与C 互补的方向发展!

学习C的过程中发现,会Delphi再学C也不是什么难事!主要是编程思想!

都说C的精华是指针,确实,指针在C里可以说是体现得淋漓尽致!虽说Delphi里操作指针也是很方便,可是与C比起来就是小巫见大巫, 不过C在代码的可读性和结构规范上没D好/死,这也许就是Delphi编译器是编译速度最快的编译器的原因,对C来说也是它的优点:灵活!强大!

在我看来指针对编程来说是非常重要的,不过java c# 这样的框架编程上面我就不知道了

本来准备玩学习下MFC,现在发现这样就会失去我要学C的意义,还是D的VCL+C的DLL比较好..


附上:对于UDP组播的一些认识

对于UDP组播的一些认识
利用UDP组播能在intarnet,internet上也数据报的形式进行数据的组播(在internet上进行组播,要求路由器支持IGMP(internet网关管理协议,这个协议是在IP出现以后,为了支持组播而出现的)).相对于极度消耗网络带宽的广播来说(广播只能在intranet内广播),UDP组播有了很大的优化,只有终端加入到了一个广播组,UDP组播的数据才能被他接受到.
UDP组播是采用的无连接,数据报的连接方式,所以是不可靠的.也就是数据能不能到达接受端和数据到达的顺序都是不能保证的.但是由于UDP不用保证数据的可靠性,所有数据的传送速度是很快的.
组播的“根”
组播从概念上来讲分为两部分:控制部分和数据部分。控制部分决定着组播的对象的**方式。而数据部分决定了数据的传输方式。
控制层有“有根”,“无根”两种情况。对于有根的控制层,存在着一个root和若干个leaf. root负责管理这个组播组,只有他能邀请一个leaf加入一个组播组(ATM就是有根控制的一个典型的例子)。对于无根的控制层,没有root,只有若干的leaf. 每一个leaf都能自己加入一个组播组(IP就是无根控制的典型例子)
数据层也有“有根”,“无根”两种情况。对于有根数据层,从root发出的数据能到达每一个leaf,而从leaf发出的数据只能到达root.对于无根数据层,每一个leaf发出的数据能到达组播组中的每一个leaf(甚至包括他自己)。每一个leaf也能接受组播组里的任何数据包。

二.IP组播地址
IP组播通信需要一个特殊的组播地址.IP组播地址是一组D类IP地址,范围从224.0.0.0 到 239.255.255.255。其中还有很多地址是为特殊的目的保留的。224.0.0.0到224.0.0.255的地址最好不要用,因为他们大多是为了特殊的目的保持的(比如IGMP协议)
三.IGMP协议
IGMP(internet网关管理协议)是IP组播的基础.在IP协议出现以后,为了加入对组播的支持,IGMP产生了。IGMP所做的实际上就是告诉路由器,在这个路由器所在的子网内有人对发送到某一个组播组的数据感兴趣,这样当这个组播组的数据到达后面,路由器就不会抛弃它,而是把他转送给所有感兴趣的客户。假如不同子网内的A,B要进行组播通信,那么,位与A,B之间的所有路由器必须都要支持IGMP协议,否则A,B之间不能进行通信。
当一个应用加入一个组播组后,就会向这个子网的所有路由器发送一个IGMP加入命令,告诉他子网内有人对发送到某一个组播组的数据感兴趣.路由器也会定时向子网内的所有终端发送一条查询消息,用于询问是否还有人对某个组播组的数据感兴趣。如果有的话,终端就会回应一条IGMP消息,路由器则继续转发这个组播组的数据。如果没有人回应这条消息,那么路由器就认为已经没有终端对这个组播组的数据感兴趣,就不会在转发关于这个组播组的数据了。在IGMP第二版中,一个终端推出组播组以后,会向路由器发送一个推出消息,路由器也会通过这个消息来判断是否还要继续转发关于这个组播组的数据了(IGMP第一版中没有这个功能)[这些事情都是底层的系统做的,你只要坐享其成就好了]

四. winsock 1组播
winsock 1的组播主要有以下几个步骤:
建立支持数据报的scoket
把socket和本地的一个端口绑定(以后会通过这个端口进行数据的收发)
通过setsockopt IP_ADD_MEMBERSHIP加入一个组播组
然后就能通过sendto / recvfrom进行数据的收法
通过 setsockopt IP_DROP_MEMBERSHIP离开一个组播组
关闭socket
如果你仅仅是想向一个组播组发送数据,而不要接受数据,那么可不用加入组播组,而直接通过sendto向组播组发送数据

五.winsock 2组播
winsock 2组播主要是通过WSAJoinLeaf来实现的(WSAJoinLeaf的行为,返回值根据socket的模式,组播的实现构架有很大的关系)
winsock 2组播的主要有以下几个步骤
建立支持数据报的socket(用WSASocket建立socket,同时设置组播的一些属性)
把socket和本地的一个端口绑定(以后会通过这个端口进行数据的收发)
通过WSAJoinLeaf加入一个组播组
通过sendto / recvfrom进行数据的收发
直接关闭socket,退出组播组

忙碌的一个月

这个月一直在忙“网络管理”软件的开发,天天都写到很晚…现在基本上完成了。
可销售上又得忙了…又是一大难题啊!哎,真想快点销出去,哈哈就可以买Seba了.
但现在又不得不停下所有事情,准备参加每一年省里的网络比赛,去年只搞了个第二,没能参加全国的比赛,
这次一定要第一,所以现在开始就要抓紧时间了,没几天了…

加油!

2008-6-18 第一是拿到了,可没听说全国比赛了.郁闷!不过,也比较开心啦!

Delphi捕获U盘插入或者拔出

在USB端口被热插后,系统会向所有程序发布WM_DEVICECHANGE消息,所以只要捕获此消息即可实现对U盘的监视。
1、新建工程;
2、在form1上放一个Label;
3、定义一个私有过程 procedure WMDeviceChange(var Msg: TMessage); message WM_DEVICECHANGE;

完整代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
unit U;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, AppEvnts, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
private
{ Private declarations }
procedure WMDeviceChange(var Msg: TMessage); message WM_DEVICECHANGE;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.WMDeviceChange(var Msg:TMessage);
var
myMsg : String;
begin
Case Msg.WParam of
32768:begin
myMsg :='U盘插入';
Label1.Caption:=myMsg
end;
32772:begin
myMsg :='U盘拔出';
Label1.Caption:=myMsg;
end;
end;
end;
end.

Bat局域网聊天室--用批处理编的

今天天没事做,玩玩BAT就想起了编这个… 完善中…….
用一台 host 做服务器共享一个文件夹如: server

  1. 在客户机 A 和 B 上 打开user.bat 输入 共享文件夹地址,如: \\fileserver\chatroom
  2. 输入昵称
  3. 输入要聊天、或留言的对象(对方昵称)
  4. 聊天、留言、查看在线用户等操作

原理 是通过共享文件夹的文件操作(列出、读写)通过BAT有限的编程能力(这也是有趣的地方)来完成信息交换

user.bat

1
2
3
4
5
6
7
8
9
title 局域网聊天室--主页 https://yryz.net
color 2f
@mode con lines=20 cols=80
@echo off
echo.&echo.
:server
set server=
set /p server=请输入服务地址:
call server.bat

server.bat

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
dir %server%
cls
echo.
if ERRORLEVEL 1 call user.bat
if "%server%"=="" call user.bat
:n
echo.&echo.
set n=
set /p n= 请输入昵称:
if "%n%"=="" goto n
title 当前用户:%n%
:l
rem 按扩列出文件
echo.
echo ──────────────────────────────────────
echo 当前用户:
echo.
dir %server%\*.info>%server%\list.list
findstr ".info" %server%\list.list >%server%\list.bak
if errorlevel 1 cls&echo 当前没有用户在线,留言请输入对方昵称
for /f "tokens=4 delims=. " %%i in (%server%\list.bak) do @echo %%i
echo ──────────────────────────────────────
pause
IF EXIST %server%\%n%.user (echo 您有新留言,请按 1 进行查收,按其它键稍后再看&echo.&set /p w=请选择:) ELSE goto u
if "%w%"=="1" goto s
:u
echo ──────────────────────────────────────
set u=
set /p u= 输入聊天对象:
if "%u%"=="" goto u
title %n% 与 %u% 聊天中...
echo 用户:%n%>%server%\%n%.info
echo 计算机名:%COMPUTERNAME%>>%server%\%n%.info
cls
:a
echo ──────────────────────────────────────
echo.&echo.
set a=
set /p a= 请输入聊天内容:
if "%a%"=="" goto a
echo.
IF EXIST %server%\%u%.info (echo %n% %date% %time% > %server%\%u%.user) ELSE echo %n%于%date% %time%留言: >> %server%\%u%.user
echo %a% >>%server%\%u%.user
echo ────────────────────────────────────── >>%server%\%u%.user
rem 这里是存储聊天记录
echo %date% %time% >>%server%\bak.bak
echo. >>%server%\bak.bak
echo %n%对%u%说: >>%server%\bak.bak
echo %a% >>%server%\bak.bak
echo ─────────────────── >>%server%\bak.bak
cls
echo.
:s
echo 对方:
echo ──────────────────────────────────────
type %server%\%n%.user
if ERRORLEVEL 1 cls&echo 暂无留言
echo ──────────────────────────────────────
echo 1.刷新 2.回复 3.用户列表 4.查看聊天记录 5.查看对方信息 6.下线
echo ──────────────────────────────────────
echo.
set s=
set /p s= 请选择:
if "%s%"=="1" goto s
if "%s%"=="2" goto a
if "%s%"=="3" goto l
if "%s%"=="4" goto j
if "%s%"=="5" goto info
if "%s%"=="6" goto exit
goto s
:j
cls
echo.
type %server%\bak.bak
echo ──────────────────────────────────────
pause
goto s
cls
:info
cls
type %server%\%u%.info
if ERRORLEVEL 1 cls&echo 对方不在线
echo.
echo ──────────────────────────────────────
pause
goto s
cls
:exit
del /f/q %server%\%n%.info
del /f/q %server%\%n%.user
exit