从技术向生活转型,敬请各位期待。

歪酷博客

亲爱的 @ 2007-12-29 11:47

Visual Studio 2005 產品概觀

功能 Express 產品 Visual Studio Standard Edition Visual Studio Professional Edition Visual Studio Tools For Office Visual Studio Team System
IntelliSense
Code editor
Code snippets
Programming languages included VB, VC#, VC++, and VJ# are single language. Visual Web Developer includes VC# and VB 所有 所有 VB and VC# 所有
Office development support Support for Excel 2003, Word 2003, InfoPath 2003 and Outlook 2003 Support for Excel 2003, Word 2003, InfoPath 2003 and Outlook 2003
User experience Simplified menu options and defaults Simplified menu options and defaults Full Full Full
Windows Forms designer VB, VC#, VC++, VJ#
Web Forms designer Visual Web Developer
Mobile Device Support
Database design tools (create/modify tables and stored procedures) Local Local and remote Local and remote Local and remote Local and remote
Data Access Designers VB, VC#, VC++, VJ#:local, Visual Web Developer: local and remote Local and remote Local and remote Local and remote Local and remote
Documentation 10mb "Getting Started"; Starter Kits targed at first-time programmers; 200mb optional MSDN Express MSDN MSDN MSDN MSDN
Class Designer / Object Test Bench
XML Editor Support VB, VC#, VC++, VJ#:XML only, Visual Web Developer: basic XSLT support Full XML/XSLT Full XML/XSLT Full XML/XSLT Full XML/XSLT
Deployment Tools ClickOnce Click Once
Extensibility Add external tools to the menu only. Use 3rd party controls. Consume extensions 所有 所有 所有
Reporting Visual Web Developer: SQL Server Reporting Services Add-in SQL Server Reporting Services SQL Server Reporting Services / Crystal Reports SQL Server Reporting Services SQL Server Reporting Services / Crystal Reports
Source Code Control MSSCCI-compatible (Visual SourceSafe sold separately) MSSCCI-compatible (Visual SourceSafe sold separately) MSSCCI-compatible (Visual SourceSafe sold separately) MSCCI-compatible (includes Visual SourceSafe, Visual Studio Team Foundation Server sold separately)
Debugging Local Local Local / remote Local Local / remote
64-bit Compiler Support (Itanium)
64-bit Compiler Support (x64)
Server explorer “Servers” Node 所有 所有 所有
SQL Server 2005 Integration
Code Profiling
Static Analysis
Unit Testing
Code Coverage
Project Management
Test Case Management
Size 80mb (Express + SQL Express + .NET Framework Redist) Single CD Multiple CDs Multiple CDs Multiple CDs
Additional Tools Included SQL Server 2005 Express Edition SQL Server 2005 Express Edition SQL Server 2005 Developer Edition SQL Server 2005 Developer Edition; Microsoft Office Access 2003 Developer Extensions; Access 2003 Runtime license SQL Server 2005 Developer Edition (included with client products only)
功能 Express 產品 Visual Studio Standard Edition Visual Studio Professional Edition Visual Studio Tools For Office Visual Studio Team System

²        Visual Studio 2005 产品列表

l         A:Visual Studio Express Products

      (a):Visual Web Developer 2005 Express Edition

      (b):Visual Basic 2005 Express Edition

      (c):Visual C# 2005 Express Edition

      (d):Visual J# 2005 Express Edition

      (e):Visual C++ 2005 Express Edition

 

l         B:Visual Studio Standard Edition

       Intellisense, Code Editor, Code Snippets, All .NET lanaguages, Simplified Menu, Mobile Device Support, Local and Remote Database Design Tools, Class Designer/Object Test Bench, Local Debugging, SQL 2005 Express, MSDN

l         C:Visual Studio Professional Edition

      Evertthing included in the Standard Edition PLUS Full Menu, Remote Debugging, Additional Deployment, Reporting & Extensibility Capabilities, SQL 2005 Intergration & SQL 2005 Developer Edition   

l         D:Visual Studio Tools for Office

      Most of the features in Professional Edition PLUS support for Excel 2003, Word 2003, Infopath 2003 & Outlook 2003,(Some of the Professional Edition features are NOT included)

l         E:Visual Studio Team System

      All four editions of Visual Studio Team System with premium MSDN subscription include VS Professional, VS Tools For office, Visual Source Safe, Visio & UML modeling, Team Foundation Client & advance Debugging, Design & Collaboration capabilities

(a):Visual Studio Team Edition for Architect

   Application Designer, Logical Infrasturcture Designer and Deployment Designer

(b):Visual Studio Team Edition for Developers

   Unit Testing, Code Coverage, Static Code Analyzer, Dynamic Code Analyzer and Code Profiler

(c):Visual Studio Team Edition for Testers

   Unit Testing, Code Coverage, Load/Web Testing, Test Case Management and other Quality Assurance capabilities

(d):Visual Studio Team Suite

   Everything that is invluded in the Architect, Developer and Tester Editions

l         F:Visual Studio Team Foundation Server:

   Workgroup edition of the server, which is limited to five connections is included with all four team editions, The Team Foundation Server includes Team Portal, Team Reporting, Team Build, Project Management and Integration features, Work Item Tracking and other capabilities for collaboration & reporting

 

 

其它要说明的问题:

1.             MSDN Premium subscriptions 5个等级,Team Suite, Software Architects ,Software Developers,Software Testers ,Professional Developers

2.             Visual Studio 2005 Team Foundation Server 需要有单独的License ,和微软其他服务器产品的模式一致,这意味着每个安装需要一个服务器的License,另外每个存取/访问Team Foundation Server的客户端也需要一个CAL(Client Access License),而且Visual Studio 2005 Team Foundation Server包含一个SQL Server 2005标准版的License。还涉及Visual Studio 2005 Team Foundation Server Office SystemWindows Server 2003Windows SharePoint ServicesLicense

3.             Visual Studio 2005 Team Suite 也依然是一个Team Foundation Server 的客户端,并不包含Team Foundation Server ,但包含一个访问Team Foundation Server CAL,另一方面说它功能最全,是指它覆盖了Team Edition for Software Architects, Team Edition for Software Developers, Team Edition for Software Testers 三个版本的所有功能。

4.             Visual Studio 2005 Team Foundation Server还有一个 Workgroup Edition 版本,这个包含在Visual Studio 2005Team Suite,Team Edition for Software Architects, Team Edition for Software Developers, Team Edition for Software Testers 版本中,而且功能和Team Foundation Server 同样,但是它功能受限,只能包含5个帐号。License上,它不需要一个Team Foundation ServerLicense,但需要一个MSDN Premium 订阅的License,使用上则遵从MSDN Premium 订阅的License

