博客

  • SQL Server Reporting service ToolBarItemsDisplayMode

    定制Sharepoint 2013报表工具栏

    C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\15\template\layouts\ReportServer\RSViewerPage.aspx
    
    <RSWP:ReportViewerWebPart id="m_sqlRsWebPart" runat="server" SuppressWebPartChrome="true" Height="100%" Width="100%" 
    
    ToolBarItemsDisplayMode="Back,Export,Find,PageNavigation,Print,Refresh" />
    
  • Reporting services exp

    Reporting services 开发日志

    报表数据源使用sql语句传参数的时候,在参数前面使用“:”冒号接参数名,

    例如:想要把参数p_id传入下列语句中使用时,select * from user where userid=:p_id

    报表可以包含指向其他报表的链接。单击主报表中的链接时打开的报表称为“钻取报表”,钻取报表必须与主报表在同一报表服务器上,但可位于不同的文件夹。可以向具有“操作”属性的任何项添加钻取链接,

    添加钻取操作

    1. 在“设计”视图中,右键单击要添加链接的文本框、图像或图表,然后单击“属性”。

    2. 在该报表项的“属性”对话框中,单击“操作”。

    3. 选择“转到报表”。其他部分将显示在此选项的对话框中。

    4. 在“从列表中选择报表”中,键入或选择要跳转至的报表的名称。

      ms159847.note(zh-cn,SQL.100).gif注意:

      报表名称的列表包括了当前报表服务器项目中的所有报表。如果钻取报表在报表服务器上而不在项目中,请键入报表的名称。报表名称可以包含此报表的相对路径或服务器上的报表的绝对路径。相对路径的示例为:…\DrillthroughReport\Store。绝对路径的示例为:\SalesReports\DrillthroughReport\Store。

      在配置为本机模式的报表服务器上,不必使用文件扩展名 .rdl 指定钻取报表名称。

      在配置为 SharePoint 集成模式的报表服务器上,必须在表达式中指定报表名称,并包含文件扩展名 .rdl。例如,="http://site/subsite/Documents/DrillthroughReport.rdl"。

      如果必须为钻取报表指定参数,请执行下一个步骤。

    5. 在“使用这些参数运行报表”中,单击“添加”。将向参数网格添加一个新行。

      • 在“名称”文本框中,键入钻取报表中的报表参数的名称。如果钻取报表位于报表服务器项目中,则可从下拉列表中选择参数名称。

        ms159847.note(zh-cn,SQL.100).gif注意:

        参数列表中的名称必须与目标报表中的期望参数完全匹配。如果名称不匹配,或者并未列出某个预期的参数,则钻取报表将出错。

      • 在“值”中,键入或选择要传递给钻取报表中的参数的值。

        ms159847.note(zh-cn,SQL.100).gif注意:

        值可以包含其计算结果将传递到报表参数的表达式。值列表中的表达式包括当前报表的字段列表。

    6. 若要测试该链接,请运行报表,然后单击对其设置此链接的报表项。对于文本框,更改文本的颜色和效果有助于向用户指示该文本是一个链接。例如,通过在“文本框属性”对话框中设置“字体”属性,将颜色更改为蓝色,并对文本添加下划线。

    下面文章引自:http://www.cnblogs.com/wendy-lijie/archive/2009/05/27/1490806.html

    对Table中的详细内容,以不同的颜色间隔开相邻的两行。 A:选择Table的Detail行,选择属性中的BackgroundColor,值选择表达式,输入:=iif(RowNumber(Nothing) Mod 2, “White”, “Beige”)。
    2、设置每面显示Table表头或表尾
    A:选择Table Header或Table Footer,将属性中的RepeatOnNewpage设为True.
    3、在每页都显示放入的图片或标题头等信息。
    A:只须在Table Header中加行数,把你要显示的内容放到单元格中,然后再按第二条方式设置后就可以了。
    1.     分页的控制方式
    1.1. Reporting Services自动分页
    在报表的页眉或者页尾添加文本框,调用全局变量=Globals!PageNumber
    1.2. 根据记录条数来分页
    当每条记录呈现的高度不一致,我们又希望让每页呈现的记录条数一致,那么我们可以通过记录条数来分页。在通过记录条数分页时,通常是
    根据记录条数来分组,然后在组的结束位置添加分页符。
    在表、矩阵或者列表中添加一个组,然后在分组表达式中输入=(RowNumber(“ContainerName”) – 1) \ PageSize ( PageSize 用每页所包含的
    记录条数替代,ContainerName用包含这个组的表、矩阵或者列表的名称替代)。这个表达式是用记录的行号整除分页大小,也就是记录所在的
    页码数。最后选中“在结尾处分页”,在每个组实例的结尾处放置分页符。
    1.3. 按组分页
    插入组时,在<常规>的页签中,可以选择<在起始处分页>或者<在结尾处分页>
    2.     获取参数列表的方法
    ReportingService rService = new ReportingService();//创建报表服务实例
    rService.Credentials = System.Net.CredentialCache.DefaultCredentials;//设置默认系统凭据
       string historyID = null;
       bool forRendering = true;
       ParameterValue[] values = null; 
       DataSourceCredentials[] credentials = null;
       ReportParameter[] parameters;
       parameters = rService.GetReportParameters//获取报表参数集合
        (
        “/cfhrreport/pos”,
        historyID,
        forRendering,
        values,
        credentials     
        );
       ListItem item;
       foreach(ValidValue v in parameters[0].ValidValues)//遍历参数的有效值集合
       {
        item=new ListItem(v.Label ,v.Value );
        this.DropDownList1 .Items .Add (item);//填充到一个下拉框
       }
    3.     Reporting Services API
    首先添加web引用
    http://server/reportserver/reportservice.asmx
    ReportingService rService = new ReportingService();//创建报表服务实例
    rService.Credentials = System.Net.CredentialCache.DefaultCredentials;//默认系统凭据
    CatalogItem[] catalogItems;
    catalogItems = rService.ListChildren(“/”, true);//对根路径检索
    foreach(CatalogItem item in catalogItems)
    {
        if(item.Type ==ItemTypeEnum.Folder)
    {
    //遍历报表文件夹
    }
    }
    foreach(CatalogItem item in catalogItems)
    {
    if(item.Type ==ItemTypeEnum.Report)
    {
    //遍历报表
    }
    }
    //搜索报表
    ReportService.SearchCondition[] condition=new SearchCondition[1];
    condition[0]=new SearchCondition();
    condition[0].Name =”Name”;
    condition[0].Value =this.TextBox1.Text ;
    catalogItems=rs.FindItems (“/”,WebReportSample.ReportService .BooleanOperatorEnum .And ,condition);
    //发布报表
    byte[] reportData;
    System.IO .FileStream fs=System.IO .File.OpenRead (“c:\\Report1.rdl”);
    reportData=new byte [fs.Length ];
    fs.Read (reportData,0,fs.Length );
    rs.CreateReport (“New Report”,”/”,false,reportData,null);
    //删除报表
    rs.DeleteItem (“报表名称”);
    4.     报表Url分析
    报表 URL 包含 Web 服务器的名称、报表服务器虚拟目录的名称以及报表的完全限定名称。(完全限定的名称包含报表路径,并以报表本身的
    名称结束。)
    http://server/virtualroot?%5B/pathinfo%5D&prefix:param=value%5B&prefix:param=value%5D…n]
        常用前缀及其参数名:
    4.1. rc:toolbar=true/false 显示/不显示工具栏
    4.2. rs:command=render 呈现报表
    4.3. rs:format=PDF(DOC,XLS)导出报表格式
    4.4. rc:parameters=true/false 显示/不显示工具栏的参数选择区域
    4.5. @Parameter=value 直接传递参数值
    注意:在URL参数中如果有中文,将不能被正确识别,解决的方法是用HttpUtility.UrlEncode将其转换为uft-8,再附加到参数中即可。此外还
    要注意参数是大小写敏感的。
    5. ASP.NET中展现报表
    ASP.NET提供了多种技术来呈现Web形式的报表,通常的解决方法是用Iframe。将我们前面所掌握的URL赋值给Iframe的src,结合Javascritp脚
    本,我们便可以将报表集成在页面中。此外,我们还可以充分利用ASP.NET强大的控件功能,如日历控件、图像按钮等功能提高系统的易用性。
    小技巧:有时报表中的图片可能会显示不出来,这可能是Cookies的设置问题,你也可以通过让客户下载reg文件,把Reporting Services服务
    器加入本地计算机的信任站点中。此外,报表中的image有embed和external两种方式,建议使用external方式,这样可以有效地缩小报表的尺
    寸。
    6.报表中使用自定义嵌入式代码
    Reporting Service 只接受Microsoft Visual Basic .NET 中编写嵌入式代码, 代码准备好,您就可以使用全局定义的 Code 成员在报表表达
    式中调用它。例如,如果您编写了一个名为 GetValue 的嵌入式代码函数,就可以使用下列语法从您的表达式中调用它:
    6.1.在报表<属性>中,选择<代码>页签,输入自定义代码
    Function GetValue(value As Object) As Object
    if Value is Nothing then
    return 0
    else
    return value
    end if
    End Function
        6.2.调用方法:
    =Code.GetValue(Code.GetValue(Fields!字段名.Value))

    from:http://www.cnblogs.com/xiarifeixue/archive/2009/12/28/1634311.html

  • IIS7.0 Appcmd (quote)

    一:准备工作 APPcmd.exe 位于 C:\Windows\System32\inetsrv 目录 使用 Cd c:\Windows\System32\inetsrv 切换到该目录 二:命令操作简介 IIS 命令行管理工具基本格式: APPCMD (命令) (对象类型) <标识符> </参数1:值1 …> 支持的对象类型: SITE 虚拟站点的管理 APP 管理应用程序 VDIR 管理虚拟目录 APPPOOL 管理应用程序池 CONFIG 管理常规配置节 WP 管理工作进程 REQUEST 管理 HTTP 请求 MODULE 管理服务器模块 BACKUP 管理服务器配置备份 TRACE 使用失败请求跟踪日志 ———–这个就不解释很详细了,懂的人都知道这个IIS的层次。 三:对Site的命令详解 1.命令介绍 虚拟站点的管理 APPCMD <命令> SITE [标识符] [-参数1:值1 …] 如: appcmd list site (列出当前存在的站点) 支持的命令: list 列出虚拟站点 set 配置虚拟站点 add 添加新虚拟站点 delete 删除虚拟站点 start 启动虚拟站点 stop 停止虚拟站点 2.详解 列出虚拟站点 APPCMD list SITE [标识符] [-参数1:值1 …] 列出计算机上的虚拟站点。此命令可用于使用特定站点的标识符或 url 查找该站点,或者 基于指定的站点属性匹配零个或多个站点。 示例: appcmd list sites 列出计算机上的所有站点。 appcmd list site “Default Web Site” 查找站点“Default Web Site”。 appcmd list site http://localhost/app1 查找与指定的 url 关联的站点。 appcmd list site /serverAutoStart:false 查找“serverAutoStart”配置属性设置为“false”的所有站点。 添加新虚拟站点 APPCMD add SITE [标识符] [-参数1:值1 …] 使用指定的设置创建新的虚拟站点。至少,必须提供站点名称和 ID。 支持的参数: /name (必需) 站点名称 /id 站点 ID /bindings “http://domain:port,…”好记格式或“protocol/bindingInformation,…”原始格式的绑定列表 /physicalPath 如果指定,将导致为该站点创建包含指向指定路径的根虚拟目录的根应用程序。如果忽 略,将创建一个没有根应用程序的站点,并且该站点在创建根应用程序之前将无法启动。 示例: appcmd add site /name:”My New Site” /id:2 /bindings:http://www.domain.com:80 使用指定的好记绑定创建一个新站点“我的新站点”,以便在端口 80 上侦听对 www.d omain.com 的 http 请求。 appcmd add site /name:”My New Site” /id:2 /bindings:http://*:81 使用指定的好记绑定创建一个新站点“我的新站点”,以便在端口 81 上侦听对任何域 名的 http 请求。 appcmd add site /name:”My New Site” /id:2 /bindings:http/*:81: 使用指定的 ID 和绑定创建新站点“我的新站点”。创建后,新站点中不包含任何应用 程序。 appcmd add site /name:”My New Site” /id:2 /bindings:http/*:81: /physicalPath:”c :\inetpub\mynewsite” 使用指定的 ID 和绑定创建新站点“我的新站点”。系统将自动创建根虚拟目录指向指 定物理路径的根应用程序。 appcmd add site /name:”My New Site” /bindings:http/*:81: 使用绑定创建新站点“我的新站点”,并自动生成站点 ID。创建后,该新站点不包含 任何应用程序。 配置虚拟站点 APPCMD set SITE [标识符] [-参数1:值1 …] 允许设置指定虚拟站点的属性。必须提供准确的站点标识符,并且必须将该标识符解析为现 有站点。 支持的参数: identifier (必需) 要修改的站点的站点名称或 url /site.name 要修改的站点的站点名称或 url (与标识符相同) /bindings “http://domain:port,…”好记格式或“protocol/bindingInformation,…”原始 格式的绑定列表 示例: appcmd set site “Default Web Site” /serverAutoStart:false /id:100 设置“Default Web Site”站点的“serverAutoStart”和“id”属性。 这里对 set 操作附加一些高级操作(重要) 当时用 appcmd set site “Default Web Site” 当时用后其他高级参数 解释后续补上………… -name 名称 -id ID标识 -serverAutoStart 是否自动启动 -bindings.[protocol=’string’,bindingInformation=’string’].p -bindings.[protocol=’string’,bindingInformation=’string’].b -limits.maxBandwidth -limits.maxConnections -limits.connectionTimeout -logFile.logExtFileFlags -logFile.customLogPluginClsid -logFile.logFormat -logFile.directory -logFile.period -logFile.truncateSize -logFile.localTimeRollover -logFile.enabled -traceFailedRequestsLogging.enabled -traceFailedRequestsLogging.directory -traceFailedRequestsLogging.maxLogFiles -traceFailedRequestsLogging.maxLogFileSizeKB -traceFailedRequestsLogging.customActionsEnabled -applicationDefaults.path -applicationDefaults.applicationPool -applicationDefaults.enabledProtocols -virtualDirectoryDefaults.path -virtualDirectoryDefaults.physicalPath 网站的物理路径 -virtualDirectoryDefaults.userName 物理路径凭据的账户 -virtualDirectoryDefaults.password 物理路径凭据的密码 -virtualDirectoryDefaults.logonMethod -virtualDirectoryDefaults.allowSubDirConfig -[path=’string’].path -[path=’string’].applicationPool -[path=’string’].enabledProtocols -[path=’string’].virtualDirectoryDefaults.path -[path=’string’].virtualDirectoryDefaults.physicalPath -[path=’string’].virtualDirectoryDefaults.userName -[path=’string’].virtualDirectoryDefaults.password -[path=’string’].virtualDirectoryDefaults.logonMethod -[path=’string’].virtualDirectoryDefaults.allowSubDirConfig -[path=’string’].[path=’string’].path -[path=’string’].[path=’string’].physicalPath -[path=’string’].[path=’string’].userName -[path=’string’].[path=’string’].password -[path=’string’].[path=’string’].logonMethod -[path=’string’].[path=’string’].allowSubDirConfig 删除虚拟站点 APPCMD delete SITE [标识符] [-参数1:值1 …] 描叙: 从计算机删除指定的虚拟站点。必须提供准确的站点标识符,并且必须将该标识符解析为现有站点。 支持的参数: identifier (必需)要删除的站点的站点名称或 url /site.name 要删除的站点的站点名称或 url (与标识符相同) 示例: appcmd delete site “Default Web Site” 删除站点“Default Web Site”。 启动虚拟站点 APPCMD start SITE [标识符] [-参数1:值1 …] 启动指定的虚拟站点并启用该站点,以开始侦听其所有绑定端点上的新请求。必须提供准确的站点标识符,并且必须将该标识符解析为现有站点。 支持的参数: identifier (必需)要启动的站点的站点名称或 url /site.name 要启动的站点的站点名称或 url (与标识符相同) 示例: appcmd start site “Default Web Site” 启动站点“Default Web Site”。 停止虚拟站点 APPCMD stop SITE [标识符] [-参数1:值1 …] 停止指定的虚拟站点,阻止在其绑定端点上接收新请求。必须提供准确的站点标识符,并且 必须将该标识符解析为现有站点。 支持的参数: identifier (必需)要停止的站点的站点名称或 url /site.name 要停止的站点的站点名称或 url (与标识符相同) 示例: appcmd stop site “Default Web Site” 停止站点“Default Web Site”。 转自:http://blog.chinaunix.net/uid-20787846-id-3126923.html

  • Hook javascript (转)

    一、概述
    javascript函数劫持,也就是老外提到的javascript hijacking技术。最早还是和剑心同学讨论问题时偶然看到的一段代码,大概这样写的:
    window.alert = function(s) {};
    觉得这种用法很巧妙新颖,和API Hook异曲同工,索性称之为javascript function hook,也就是函数劫持。通过替换js函数的实现来达到劫持这个函数调用的目的,一个完整的hook alert函数例子如下:
    <!–1.htm–>
    <script type=”text/javascript”>
    <!–
    var _alert = alert;
    window.alert = function(s) {
    if (confirm(“是否要弹框框,内容是/”” + s + “/”?”)) {
    _alert(s);
    }
    }
    //–>
    </script>
    <html>
    <body>
    <input type=”button” onclick=”javascript: alert(‘Hello World!’)” value=”test” />
    </body>
    </html>
    搞过API Hook的同学们看到这个代码一定会心的一笑,先保存原函数实现,然后替换为我们自己的函数实现,添加我们自己的处理逻辑后最终再调用原来的函数实现,这样这个alert函数就被我们劫持了。原理非常简单,下面举些典型的应用来看看我们能利用它来做些什么。
    二、应用举例
    1. 实现一个简易的javascript debugger,这里说是debugger比较标题党,其实只是有点类似于debugger的功能,主要利用js函数劫持来实现函数的break point,来看看个简单的例子:
    <script type=”text/javascript”>
    <!–
    var _eval = eval;
    eval = function(s) {
    if (confirm(“eval被调用/n/n调用函数/n” + eval.caller + “/n/n调用参数/n” + s)) {
    _eval(s);
    }
    }
    //–>
    </script>
    <html>
    <head>
    </head>
    <body>
    <script type=”text/javascript”>
    <!–
    function test() {
    var a = “alert(1)”;
    eval(a);
    }
    function t() {
    test();
    }
    t();
    //–>
    </script>
    </body>
    </html>
    通过js函数劫持中断函数执行,并显示参数和函数调用者代码,来看一个完整例子的效果:
    >help
    debug commands:
    bp <function name> – set a breakpoint on a function, e.g. “bp window.alert”.
    bl – list all breakpoints.
    bc <breakpoint number> – remove a breakpoint by specified number, e.g. “bc 0”.
    help – help information.
    >bp window.alert
    * breakpoint on function “window.alert” added successfully.
    >bl
    * 1 breakpoints:
    0 – window.alert
    >bc 0
    * breakpoint on function “window.alert” deleted successfully.
    这里演示设置断点,察看断点和删除断点,完整代码在本文附录[1]给出。
    2. 设置陷阱实时捕捉跨站测试者,搞跨站的人总习惯用alert来确认是否存在跨站,如果你要监控是否有人在测试你的网站xss的话,可以在你要监控的页面里hook alert函数,记录alert调用情况:
    <script type=”text/javascript”>
    <!–
    function log(s) {
    var img = new Image();
    img.style.width = img.style.height = 0;
    img.src = “http://yousite.com/log.php?caller=” + encodeURIComponent(s);
    }
    var _alert = alert;
    window.alert = function(s) {
    log(alert.caller);
    _alert(s);
    }
    //–>
    </script>
    当然,你这个函数要加到页面的最开始,而且还要比较隐蔽一些,赫赫,你甚至可以使alert不弹框或者弹个警告框,让测试者抓狂一把。
    3. 实现DOM XSS自动化扫描,目前一般的XSS自动化扫描的方法是从http返回结果中搜索特征来确定是否存在漏洞,但是这种方法不适用于扫描DOM XSS,因为DOM XSS是由客户端脚本造成的,比如前段时间剑心发现的google的跨站(见附录[2])原理如下:
    document.write(document.location.hash);
    这样的跨站无法反映在http response里,所以传统扫描方法没法扫描出来。但是如果你从上个例子里受到启发的话,一定会想到设置陷阱的办法,DOM XSS最终导致alert被执行,所以我们hook alert函数设置陷阱,如果XSS成功则会去调用alert函数,触发我们的陷阱记录结果,这样就可以实现DOM XSS的自动化扫描,陷阱代码类似于上面。
    4. 灵活的使用js劫持辅助你的页面代码分析工作,比如分析网页木马时,经常会有通过eval或者document.write来进行加密的情况,于是我们编写段hook eval和document.write的小工具,辅助解密:
    <script type=”text/javascript”>
    <!–
    var _eval = eval;
    eval = window.execScript = window.document.write = window.document.writeln = function(s) {
    document.getElementById(“output”).value = s;
    }
    //–>
    </script>
    <html>
    <body>
    input:
    <textarea id=”input” cols=”80″ rows=”10″></textarea>
    <input type=”button” onclick=”javascript: _eval(document.getElementById(‘input’).value);” value=”decode” />
    <br />
    output:
    <textarea id=”output” cols=”80″ rows=”10″></textarea>
    </body>
    </html>
    在input框里输入加密的代码:
    eval(unescape(“%61%6C%65%72%74%28%31%29%3B”));
    在output框里输出解码后的代码:
    alert(1);
    当然你还能想到更多的灵活应用:)
    三、反劫持
    谈到劫持也就必然要谈谈反劫持的话题,假设你要写一个健壮的xss playload,就需要考虑反劫持,有两个问题要解决:
    如何判断是否被劫持了?
    如果发现被劫持了,如何反劫持?
    1. 判断某个函数是否被劫持,这个好办,写个小程序对比一下一个函数被hook前后,有什么差别:
    <textarea id=”tb1″ cols=”80″ rows=”8″></textarea>
    <script type=”text/javascript”>
    <!–
    document.getElementById(“tb1”).value = eval + “/n”;
    var _eval = eval;
    eval = function(s) {
    alert(s);
    _eval(s);
    }
    document.getElementById(“tb1”).value += eval;
    //–>
    </script>
    结果:
    function eval() {
    [native code]
    }
    function(s) {
    alert(s);
    _eval(s);
    }
    我们发现那些内置函数是[native code],而自定义的则是具体的函数定义,用这个特征就可以简单的检测函数是否被劫持:
    function checkHook(proc) {
    if (proc.toString().indexOf(“[native code]”) > 0) {
    return false;
    } else {
    return true;
    }
    }
    2. 如何反劫持,第一个想法就是恢复被劫持的函数,如果劫持的人把原函数保存在某个变量里那还好办,直接调用原函数就可以了,但是劫持者自己也没保存副本怎么办,只能自己创建个新的环境,然后用新环境里的干净的函数来恢复我们这里被hook了的,怎么创建新环境?整个新的iframe好了,里面就是个全新的环境。ok,动手吧:
    function unHook(proc) {
    var f = document.createElement(“iframe”);
    f.style.border = “0”;
    f.style.width = “0”;
    f.style.height = “0”;
    document.body.appendChild(f);
    var d = f.contentWindow.document;
    d.write(“<script type=/”text/javascript/”>window.parent.escape = escape;<//script>”);
    d.close();
    }
    综合1、2节,整个测试代码如下:
    <!–antihook.htm–>
    <script type=”text/javascript”>
    <!–
    escape = function(s) {
    return s;
    }
    //–>
    </script>
    <html>
    <body>
    <input type=”button” onclick=”javascript: test();” value=”test” />
    <script type=”text/javascript”>
    <!–
    function test() {
    alert(escape(“s y”));
    if (checkHook(escape)) {
    unHook(escape);
    }
    alert(escape(“s y”));
    }
    function checkHook(proc) {
    if (proc.toString().indexOf(“[native code]”) > 0) {
    return false;
    } else {
    return true;
    }
    }
    function unHook(proc) {
    var f = document.createElement(“iframe”);
    f.style.border = “0”;
    f.style.width = “0”;
    f.style.height = “0”;
    document.body.appendChild(f);
    var d = f.contentWindow.document;
    d.write(“<script type=/”text/javascript/”>window.parent.escape = escape;<//script>”);
    d.close();
    }
    //–>
    </script>
    </body>
    </html>
    3. 不是上面两个问题都解决了么,为什么要有第3节?因为那不是个最好的解决办法,既然我们可以创建全新的iframe,何不把代码直接放到全新iframe里执行呢,这样做的话绿色环保,既不用考虑当前context里的hook问题,也不用改动当前context,不会影响本身的程序执行。给出两个比较通用点的函数:
    function createIframe(w) {
    var d = w.document;
    var newIframe = d.createElement(“iframe”);
    newIframe.style.width = 0;
    newIframe.style.height = 0;
    d.body.appendChild(newIframe);
    newIframe.contentWindow.document.write(“<html><body></body></html>”);
    return newIframe;
    }
    function injectScriptIntoIframe(f, proc) {
    var d = f.contentWindow.document;
    var s = “<script>/n(” + proc.toString() + “)();/n</script>”;
    d.write(s);
    }
    把你的payload封装进一个函数,然后调用这两个方法来在iframe里执行:
    function payload() {
    // your code goes here
    }
    var f = createIframe(top);
    injectScriptIntoIframe(f, payload);
    四、最后
    由于国内很少有见文章提及这个东西,所以才草成这篇,希望能够抛砖引玉。由于本人水平有限,难免有错误或者疏漏之处请谅解,没有说清楚的地方,欢迎和我交流。
    还有就是一些不得不感谢的人,感谢剑心一直以来毫无保留的交流,感谢黑锅多次鼓励我把自己的心得体会写成文字,感谢幻影所有的朋友们、B.C.T的朋友们以及群里那帮经常一起扯淡的朋友们。
    广告一下,没法幻影blog的朋友,可以添加hosts来突破:
    72.14.219.190 pstgroup.blogspot.com
    五、附录
    [1] 简易的javascript inline debugger代码
    <!–test.htm–>
    <!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
    <html xmlns=”http://www.w3.org/1999/xhtml”>
    <head><title>Javascript Inline Debugger</title></head>
    <body>
    <script language=”javascript” type=”text/javascript” src=”js_inline_debugger.js”></script>
    <input type=”button” value=”hahaha” onclick=”javascript: alert(this.value);” style=”margin-left: 300px;” />
    </body>
    </html>
    /*
    FileName:        js_inline_debugger.js
    Author:            luoluo
    Contact:        luoluonet_at_yahoo.cn
    Date:            2007-6-27
    Version:        0.1
    Usage:
    <!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
    <html xmlns=”http://www.w3.org/1999/xhtml”>
    <head>
    </head>
    <body>
    <script language=”javascript” type=”text/javascript” src=”js_inline_debugger.js”></script>
    </body>
    </html>
    Instruction:
    It is a simple javascript inline debugger. You must add xhtml1-transitional dtd to your
    html document if you wanna to use the script.
    */
    //————————————————————————–//
    // 公用的函数
    //————————————————————————–//
    // 判断是否是IE
    function isIE() {
    return document.all && window.external;
    }
    // 去除字符串两边的空格
    String.prototype.trim = function() {
    var re = /(^/s*)|(/s*)$/g;
    return this.replace(re, “”);
    }
    // 删除数组中某个元素
    Array.prototype.remove = function(i) {
    var o = this[i];
    for (var j = i; j < this.length – 1; j ++) {
    this[j] = this[j + 1];
    }
    — this.length;
    return o;
    }
    // 判断一个数组中是否存在相同的元素
    Array.prototype.search = function(o) {
    for (var i = 0; i < this.length; i ++) {
    if (this[i] == o) {
    return i;
    }
    }
    return -1;
    }
    // html编码
    function htmlEncode(s) {
    s = s.replace(/&/g, “&amp;”);
    s = s.replace(/</g, “&lt;”);
    s = s.replace(/>/g, “&gt;”);
    s = s.replace(//”/g, “&quot;”);
    s = s.replace(//’/g, “&#34;”);
    return s;
    }
    // js编码
    function jsEncode(s) {
    s = s.replace(////g, “////”);
    s = s.replace(//n/g, “//n”);
    s = s.replace(//”/g, “///””);
    s = s.replace(//’/g, “///’”);
    return s;
    }
    //————————————————————–//
    // 命令行窗口工具
    //————————————————————–//
    function Console(parentNode, processInputProc) {
    // 窗口
    var panel = document.createElement(“div”);
    panel.style.width = “250px”;
    panel.style.height = “250px”;
    panel.style.borderColor = “#666666”;
    panel.style.borderWidth = “1px”;
    panel.style.backgroundColor = “#ffffff”;
    panel.style.borderStyle = “solid”;
    panel.style.position = “absolute”;
    panel.style.zIndex = 100;
    parentNode.appendChild(panel);
    // 标题栏
    var title = document.createElement(“div”);
    title.style.width = “250px”;
    title.style.height = “15px”;
    title.style.backgroundColor = “#dddddd”;
    title.style.fontSize = “12px”;
    title.style.fontFamily = “verdana,tahoma”;
    panel.appendChild(title);
    // 标题栏拖动窗口功能
    var isDragging = false;
    var startPos = new Position(panel.offsetLeft, panel.offsetTop);
    var startMousePos = new Position(0, 0);
    title.onmouseover = function(evt) {
    this.style.cursor = “pointer”;
    }
    title.onmousedown = function(evt) {
    if (isDragging == true) {
    return;
    }
    var event = evt || window.event;
    startMousePos.x = event.clientX;
    startMousePos.y = event.clientY;
    isDragging = true;
    }
    title.onmousemove = function(evt) {
    if (isDragging == false) {
    return;
    }
    activateWindow();
    var event = evt || window.event;
    panel.style.left = (event.clientX – startMousePos.x) + startPos.x + “px”;
    panel.style.top = (event.clientY – startMousePos.y) + startPos.y + “px”;
    }
    title.onmouseup = function(evt) {
    if (isDragging == false) {
    return;
    }
    var event = evt || window.event;
    startPos.x =  (event.clientX – startMousePos.x) + startPos.x;
    panel.style.left = startPos.x + “px”;
    startPos.y = (event.clientY – startMousePos.y) + startPos.y;
    panel.style.top = startPos.y + “px”;
    isDragging = false;
    }
    // 关闭窗口功能
    var closeButton = document.createElement(“div”);
    closeButton.style.width = “13px”;
    closeButton.style.height = “13px”;
    closeButton.style.backgroundColor = “#ffffff”;
    closeButton.style.styleFloat = closeButton.style.cssFloat = “left”;
    closeButton.style.fontSize = “12px”;
    closeButton.style.borderWidth = “1px”;
    closeButton.style.borderColor = “#999999”;
    closeButton.style.borderStyle = “solid”;
    closeButton.style.paddingButton = “2px”;
    closeButton.innerHTML = “<div style=/”margin-top: -2px;margin-left: 3px;/”>x</div>”;
    title.appendChild(closeButton);
    var isVisible = true;
    // 窗口关闭
    closeButton.onclick = function(evt) {
    isVisible = false;
    panel.style.display = “none”;
    }
    // 标题栏文字
    var titleLabel = document.createElement(“div”);
    titleLabel.style.height = “14px”;
    titleLabel.style.width = “200px”;
    titleLabel.style.fontSize = “11px”;
    titleLabel.style.color = “#ffffff”;
    titleLabel.style.styleFloat = titleLabel.style.cssFloat = “left”;
    titleLabel.style.fontFamily = “verdana,tahoma”;
    titleLabel.innerHTML = “Javascript Inline Debugger”;
    //titleLabel.style.marginTop = isIE() ? -14 : “-14px”;
    titleLabel.style.marginLeft = isIE() ? 18 : “18px”;
    title.appendChild(titleLabel);
    // 中间的显示部分
    var showPanel = document.createElement(“div”);
    showPanel.style.width = “250px”;
    showPanel.style.height = isIE() ? “221px” : “219px”;
    showPanel.style.fontSize = “11px”;
    showPanel.style.padding = “0”;
    showPanel.style.margin = “0”;
    showPanel.style.overflow = “auto”;
    showPanel.style.marginTop = isIE() ? -1 : “0”;
    panel.appendChild(showPanel);
    // 命令输入框
    var cmdArea = document.createElement(“div”);
    panel.appendChild(cmdArea);
    var cmdTextbox = document.createElement(“input”);
    cmdTextbox.type = “text”;
    cmdTextbox.style.width = “250px”;
    cmdTextbox.style.height = “12px”;
    cmdTextbox.style.fontSize = “12px”;
    cmdTextbox.style.padding = “0”;
    cmdTextbox.style.margin = “0”;
    cmdTextbox.style.marginTop = isIE() ? -2 : “0”;
    cmdTextbox.style.borderWidth = “0”;
    cmdTextbox.style.borderTopWidth = “1px”;
    cmdTextbox.style.paddingTop = “2px”;
    cmdArea.appendChild(cmdTextbox);
    // 窗口激活或者不激活
    var isActive = false;
    // 激活窗口
    var activateWindow = function() {
    if (! isVisible) {
    return;
    }
    if (isActive) {
    return;
    }
    cmdTextbox.focus();
    title.style.backgroundColor = “#015DF4”;
    isActive = true;
    }
    panel.onclick = activateWindow;
    // 不激活窗口
    var deactivateWindow = function() {
    if (! isVisible) {
    return;
    }
    if (! isActive) {
    return;
    }
    title.style.backgroundColor = “#cccccc”;
    isActive = false;
    }
    cmdTextbox.onfocus = activateWindow;
    cmdTextbox.onblur = deactivateWindow;
    // 输出函数
    var dbgPrint = function(s) {
    showPanel.innerHTML += htmlEncode(s).replace(//n|(/r/n)/g, “<br />”);
    if (parseInt(showPanel.scrollHeight) > parseInt(showPanel.style.height)) {
    showPanel.scrollTop += parseInt(showPanel.scrollHeight) – parseInt(showPanel.style.height);
    }
    }
    // 调用输入处理回调函数
    cmdTextbox.onkeydown = function(evt) {
    var event = evt || window.event;
    if (event.keyCode == 0x0d) {
    processInputProc(this.value, dbgPrint);
    this.value = “”;
    }
    }
    }
    // 坐标类
    function Position(x, y) {
    this.x = x;
    this.y = y;
    }
    //————————————————————————–//
    // 内联调试器类
    //————————————————————————–//
    function InlineDebugger() {
    var bpList = new Array();
    var id_eval;
    // 设置断点
    var bp = function(funcName) {
    // 检查eval是否被hook
    if ((new String(eval)).indexOf(“[native code]”) < 0) {
    return “error: eval function was hooked by other codes in the front./n”;
    }
    // 保存未被hooked的eval
    id_eval = eval;
    var re = /^[a-zA-Z0-9_/.]+$/i;
    if (! re.test(funcName)) {
    return “error: bad argument of command bp /”” + funcName + “/”./n”;
    }
    try {
    id_eval(“if (typeof(” + funcName + “) == /”object/” || typeof(” + funcName + “) == /”function/”) {var obj = ” + funcName + “;}”);
    } catch (e) {
    return “error: ” + e + “, invalid function name /”” + funcName + “/”./n”;
    }
    if (obj == undefined) {
    return “error: the argument of command bp /”” + funcName + “/” is not a function object./n”;
    }
    if ((new String(obj)).indexOf(“function”) < 0) {
    return “error: the argument of command bp /”” + funcName + “/” is a property, a function is required./n”;
    }
    if (bpList.search(funcName) >= 0) {
    return “error: there is a breakpoint on function /”” + funcName + “/”/n”;
    }
    try {
    var sc = “window.” + funcName.replace(//./g, “_”) + “_bak = ” + funcName + “;/n” +
    funcName + ” = ” +
    “function() {/n” +
    ”    var args = /”/”;/n” +
    ”    for (var i = 0; i < arguments.length; i ++) {/n” +
    ”        args += arguments[i] + (i == (arguments.length – 1) ? /”/” : /”,/”);/n” +
    ”    }/n” +
    ”    if (confirm(/”function ///”” + funcName + “///” was called, execute it?//n//narguments://n/” + args + /”//n//ncaller://n/” + ” + funcName + “.caller)) {/n” +
    ”        id_eval(/”” + funcName.replace(//./g, “_”) + “_bak(///”/” + jsEncode(args) + /”///”)/”);/n” +
    ”    }/n” +
    “};” +
    “/n”;
    id_eval(sc);
    bpList.push(funcName);
    return “* breakpoint on function /”” + funcName + “/” added successfully./n”;
    } catch (e) {
    return “unkown error: ” + e + “./n”;
    }
    }
    // 枚举所有的断点
    var bl = function() {
    if (bpList.length == 0) {
    return “* no breakpoint./n”;
    }
    var bps = “* ” + bpList.length + ” breakpoints: /n”;
    for (var i = 0; i < bpList.length; i ++) {
    bps += i + ” – ” + bpList[i] + “/n”;
    }
    return bps;
    }
    // 清除某个断点
    var bc = function(n) {
    try {
    n = parseInt(n);
    } catch (e) {
    return “error: bc command requires a numeric argument./n”;
    }
    if (bpList.length == 0) {
    return “error: no breakpoint./n”;
    }
    var funcName = bpList.remove(n);
    try {
    eval(funcName + ” = window.” + funcName.replace(//./g, “_”) + “_bak;”);
    return “* breakpoint on function /”” + funcName + “/” deleted successfully./n”;
    } catch (e) {
    return “error: ” + e + “./n”;
    }
    }
    // 帮助
    var help = function() {
    var s = “debug commands:/n/n” +
    “bp <function name> – set a breakpoint on a function, e.g. /”bp window.alert/”./n” +
    “bl – list all breakpoints./n” +
    “bc <breakpoint number> – remove a breakpoint by specified number, e.g. /”bc 0/”./n” +
    “help – help information./n”
    “/n”;
    return s;
    }
    // 处理命令
    this.exeCmd = function(cmd) {
    cmd = cmd.trim();
    var cmdParts = cmd.split(//s+/g);
    var cmdName;
    var cmdArg;
    if (cmdParts.length == 1) {
    cmdName = cmd;
    } else {
    cmdName = cmdParts[0];
    cmdArg = cmdParts[1];
    }
    switch (cmdName) {
    case “bp”:
    if (cmdArg == undefined) {
    return “error: bp command requires an argument./n”;
    } else {
    return bp(cmdArg);
    }
    break;
    case “bl”:
    return bl();
    break;
    case “bc”:
    if (cmdArg == undefined) {
    return “error: bc command requires an argument /”number of breakpoint/”./n”;
    } else {
    return bc(cmdArg);
    }
    break;
    case “help”:
    return help();
    break;
    default: return “error: command /”” + cmdName + “/” not found, you can get information by /”help/” command./n”;
    break;
    }
    }
    }
    //—————————————————————————–//
    // 主过程
    //—————————————————————————–//
    /*try {
    debugger;
    } catch (e) {}*/
    var id = new InlineDebugger();
    var console = new Console(document.body, function(s, printProc){printProc(id.exeCmd(s));});

    原文地址:http://www.xfocus.net/articles/200712/963.html

  • net破解一(反编译,反混淆-剥壳) (转)

    大家好,前段时间做数据分析,需要解析对方数据,而数据文件是对方公司内部的生成方式,完全不知道它是怎么生成的. 不过还好能拿到客户端(正好是C#开发)所以第一件事就是用Reflector编译,但是没有想象的那么简单,看看反编译结果

    代码已经混淆了,方法体内部处理也看不见 ,怎么办喃?

    现在就来说说反混淆(剥壳)那些事

    目前比较常用的混淆(加壳)有Dotfuscator,MaxToCode,Xenocode,ThemIDA.

    反混淆的工具有很多Dedot ,DePhe,XeCoString等,但是这些只能剥对应算法,今天重点推荐一个工具 De4Dot

    De4Dot支持多种反混淆.Dotfuscator,MaxToCode这两种是网友测试的,Xenocode是我测试的,

    官方介绍支持:

    • Agile.NET (aka CliSecure)
    • Babel.NET
    • CodeFort
    • CodeVeil
    • CodeWall
    • CryptoObfuscator
    • DeepSea Obfuscator
    • Dotfuscator
    • .NET Reactor
    • Eazfuscator.NET
    • Goliath.NET
    • ILProtector
    • MaxtoCode
    • MPRESS
    • Rummage
    • Skater.NET
    • SmartAssembly
    • Spices.Net
    • Xenocode

    源码:

    可以看出de4dot确实能剥很多算法的壳,很强大!

    现在来试试

    它在我指定文件同目录下生成了 X-cleaned.(exe/dll) 文件,我们在用Reflector来解析一下

    成功了,是不是应该欢呼一下. 如果有更强大的工具,求通知!

    大家发现没,现在这个客户端是需要登录的,而我没有账户密码,而我想进去怎么办?

    本篇只是过渡用,主要是下一篇,如何修改对方dll,跳过登录过程,所谓的破解

    如果有兴趣的朋友想了解核心算法,可以去官网下来看https://bitbucket.org/0xd4d/de4dot/overview 开源的

    发现问题 请留言,如果喜欢请推荐一下,

    转载请注明出处! 谢谢

    转自:http://www.cnblogs.com/jio92/p/de4dot.html

  • MaxToCode(quote)

    MaxtoCode对.Net程序加密的原理及解密探讨一

    MaxtoCode对.Net程序加密的原理及解密探讨二

    由浅至深 谈谈.NET混淆原理(三)– 流程混淆(续)

    由浅至深 谈谈.NET混淆原理(三)– 流程混淆

    由浅至深 谈谈.NET混淆原理 (四) — 反混淆(原理 + 工具篇)

    由浅至深,谈谈.NET混淆原理 — 五(MaxtoCode原理),六(其它保护方法)

     

    原地址:http://aplo.cnblogs.com/archive/2006/07/18/453600.html

    看到了关于MaxToCode的破解文章我也来谈谈我的破解过程。
    我也研究过,并且自己写出了一个类似的程序,MaxToCode起到一定保护作用,因为任何给予CRT的托管代码都逃不过Profile的检查,如果编写一个Profile程序(可以参考MSDN),在CRT编译开始的时候动态读取内存内容,就可以得到Assembly的实际编码内容。
    先讲一下MaxToCode的原理,
    被MaxToCode加密过的程序运行过程如下:
    1.CRT加载加密Assembly。
    2.程序调用加密Assembly中的类。
    3.执行被调用加密Assembly中类的静态构造函数(这就是MaxToCode进行IL转换时候添加的,如果该类存在静态构造函数,则把该函数改名,然后添加自己的函数,再在函数末尾调用原来的函数。MaxToCode添加静态函数的原因就是,在执行加密的类代码之前,动态解密加密Assembly原来的IL代码,再将代码根据IL表恢复原有代码存放的内存地址,这时候CRT编译加密类的某个被调用的方法时,程序代码时已经是原有代码了,并不是加密过的代码。其主要应用的Win32API是MemoryWrite,MemoryRead)
    经过第3步以后,内存中的代码已经是没有加密的代码了,这时候可以动态读取内存,得到源代码,OK!破解了。
    4.程序按照原有的执行顺序执行。
    ………………
    MaxToCode大体的执行过程就是这个样子的。可能会略有出入。不过思路应该是一致的,
    根据上面的执行过程我们也不难猜出其的加密过程(不一定完全一致,思路差不多)
    1.利用ildasm.exe反编译程序,得到IL代码。(调用Win32API:CreateProcess或者WinExec,并加上程序运行参数)
    2.去掉签名和注释。
    3.分析IL代码(应该是利用正则表达式)
    4.判断Assmebly中每个Class是否含有静态构造函数,如果没有加上自己的函数作为该类的静态构造函数,否则将原有的方法改名,添加自己的函数并在函数末尾调用被改名的函数。该函数就是动态解密的函数,这个函数在它附带的DLL中。
    5.保存更改好的IL代码。并利用 ILAsm.exe 编译更改的代码。(这时候并没有加密原有函数)
    注:MaxToCode中间处理的IL代码被保存在“C:\Documents and Settings\[用户名]\Local Settings\Temp”临时目录里,好像是这个,因为破解太久了记不清了,你可以搜索一下“C:\Documents and Settings\[用户名]”而且在其编译IL完后,好像没有删除更改和没有更改的IL代码。你可以利用windows的搜索上面这个目录后缀为il的文件。应该就是了。
    6.打开编译好的文件(DLL或EXE)根据文件的原数据,找到每个类方法的文件偏移量以及大小,读取其内容进行加密,写入文件的其它位置(具体我没有分析,你可以新建一个Section,也可以修改原有的Section,然后更改偏移量。具体做法很多,你可以参考PE文件结构),最后修改原有每个类方法的数据(不知道是不是糊填的,没有研究)并保存该DLL或EXE,并将MaxToCode附带的解密DLL拷贝到程序目录下。
    7.加密过程完成。
    基本思路是如此,此外还会涉及到别的比如资源等等。
    差不多也就说到这里了。MaxToCode完全可以对它进行解密。而且无论其算法在安全,利用CRT自动检测文件的特性(比如说不能修改其入口地址等等,如果出错就报错。),绕过它的算法。进行破解。
    总而言之,对于大型程序来讲。模糊处理还是一种最安全有效的方法。因为没有人能够看懂几百万行,没有注释,变量名随机的代码。
    除非那个人是“天才”。
    这里有我做的一个类似的加密程序(没有做签名处理,所以不要用带签名的程序)