5.             Visual Studio Standard Edition Visual Studio Professional Edition 你可以认为它是传统意义上的Visual Stuido 2005,也就是Visual Studio 2005 Team System没有出现前的Visual Studio比较相似的版本,和Visual Studio 2005 Team 客户端系列(Team Suite,Team Edition for Software Architects, Team Edition for Software Developers, Team Edition for Software Testers)的版本相比,这两个工具没有Itanium 64的编译支持,只有x64的编译能力,另外最大的缺陷是这两个版本不能连接Visual Studio 2005 Team Foundation Server,而且没有Visual Studio 2005 Team 客户端系列所有的Code Profiling,Static Analysis,Code Coverage,Test Case Management等功能,只能连接Visual SourceSafe 的源代码服务器。简单的说,如果你的工作和Visual Studio 2005 Team System没有什么关系,那么你可以考虑使用Visual Studio Standard/Professional 版本。

6.             微软MSDN各版本比较:

     http://msdn.microsoft.com/vstudio/products/subscriptions/chart

7.             Visual Studio 2005 各版本比较

     http://msdn.microsoft.com/vstudio/products/compare/default.aspx

8.             Visual Studio Team Suite Edition 各版本比较

     http://msdn.microsoft.com/vstudio/products/vsts/compare/default.aspx



 
亲爱的 @ 2007-10-31 11:55

引 言:
编写高效简洁的C语言代码,是许多软件工程师追求的目标。本文就工作中的一些体会和经验做相关的阐述,不对的地方请各位指教。
1招:以空间换时间
  计算机程序中最大的矛盾是空间和时间的矛盾,那么,从这个角度出发逆向思维来考虑程序的效率问题,我们就有了解决问题的第1招——以空间换时间。
例如:字符串的赋值。
方法A(通常的办法):
#define LEN 32
char string1 [LEN];
memset (string1,0,LEN);
strcpy (string1,This is a example!!”);
方法B:
const char string2[LEN] =“This is a example!”;
char * cp;
cp = string2 ;
(使用的时候可以直接用指针来操作。)
  从上面的例子可以看出,A和B的效率是不能比的。在同样的存储空间下,B直接使用指针就可以操作了,而A需要调用两个字符函数才能完成。B的缺点在于灵活性没有A好。在需要频繁更改一个字符串内容的时候,A具有更好的灵活性;如果采用方法B,则需要预存许多字符串,虽然占用了大量的内存,但是获得了程序执行的高效率。
  如果系统的实时性要求很高,内存还有一些,那我推荐你使用该招数。
  该招数的变招——使用宏函数而不是函数。举例如下:
方法C:
#define bwMCDR2_ADDRESS 4
#define bsMCDR2_ADDRESS 17
int BIT_MASK(int __bf)
{
return ((1U << (bw ## __bf)) - 1) << (bs ## __bf);
}
void SET_BITS(int __dst, int __bf, int __val)
{
__dst = ((__dst) & ~(BIT_MASK(__bf))) | \
(((__val) << (bs ## __bf)) & (BIT_MASK(__bf))))
}
SET_BITS(MCDR2, MCDR2_ADDRESS, RegisterNumber);
方法D:
#define bwMCDR2_ADDRESS 4
#define bsMCDR2_ADDRESS 17
#define bmMCDR2_ADDRESS BIT_MASK(MCDR2_ADDRESS)
#define BIT_MASK(__bf) (((1U << (bw ## __bf)) - 1) << (bs ## __bf))
#define SET_BITS(__dst, __bf, __val) \
((__dst) = ((__dst) & ~(BIT_MASK(__bf))) | \
(((__val) << (bs ## __bf)) & (BIT_MASK(__bf))))
SET_BITS(MCDR2, MCDR2_ADDRESS, RegisterNumber);
  函数和宏函数的区别就在于,宏函数占用了大量的空间,而函数占用了时间。大家要知道的是,函数调用是要使用系统的栈来保存数据的,如果编译器里有栈检查选项,一般在函数的头会嵌入一些汇编语句对当前栈进行检查;同时,CPU也要在函数调用时保存和恢复当前的现场,进行压栈和弹栈操作,所以,函数调用需要一些CPU时间。而宏函数不存在这个问题。宏函数仅仅作为预先写好的代码嵌入到当前程序,不会产生函数调用,所以仅仅是占用了空间,在频繁调用同一个宏函数的时候,该现象尤其突出。
D方法是我看到的最好的置位操作函数,是ARM公司源码的一部分,在短短的三行内实现了很多功能,几乎涵盖了所有的位操作功能。C方法是其变体,其中滋味还需大家仔细体会。
2招:数学方法解决问题
  现在我们演绎高效C语言编写的第二招——采用数学方法来解决问题。
  数学是计算机之母,没有数学的依据和基础,就没有计算机的发展,所以在编写程序的时候,采用一些数学方法会对程序的执行效率有数量级的提高。
举例如下,求 1~100的和。
方法E
int I , j;
for (I = 1 ;I<=100; I
{
j = I;
}
方法F
int I;
I = (100 * (1 100)) / 2
这个例子是我印象最深的一个数学用例,是我的计算机启蒙老师考我的。当时我只有小学三年级,可惜我当时不知道用公式 N×(N 1)/ 2 来解决这个问题。方法E循环了100次才解决问题,也就是说最少用了100个赋值,100个判断,200个加法(I和j);而方法F仅仅用了1个加法,1 次乘法,1次除法。效果自然不言而喻。所以,现在在编程序的时候,更多的是动脑筋找规律,最大限度地发挥数学的威力来提高程序运行的效率。
3招:使用位操作
  实现高效的C语言编写的第三招——使用位操作,减少除法和取模的运算。
  在计算机程序中,数据的位是可以操作的最小数据单位,理论上可以用“位运算”来完成所有的运算和操作。一般的位操作是用来控制硬件的,或者做数据变换使用,但是,灵活的位操作可以有效地提高程序运行的效率。举例如下:
方法G
int I,J;
I = 257 /8;
J = 456 % 32;
方法H
int I,J;
I = 257 >>3;
J = 456 - (456 >> 4 << 4);
  在字面上好像H比G麻烦了好多,但是,仔细查看产生的汇编代码就会明白,方法G调用了基本的取模函数和除法函数,既有函数调用,还有很多汇编代码和寄存器参与运算;而方法H则仅仅是几句相关的汇编,代码更简洁,效率更高。当然,由于编译器的不同,可能效率的差距不大,但是,以我目前遇到的MS C ,ARM C 来看,效率的差距还是不小。相关汇编代码就不在这里列举了。
运用这招需要注意的是,因为CPU的不同而产生的问题。比如说,在PC上用这招编写的程序,并在PC上调试通过,在移植到一个16位机平台上的时候,可能会产生代码隐患。所以只有在一定技术进阶的基础下才可以使用这招。
4招:汇编嵌入
  高效C语言编程的必杀技,第四招——嵌入汇编。
  “在熟悉汇编语言的人眼里,C语言编写的程序都是垃圾”。这种说法虽然偏激了一些,但是却有它的道理。汇编语言是效率最高的计算机语言,但是,不可能靠着它来写一个操作系统吧?所以,为了获得程序的高效率,我们只好采用变通的方法 ——嵌入汇编,混合编程。
  举例如下,将数组一赋值给数组二,要求每一字节都相符。
char string1[1024],string2[1024];
方法I
int I;
for (I =0 ;I<1024;I )
*(string2 I) = *(string1 I)
方法J
#ifdef _PC_
int I;
for (I =0 ;I<1024;I )
*(string2 I) = *(string1 I);
#else
#ifdef _ARM_
__asm
{
MOV R0,string1
MOV R1,string2
MOV R2,#0
loop:
LDMIA R0!, [R3-R11]
STMIA R1!, [R3-R11]
ADD R2,R2,#8
CMP R2, #400
BNE loop
}
#endif
  方法I是最常见的方法,使用了1024次循环;方法J则根据平台不同做了区分,在ARM平台下,用嵌入汇编仅用128次循环就完成了同样的操作。这里有朋友会说,为什么不用标准的内存拷贝函数呢?这是因为在源数据里可能含有数据为0的字节,这样的话,标准库函数会提前结束而不会完成我们要求的操作。这个例程典型应用于LCD数据的拷贝过程。根据不同的CPU,熟练使用相应的嵌入汇编,可以大大提高程序执行的效率。
  虽然是必杀技,但是如果轻易使用会付出惨重的代价。这是因为,使用了嵌入汇编,便限制了程序的可移植性,使程序在不同平台移植的过程中,卧虎藏龙,险象环生!同时该招数也与现代软件工程的思想相违背,只有在迫不得已的情况下才可以采用。切记,切记。
  在此以本文抛砖引玉,还请各位高手共同切磋。希望各位能给出更好的方法,大家一起提高我们的编程技巧。


 
亲爱的 @ 2007-05-19 09:09

cFosSpeed - problems with pings

Once activated, cFosSpeed will be sending ping packets to the Internet to measure how "congested" the connection is. Without these packets, cFosSpeed Traffic Shaping won't work.

cFosSpeed will only send pings if you are up or downloading at a certain minimum rate. Therefore, the easiest way to confirm that pings are actually getting through is to start an upload that will take at least 30 seconds (e.g., by sending yourself a large e-mail message). Then, check and see if the message balloon appears (see below).

Should there be no response to these pings for an extended period of time, cFosSpeed will indicate this by displaying a balloon. You should then proceed as follows:

1. Do you have a firewall?

Hint:
If the ping problems remain while
the firewall is deactivated,
please uninstall your firewall and try again.

Check if you have a firewall running on your system. If so, make sure the SPD.EXE program (cFosSpeed service) is allowed to send and receive ICMP data. Also note that CFOSSPEED.EXE does not access the Internet.

Important!
When the configuration of your firewall for ICMP data avoids that answers to the cFosSpeed measure pings are allowed, cFos Traffic Shaping will not work. You can check this with a simple tracert command.

2. Enter tracert command

Click Start -> Programs -> cFosSpeed -> Open console, and type in "tracert www.cfos.de". If everything checks out, it should return something like this:

Tracing route to www.cfos.de [194.95.249.23] over a maximum of 30 hops:
	
1    56 ms    56 ms    55 ms  217.0.116.148
2    55 ms    54 ms    54 ms  217.0.74.50
3    54 ms    53 ms    55 ms  k-ea1.K.DE.net.DTAG.DE [62.154.55.154]
4    61 ms    62 ms    61 ms  h-eb1.H.DE.net.DTAG.DE [62.154.49.166]
etc.
	
What is absolutely crucial here is that there are time values (and not asterisks) displayed in columns 2 through 4..

If that's the case, skip to step 4 below.

However, pings are being blocked if the output reads as follows:

Tracing route to www.cfos.de [194.95.249.23] over a maximum of 30 hops:

  1     *        *        *     Request timed out.
  2     *        *        *     Request timed out.
  3     *        *        *     Request timed out.
  4     *        *        *     Request timed out.
  
etc.
		

In this case, continue on with step 3 .

3. Tracert does not work

Tracert does not seem to be working on your system. If you do not use a firewall or you use one that does let pings of SPD.EXE through, pings and incoming replies are likely being blocked by another component.

If you are using a router, it must also be set to allow pings to pass through. Configure your router so that cFosSpeed can send outgoing pings (ICMP echo requests - type 8) and receive ping replies (ICMP echo reply - type 0) in addition to time-outs (or ICMP TTL/time exceeded - type 11). You may have to restart your router for these changes to take effect.

Now repeat step 2 above, using the "tracert www.cfos.de" command. Should there still be no pings coming through, chances are your Internet provider may be filtering such data out. In this case, you should contact your provider..

Last possibilty: Disable your firewall and try again. If this still doesn't help, deinstall your firewall and try again.

4. Tracert is working

Tracert is working, but the message balloon still appears: Please check again if your firewall software isn't blocking the pings from SPD.EXE after all.

If, during an upload running at maximum speed (or close to it), cFosSpeed is at any time displaying ping times on the status window, pings are not being filtered by your system but are lost somewhere in the Internet instead. The reliability of ping data can vary widely among different Internet providers. It may also be affected by other factors such as network load, over which cFosSpeed has naturally no control.

If Tracert is working but ping time values never appear on the status window, please send us an e-mail and attach copies of TRACE.TXT and TRACE_OLD.TXT from your cFosSpeed directory. Please make sure to send us these files shortly after the problem has occurred so that they contain all data necessary for closer analysis.

Notes on some specific firewalls or routers

Sygate Personal Firewall:

Under "options," go to the "security" tab and deactivate "DoS detection." This is necessary because otherwise the firewall will wrongly classify the cFosSpeed calibration process as a DoS attack.

Users have also reported that the "Anti-IP Manipulation" must be turned off for cFosSpeed to run without problems.

Agnitum Outpost Firewall:

Here, users have reported that in the ICMP settings you have to check the "Echo reply - outgoing" box, so the firewall doesn't block outgoing replies.

Orange Livebox:

Settings for the Orange livebox with built in Inventel router to allow cFosSpeed pings.

Kaspersky Anti-Hacker:

You can set special rules for each aplication. In this case for SPD.EXE (cFosSpeed service). This allows the cFos communication. Further you can disable that Anti Hacker detects "DoS" attacks, to avoid false Anti-Hacker actions.

You should also activate the option "Allow outgoing ICMP pakets with ICMP-Code: Echo Reply".

The ICMP Settings should be:

  • ICMP Type 0 (Echo Reply) incoming : allow
  • ICMP Type 8 (Echo) outgoing : allow
  • ICMP Type 11 (Time Exceeded) incoming : allow
  • Other ICMP Types incoming and outgoing : allow

 

Draytek Router:

Some users have reported that the option "Ip Filter/Firewall Setup - DoS defense" has to be switched off cause otherwise the router filters cFosSpeed PING Pakets.

Linksys wag54g router:

Some users have reported that the option ""Block Anonymous Internet Requests" has to be switched off cause otherwise the router blocks ICMP answers.

Retrieving and interpreting cFosSpeed's ping stats

Open the cFosSpeed console and type in "spd pingstat".

This should yield an output similar to the one below:

Ping statistics:

Total ping requests      107,686        
  done                   107,686     (1)
  ...and only            107,686        
                                        
Total pings sent         106,949        
  strong                 106,778        
  ...and new             106,778     (2)
                                        
Total pongs              106,804        
  found                  106,566        
  ...and strong          106,519        
  ...and strong reply    106,519     (3)
  ...and used            106,519     (4)

Ping outage statistics:
  1 ping in a row 33 times
  5 pings in a row 1 time

Ping src/dst: 192.168.0.100 to 194.95.249.23, ttl 3
Ethernet src/dst: 00:0e:a6:57:9b:0b to 00:11:95:78:27:a4

The three values given for "total ping requests" should be identical. In case there is any great deviation among these, please report it to us.

The value marked (1) should be approximately the same as the one next to (2) . If that is not the case, it is typically strong evidence for a firewall blocking data transmission. As above, a small deviation of several percent isn't dramatic, though.

Values for (3) and (4) should likewise be about the same. If not, do send us a mail.

By the same token, values (2) and (3) should be roughly identical. If this is not so, this usually indicates pings and their replies get lost somewhere "in the Net" (which happens quite a lot). Unfortunately, there is nothing we can do about that.

When writing us an e-mail, please refer to step 4 above regarding what files to attach to your message.



 
亲爱的 @ 2007-05-16 16:27

1.可以人为配置的多个TCP连接,来发送和接受消息。系统初启时,自动地启动指定个数的连接。运行过程中,任意一个连接崩溃时,自动恢复。
    2.类似心跳消息的长连接维持机制,为每个连接,在最后一个消息的处理结束前,重新启动一个60秒的定时器。如果期间有消息来往,停止定时器,处理完消息后,继续启动定时器。如果60秒超时,重新启动定时器,连续三次超时,关闭这个链接,重新启动建立过程。
   3.超时重发和差错重传。超时重发的原理是发送每个MT消息后,启动一个60秒的定时器,等待网关返回应答。如果超时,继续发送,连续3次都超时都没有应答,关闭连接,启动链路恢复过程。并将这条消息保存到回收队列中,千万别抛弃。差错重传是接受到错误的应答,并且这个错误是由对等通信双方的协议层产生的,那么重新发送这条消息。
    4.滑动窗口机制。可以实现流量控制和有效的负载均衡。滑动窗口大小为16条消息。采用异步方式,一次最多发送16条消息,并等待应答。准确的说,CMPP协议中定义的滑动窗口概念不准确,应该叫缩放窗口。因为它并没有实现序列控制问题,只是起到流量控制和异步高效快速发送的目的。相对于Stop-Wait机制来说的。
    5.重复丢弃机制。如果接受到的MO消息是一条重复的,就丢弃这条消息,不能将这条MO消息交给上层。如何判断是重复的呢?通过每条消息的序列号。当然如果网关不维持这个序列号的唯一性和有序性,你只能干瞪眼。
    6.上接口缓存和回收队列。从上层接受短消息,保存到缓存里,这个缓存不要做的太大,超过一定量时,让上层发送短消息接口阻塞。而将缓存技术单独用一个模块来实现。回收队列是储存每个链路崩溃时,处于滑动窗口中等待应答的消息。
    7.有序控制机制。是保障先来的消息,先发送出去,后来的后发,严格地保障先后顺序。是通过序列号和滑动窗口来保障的。实际应用中,倒是不那么严格地关注顺序发送问题。


 
亲爱的 @ 2007-05-16 09:02

Author:   TOo2y   [原创]  
  E-mail:   TOo2y@safechina.net  
  Homepage:   www.safechina.net  
  Date:   11-27-2002  
   
  作者注:  
          谨以此文纪念在“11.27”惨案中殉难的红岩烈士们!  
   
  一>   前言  
          中国黑客(worm.runouce)病毒在国内出现以后,各大反病毒公司都对其进行了“仔细”的分析,得出一个结论:“中国黑客”发现了全球首创的“三线程”结构。这是金*公司对外的宣传词,我个人对病毒没什么研究,并且我对worm.runouce没有任何的个人看法,不过我可以确信的是很多反病毒公司往往在夸大事实,目的只有一个:让更多的用户觉得某某病毒很可怕,让更多的用户相信只有某某公司的杀毒软件才可以彻底将病毒清除掉。其实三线程并没有好高深的技术,不过ideal   is   wonderful。现在就让我们一步步揭开三线程程序开发的神秘面纱。  
   
  二>   三线程程序开发思路  
          在操作系统中,进程是存储器,外设等资源的分配单位,同时也是处理器调度的对象,但为了提高进程内的并发性,windows系统中引入了线程这个概念(在很多其他操作系统中同样也有线程的概念,由于在2001年微软停止了window9x内核的研发,所以本文只针对windowx2000/xp操作系统),这时系统把线程作为处理器调度的对象,一个进程可以同时拥有多个并发的线程。通常情况下的简单程序就只有一个主线程,它是在进程创建时自动生成的。我们可以将想要执行的代码放在主线程里,然后再生成两个辅助线程,它们的功能就是实现对程序的保护功能,防止程序被用户关闭或删除。在此,称我们的可执行文件的进程为主进程。  
   
          主线程需要完成的任务有三个,它们分别是准备工作,创建辅助线程和程序主要功能的实现。准备工作当然是为程序运行过程中所需要的一些部件做好准备,其中包括文件复制和保存,一般情况下是把可执行文件复制到系统目录下。当然为了防止意外删除,我们可以将程序的可执行文件备份,不过要注意修改一些属性(文件类型,大小,日期,属性),这样就不容易被发现与我们的可执行文件有关联了。创建辅助线程包括两个线程,一个驻留在主进程体内,另一个通过创建远程线程驻留到其他正在运行的进程体内。这两个线程的功能就是监视其他进程或线程的运行情况,如果出现异常立即恢复。程序的主要功能就不用多说了,想干什么就干什么,一般是一些不想让用户关闭的程序。  
   
          驻留主进程体内的线程同时观察注册表和远程进程的情况。它实时查询注册表里   HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run键下相关可执行文件的键值,如果被删除就立即将其添加上。这就是对注册表的实时监视,使得每次开机时都会运行我们的可执行文件。而另一个功能则是监视驻留在远程进程体内辅助线程的运行情况,如果该线程被关闭,立即通过创建远程线程将被关闭的线程驻留到特定的进程内。如果你知道了辅助线程是驻留在那个进程内的,你就可以将这个远程进程关闭掉。但是我们还是可以将辅助线程驻留到其他的远程进程内。至于选定哪个远程进程,完全视你的心情而定。  
   
          驻留在远程进程体内的辅助线程则监视主进程的运行情况,如果主进程被kill了,它会确认程序的可执行文件是否也被删除掉了。如果系统目录下的可执行文件不存在了,则用我们备份的文件恢复可执行文件,然后再重新启动程序,这样你在任务管理器里怎么也删除不了主进程。由于我们是创建远程线程,所以必须把线程的代码和线程所需要的参数都复制到远程进程的地址空间里。这是因为在windows2000/xp环境下,访问其他进程地址空间是违规的。我们把代码和参数复制过去后,线程就完全在远程进程的地址空间运行了。我们可以看到,通过两个辅助线程,就很难把主进程关闭或删除掉。  
   
          现在我们就以一个诱鼠器为例,来分析三线程的程序结构,如下图:  
   
      │------->-------│        
  remote   ---<---   T-mouse   --->---   watch   --->---   Registry  
      │--------------<---------------│  
   
          其中T-mouse为主进程/主线程,remote为创建的远程线程,watch为本地的辅助监视线程,Registry为注册表文件。T-mouse创建remote和watch两个线程,remote监视T-mouse主进程,watch监视注册表文件和remote线程。        
           
  三>   核心代码分析  
          本文的程序仅针对windows2000/xp操作系统,程序中使用的UNICODE编码。测试环境:Windows2000   +   SP2   +   VC6.0。整个程序分主线程main,本地辅助监视线程watch,远程线程remote,还包括获得进程ID的processtopid和创建远程线程的createremote两个自定义函数。  
   
  1.主线程:main  
          GetSystemDirectory(syspath,MAX_PATH);  
          //获得操作系统的系统目录;  
          FindFirstFile(tname,&fdata);  
          //查询系统目录下的T-mouse.exe是否存在;  
          CopyFile(curname,tname,TRUE);  
          //如果系统目录下没有,在将正在运行的程序复制到系统目录下;  
          FindClose(ffhandle);  
          //在查询完毕后,关闭相关句柄;  
          CreateFile(kname,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);  
          //打开系统目录下的备份文件kernel.dll;    
          SetFileTime(fchandle,&ftime,NULL,&ftime);  
          //修改kernel.dll的创建时间,修改时间;  
          SetFileAttributes(kname,FILE_ATTRIBUTE_READONLY│FILE_ATTRIBUTE_HIDDEN│FILE_ATTRIBUTE_SYSTEM   );  
          //设置kernel.dll的属性为只读,系统及隐藏;  
          CreateThread(NULL,0,watch,(LPVOID)rthread,0,NULL);  
          //创建驻留在主进程内的辅助监视线程  
   
  2.本地辅助监视线程:watch  
          RegOpenKeyEx(HKEY_LOCAL_MACHINE,rgspath,0,KEY_QUERY_VALUE,&hkey);  
          //以查询方式打开注册表的HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run;  
          RegQueryValueEx(hkey,_T("T-mouse"),NULL,NULL,(LPBYTE)lpdata,&dwbuflen);  
          //查询是否存在T-mouse的键值;  
          RegOpenKeyEx(HKEY_LOCAL_MACHINE,rgspath,0,KEY_WRITE,&hkey);  
          //如果没有相关键值,就以写方式再次打开注册表;  
          RegSetValueEx(hkey,_T("T-mouse"),NULL,type,(const   byte   *)wtname,dwbuflen);  
          //写入我们想要的东西,系统每次启动都会运行我们的可执行文件;  
          GetExitCodeThread(wethread,&exitcode);  
          //获得远程线程的运行情况,看是否为STILL_ACTIVE,如果不是则创建远程线程;  
           
  3.远程线程:remote  
          tOpenProcess(PROCESS_ALL_ACCESS,FALSE,erp->rpmousepid);  
          //以所有可能的访问方式打开主进程,以便监视主进程的运行情况;  
          tWaitForSingleObject(erp->rpprocesshandle,INFINITE);  
          //等待直到主进程结束;  
          tWinExec(erp->rpwinexecname,   0);  
          //重新启动我们的可执行文件;  
   
  4.获得进程ID:processtopid  
          EnumProcesses(lpidprocesses,sizeof(lpidprocesses),&cbneeded);  
          //列举所有的进程  
          OpenProcess(PROCESS_QUERY_INFORMATION   │   PROCESS_VM_READ,FALSE,lpidprocesses[i]);  
          //以查询信息和读取的方式打开进程  
          EnumProcessModules(hprocess,&hmodule,sizeof(hmodule),&cbneeded);  
          //获得进程模块的句柄  
          GetModuleBaseName(hprocess,hmodule,normalname,sizeof(normalname));  
          //获得特定模块的名字,以备比较  
   
  5.创建远程线程:createremote  
          OpenProcess(PROCESS_CREATE_THREAD│PROCESS_VM_OPERATION│PROCESS_VM_WRITE,FALSE,remotepid);  
          //PROCESS_CREATE_THREAD   for   CreateRemoteThread  
          //PROCESS_VM_OPERATION     for   VirtualAllocEx  
          //PROCESS_VM_WRITE             for   WriteProcessMemory  
          VirtualAllocEx(rphandle,NULL,cb,MEM_COMMIT,PAGE_EXECUTE_READWRITE);  
          //在远程进程中分配空间,以备将线程代码置入其中;  
          WriteProcessMemory(rphandle,remotethr,(LPVOID)remote,cb,NULL);  
          //将远程线程remote的代码写入到远程进程的地址空间中  
          WriteProcessMemory(rphandle,remotepar,(LPVOID)&rp,cb,NULL);  
          //将远程线程所需的参数也写入到远程进程的地址空间中  
          CreateRemoteThread(rphandle,NULL,0,(LPTHREAD_START_ROUTINE)remotethr,(LPVOID)remotepar,0,NULL);  
          //创建远程监视线程  
   
  四>   小结与后记  
          我们已经看到,创建三线程就是为了更好的保护程序自身不被关闭和删除。两个辅助线程相互实时监视,如果监视对象被关闭了,就重新创建线程或进程。其实,在程序中我们选择的远程进程驻体为Explorer.exe和Taskmgr.exe。在通常情况下,如果用户知道了远程线程的驻体为资源管理器后,就会打开任务管理器来结束Explorer,这时我们再把远程线程驻入到任务管理器中。也就是说,只要Explorer或Taskmgr有一个存在,就不可能结束主进程。如果有其他Kill进程的工具,你就可以将其关闭掉,只要资源管理器和任务管理器均不存在时,就没有驻体来维持远程进程。不过,如果我们选择的远程进程为随机的,这就不容易发现了;如果我们选择的远程进程为系统文件(如smss.exe会话管理器),那么你是不会安全的结束远程线程,除非系统崩溃。  
   
          如何不用其他的工具将其关闭并删除呢?你也可以进入到DOS或Safe模式下,将系统目录下的可执行文件删除,然后重启系统。这时,就不会自动运行程序了,然后将注册表里RUN键下的相关键值,系统目录下的备份文件及首次运行的可执行文件删除就彻底清楚了。在调试程序时,为了对远程线程的运行情况有所了解,我们使用了工具Dbgview.exe。  


 
亲爱的 @ 2007-05-13 18:29

http://blog.yam.com/shouliyen/article/9977478

從Goslar回來的那天,因為時間還早,
我們就在離Hannover不遠的一個城鎮--Hildesheim下車

Hannover,跟著地上的紅線走就可以看完城內大部份的景點
Hameln,要看城內的主要景點就跟著老鼠走
而在Hildesheim,就是跟著地上的白玫瑰啦~

不過,沒有Hannover的紅線連續不斷或Hameln的老鼠密集
一開始沒有發現白玫瑰,一直到通往幾個重要教堂的路上才發現了它~
所以,要跟著它走~得先找到它才行哦!


玫瑰會成為這個城市的代表~
因為在大教堂(Dom)有一株千年玫瑰(1000-jähriger Rosenstock)

這玫瑰有個傳說
大約在九世紀,Ludwig有一次在獵一頭白鹿時
在一個沼澤叢林裡迷路
他就把身上有瑪麗亞像的鍊子,掛在玫瑰樹叢上
並開始祈禱,請祂救他
後來Ludwig睡著了,當他醒來後發現下雪了
只有環繞著玫瑰的那塊地還是綠的
在雪地裡,他看到了一個教堂的輪廓
當他被人找到後,他就決定要建立這個教堂




←照片引自:Bistum Hildesheim←Dom
Hildesheim這個城市也是在此時建立了

二次大戰時這株玫瑰樹有被焚毀,
但在這場災難後,從那又有新芽茂出~
又被人們說是神蹟

這個教堂和另一個在十一世紀起建的聖米歇爾教堂,
在二戰後被修復,且於1985年時被列為世界文化襲產

↑St. Michael

除了這兩個教堂,
市中心的市集廣場,也有很多很美麗的建築
  
還有一個Roemer-Pelizaeus博物館,以展古埃及和古祕魯文物為主
每年的特展也吸引很多國際人士來此
這次我們並沒有去看這博物館~
等以待在室內活動為主的冬天時,再來這裡看囉~~



 
亲爱的 @ 2007-05-12 08:38

整理近期的一些blog,包括NokiaS60,Motorola,Eclipse的一些内容

Nokia S60的几个问题

1. 不能每帧调用 System.gc(),否则严重降低fps
2. Nokia S60机器的不同机型对于translate 和 setClip的处理不一样。在Nokia N-Gage QD等机型中,setClip是相对于translate以后的坐标计算的,而在Nokia 6600,6670等机型中,setClip不受translate的影响,永远只相对于屏幕左上角(0,0)点计算。所以如果在Nokia6670中, 使用先translate再setClip的方法画子图,则会出现错误。为了统一代码,在Nokia S60中不要使用translate,即使用,两次translate之间不要进行setClip.修改后的画子图函数为:

public static void drawSubImg(Graphics g,Image img,int x,int y,int sx,int sy,int swidth,int sheight)
{
  g.setClip(x,y,swidth,sheight);  
  g.drawImage(img,x-sx,y-sy,GLT) ;
  g.setClip(0,0,width,height) ;
}


3. 部分Nokia机型(6600,6670等)退出后报错null pointer exception的解决方法
不要在在主while循环中调用destroyApp,而改成检测一个标志,退出主循环后再调用destroyApp
boolean exit ;
...
while(!exit){
...
  if(...){
    exit = true ;
  }
...
}

destroyApp(true);

注:可在destroyApp内部调用notifyDestroyed

Nokia"不能运行应用程序"错误新解

    Nokia 手机运行J2ME程序的时候出现“不能运行应用程序”的错误,一般都是内存不足引起的,但今天遇到这样的错误,却发现是另一个原因。即当使用nokia的 UI API,DirectGraphics的drawImage时,如果旋转参数设置不当,也会出现“不能运行应用程序”的错误。

Eclipse集成Motorola模拟器

在Eclipse的菜单/工具条中选择Run->External Tools,打开面板后,选择program,然后new一个新的配置
1 在Location中填入Moto模拟器的路径,如:C:\Program Files\Motorola\SDK v4.2 for J2ME\EmulatorA.1\bin\emujava.exe,Moto的不同模拟器支持n种不同机型,需要看moto sdk的文档才知道。
2 在Arguments里填入执行的参数,包括jad路径,模拟器使用的机型。如:"${project_loc}\deployed${project_name}.jad" -deviceFile Resources\V600.props
我是让模拟器执行deployed里面的jad/jar,${project_loc}是工程路径,${project_name}是工程名。这里选择的机型是V600.

说明:这种方法的局限在于只能执行jar,所以每次运行前必须打包。实际使用前需要为没种机型配置一个run,由于使用了通配参数,所以所有的工程都可以使用一个配置

Motorola手机J2ME应用问题

1 应用程序图标
  必须在jad 文件Midlet-Icon属性中指定图标文件,Midlet-1中指定的图标无效
  Moto V系列图标大小应为15*15,其他尺寸无法显示。

2 左右软键问题
Motorola手机操作系统设定是:右软键确认,左软键取消。所以,我们的程序应该和这个习惯保持一致。

3 Key Code
Moto V的key code不同于其他Midp2.0机器
左软键:21
右软键: 22
中键: 20
up: 1
down: 6
left: 2
right: 5

MIDP2.0 Canvas全屏问题

    MIDP2.0 Canvas可以调用setFullScreenMode(true)将Canvas设置成全屏,但设置成全屏后新的Canvas width & height的获得对于不同手机却并不一样。

1 MotoV系列
调用setFullScreenMode(true)后,将触发sizeChanged事件,此事件从系统接受两个参数,即为Canvas全屏后的width & height,通过这个事件可以获得新的宽高。
    protected void sizeChanged(int w, int h)
    {
        width = w ;
        height = h ;        
    }
但要注意,此事件并不是同步的,就是说如果你调用了setFullScreenMode(true)之后,立即使用新的width,height,有可能获得错误的结果。

2 SE K700
调用setFullScreenMode(true)后,不会触发sizeChanged,而是通过getWidth和getHeight获得新的宽高。 SE的setFullScreenMode调用后是立即返回的,所以可以获得正确的width & height

----------
对于其他机型暂时还不了解


百宝箱应用编译打包事宜

1 编译时,设置javac 的target vm为1.1即可通过移动检测。wtk中无法实现。在Eclipse中可以在java-compiler-Compliance and Classfiles中做以下设置:
Compiler compliance level: 1.4
Generated .class files compatibility: 1.1
Source compatibility: 1.3

2 用eclispe打混淆包。但eclipse编写jad中文会出现乱码,所以用wtk编写正确的jad,然后用wtk打包(注意不能覆盖eclispe打 的包),这是为了用wtk获得正确的jad和manifest文件。将elcipse打包出的jar解压,用wtk生成的mainifest代替原jar 中的mainifest文件,然后用winrar打包(zip格式,可选最大压缩,注意要选择所有的文件后打包,不要将外面的整个目录打包).最后将 jad中的jar size改为这个最新的jar的字节数。

另:1. Nokia S60,SE k700机器中显示的游戏名字为MIDlet-1中的名字,而Nokia40为MIDlet-Name中的名字
    2. 根据sp提供的资料Nokia 7650 游戏不能用中文名(其实NGageQD可以)


 
亲爱的 @ 2007-05-10 23:53

我认为这样的做法更好:
window-preference-java-build path-user library-new-add jars-接下来也可以添加一些api文档和source code,这样调试的时候就比较方便了
完了再project-java build path-libraries-add library-user library-选中需要的包

这样做的好处是不同的工程直接可以从user library找到需要的包添加,三方包有个统一管理的地方,还有一个好处就是可以添加api文档和source code



 
亲爱的 @ 2007-05-08 16:07

服务器到客户端:
----------------------------------------------------------------------
下面代码是服务器端把字符写到Client端,经过gbEncoding()方法,所有的字符编码成:\uXXXX.
----------------------------------------------------------------------


代码:--------------------------------------------------------------------------------
/**
* Write the String data
*
* @param out
* @param value
*/
public static void writeUnicode(final DataOutputStream out, final String value) throws ActionException {
try {
final String unicode = StringFormatter.gbEncoding( value );
final byte[] data = unicode.getBytes();
final int dataLength = data.length;

System.out.println( "Data Length is: " + dataLength );
System.out.println( "Data is: " + value );
out.writeInt( dataLength );
out.write( data, 0, dataLength );
} catch (IOException e) {
throw new ActionException( IMDefaultAction.class.getName(), e.getMessage() );
}
}
--------------------------------------------------------------------------------

----------------------------------------------------------------------
以下代码是gbEncoding()方法,把双字节字符转换成\uXXXX,ASIIC码在前面补00。
----------------------------------------------------------------------
/**
* This method will encode the String to unicode.
*
* @param gbString
* @return
*/

代码:--------------------------------------------------------------------------------
public static String gbEncoding( final String gbString ) {
char[] utfBytes = gbString.toCharArray();
String unicodeBytes = "";
for( int byteIndex = 0; byteIndex < utfBytes.length; byteIndex ++ ) {
String hexB = Integer.toHexString( utfBytes[ byteIndex ] );
if( hexB.length() <= 2 ) {
hexB = "00" + hexB;
}
unicodeBytes = unicodeBytes + "\u" + hexB;
}
System.out.println( "unicodeBytes is: " + unicodeBytes );
return unicodeBytes;
}
--------------------------------------------------------------------------------

----------------------------------------------------------------------
在客户端收到服务器的数据,先将其一个一个字符解码。双字节显示正常。
----------------------------------------------------------------------

代码:--------------------------------------------------------------------------------
/**
* This method will decode the String to a recognized String
* in ui.
* @param dataStr
* @return
*/
private StringBuffer decodeUnicode( final String dataStr ) {
int start = 0;
int end = 0;
final StringBuffer buffer = new StringBuffer();
while( start > -1 ) {
end = dataStr.indexOf( "\u", start + 2 );
String charStr = "";
if( end == -1 ) {
charStr = dataStr.substring( start + 2, dataStr.length() );
} else {
charStr = dataStr.substring( start + 2, end);
}
char letter = (char) Integer.parseInt( charStr, 16 ); // 16进制parse整形字符串。
buffer.append( new Character( letter ).toString() );
start = end;
}
return buffer;
}
--------------------------------------------------------------------------------

----------------------------------------------------------------------
客户端到服务器:
----------------------------------------------------------------------
客户端使用下面方法把手机端的字符编码成ISO-8859-1,传给服务器。
----------------------------------------------------------------------

代码:--------------------------------------------------------------------------------
/**
* write the String data
* @param value
* @param outData
*/
private void writeSjis(DataOutputStream outData, String value) {
try {
byte[] data = null;
// data = ( value ).getBytes( "UTF-8" );
data = ( value ).getBytes( "ISO8859_1" );
outData.writeInt(data.length);
outData.write(data, 0, data.length);

System.out.println(" data.length: " + data.length);
System.out.println(" data.value: " + value);
} catch (Exception ex) {
System.out.println(" write error ");
ex.printStackTrace();
}
}
--------------------------------------------------------------------------------

----------------------------------------------------------------------
服务器端收到客户端字符流,是用下面方法将其转为UTF-8,以后的操作都是基于UTF-8编码。SQLServer可能会由于内吗不通有不同的变换,所以存取数据库是还要是具体的DB内码作相应的处理。
----------------------------------------------------------------------

代码:--------------------------------------------------------------------------------
/**
*
* @param iso
* @return
*/
public static String isoToUtf( final String iso ) {
String utfString = iso;
if( iso != null ) {
try {
utfString = new String( iso.getBytes( "ISO-8859-1" ), "UTF-8" );
} catch ( UnsupportedEncodingException e ) {
utfString = iso;
}
} else {
utfString = "";
}
return utfString;
}


注:
本方法应该不是最有效的,但是只要手机支持unicode的gb2312编码,应该都可以显示正常。
不正之处,请各位到:http://www.ebds.com.cn/bbs/讨论讨论。


出处 无线开发者论坛


 
亲爱的 @ 2007-04-25 16:52

这个问题我发现很久了,前两天MS通知我补掉了,所以现在我公布在这里了。这个源于我在2005年底作协议分析时的偶然发现,呵呵,从此我对发现漏洞产生了兴趣。
2005年的协议分析我写的原版在这里:
http://projects.collabora.co.uk/trac/farsight/wiki/MsnVideoConversation
英文很差,写成这样不错了,哈哈。
感谢ole andre 对我的帮助,thank you very much.

    MSN VIDEO 的协议分为两个大部分,webcam和video conversation, 其中以video conversation部分最为重要,下面我们主要讨论video conversation部分,附带讨论webcam.
协商部分:与标准的MSNMS相同,请参阅相关文档。

数据传输部分:MSN一共采用3种传输方法,UDP,TCP和通过server转发,由于我的测试全部自动采用UDP,最主要的传输方法也为 UDP,下面我们讨论UDP部分,TCP部分的传输方法基本相同,MSN video conversation的编码部分采用WMV9/3 , WebCam部分采用ML20
1.    video conversation
每一个UDP packet可能含用video和audio两种格式,一般audio在前,video在后。
每一个UDP packet除相应的UDP头外,还含有一个10 bytes的MSN conversation头,下面就这10 bytes 展开讨论:

(UDP header)62 81 69 00 94 b4 cd 08 0a 04 ( payload)

62代表后面是一个视频的内容,当这个字节做这个运算(0x62 >> 1) & 0xF =  1 时为video ,为5时为audio(一般是0x4a),为2时为sync/ack,为3时是auth包。
下面两个字节为短整数,0x6981,右移5位后为payload长度 (0x6981 >> 5 ),这个非常重要,因为一个packet可能含多个payload,这个要小心计算。
第4个字节非常重要,这个字节做这个运算(0x00&63 = 0)后的值 0 ,表明这是组成一个完整的frame的第一个payload),如果为01,代表为第二部分。

下面是一个4字节的整数(5,6,7,8字节),是发送的时间,不是很重要。

第9个字节(0x0a)是完整的frame 的序号,同一个frame的不同packet部分,这字节应该相同,这可以作为拼包的重要依据。

第10个字节(0x04)表明这个完整的frame需要几个部分,4代表这个完整的frame(0x0a)需要由4部分拼成。

    

2. WebCam
与video conversation稍有不同,它不带audio信息,它带有一个9个字节的头,下面就这 9 bytes 展开讨论:

(UDP header)9d 49 e1 8e 4a 09 be 09 0a ( payload)

第一二个字节代表payload长度(0x499d & 2047 = 413),后面的payload长度就为413了。
同时也代表packet类型 (0x499d >> 11 & 7 = 1) , 1代表video内容,2,3 ack/syn.
下面4个字节代表timestamp,不重要。

第7个字节(0xbe)是完整的frame 的序号,同一个frame的不同packet部分,这字节应该相同,这可以作为拼包的重要依据。

第8个字节非常重要, 0x09表明这是组成一个完整的frame的第10个payload,如果为01,代表为第二部分,以此类推。问题就出在这里,在所有7.x版本里,都没 有检查这1个字节,当这个字节的值大于等于0x83的时候,heap overflow 就产生了,呵呵。

第9个字节(0x0a)表明这个完整的frame需要几个部分,0x0a代表这个完整的frame(0xbe)需要由10部分拼成。

WebCam部分采用ML20编码,在frame的第一部分(第8个字节为0),紧跟9字节webcam头后是ML20编码的头,大概由这几部分构成。
int16 header size
int16 width
int16 height
int16 flags (bit 1 == keyframe)
int32 payload size
int32 FCC (== "ML20")
int32 wtf
int32 timestamp
这个编码原则上windows可以解析的,方法同video conversation基本上一样。

我写了一个exploit在这里,为了不被人滥用,作了些修改,&#61514;
http://www.team509.com/exp_msn.rar

thanks ole andre again, His ospy is perfect.
1.compile the dll.
2.inject the dll to msn messenger 7.0.777.0 's process.
3. choose "send my webcam" to a contact id who is online using 7.x (8.0?).
4.when the otherside accept the invatation , the otherside's msn will be at least crashed, if you using aChinese version windows 2000 sp4 , maybe  a  reverse shell  ,  if other  verison  windows 2000,  you need adjust the jmpa address in  the dll's  sourcecode. //这里不对了,呵呵,要改的地方多了。


 
网志文件夹
· 所有网志 · 日记 · 字体 · 网页设计 · vb · sqlserver · 多线程 · C# · 安全 · win32 · 破解 · VC · 开发工具 · 性能 · 开发日志 · C++ · 保存 · 学习 · wap开发 · 未分类 ·
最 新 的 评 论
搜 索
友 情 链 接
· 歪酷博客 · 管理我的Blog · 火柴天堂 · 追求完整的人生 · 心之舞 · 装朱古力的盒子 · 阿超的blog · erikb · 破解 · 中国四大网 · Gentoo 从零起步 · smilnet [笨笨] · 灵感之源 · lain · Vb hook · HelloWorld · Pysche Blog · SIPB · smarty · ipbcb · 小龙的blog · 听雨。。。。。。 · Gao Yuanxue's Column · 车东 Che, Dong - My Window, Your Bridge · 云风的 BLOG ·

订阅 RSS

0098306

歪酷博客