整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

EXE防破解

EXE防破解

们所说的exe文件是window可执行文件,Portable Excutable,简称PE文件

PE文件格式

Portable_Executable_32_bit_Structure

exe破解所涉及的技术属于软件逆向工程软件逆向可以绕过软件使用限制、利用软件漏洞、制造外挂等。逆向工程并不能直接还原代码,但是可以分析行为特征来还原算法,从汇编层面修改程序执行流程。

如何破解

http://www.cjzzc.com/article/853.html

逆向破解步骤

· 反编译

· 调试

· 修改数据

防护策略

如何防护

· 防止反编译

· 反调试

· 防篡改

具体落地就是加壳


所谓的“壳”就是一种对软件进行保护的加密程序,它可以具体分为三种:(1)压缩壳压缩壳的主要目的是压缩应用程序的体积,例如最稳定的UPX可以将一般的应用程序压缩到原体积的30%左右。压缩壳并不会对被加壳程序本身做任何修改,而是直至将其换成一种更加节省空间的存储方式,其目的大致类似于我们经常使用的RAR或ZIP。经过压缩壳处理过的程序在真正被CPU执行前是会自动解压缩(解密)的。(2)加密壳加密壳的主要目的是保护原程序不被破解,一般情况下,经过加密壳处理的应用程序体积会增加,但也有部分加密壳结合了压缩壳的特性,会在加密完成后再进行压缩。而且一般情况下,加密壳会对原程序进行一定的修改,例如代码乱序、代码混淆等,因此经过加密壳处理的程序即便是提交给CPU去执行,原程序的代码也还是发生了改变。(3)虚拟机保护壳虚拟机保护壳是近几年在软件安全领域内流行起来的一种非常强悍的加密保护方案。它的关键技术就在于实现了一个软件版的CPU,被加密的可执行代码已经不再遵守Intel制定的OPCode标准了,而是执行由虚拟机作者本身制定的非公开的、动态的CPU指令编码解码标准,我们通常称之为TextCode。虚拟机保护壳会将被保护程序的可执行代码重新编码为自己的软件CPU可以识别的格式,并进行存储、加载及模拟执行。因此在任何时候,原程序代码对外界来说都将是一个彻底的黑盒,任何人都很难破解。

现在的壳已经变成一种混合壳,兼具以上几种功能。

加壳工具的工作原理解析二进制先将文件拆开成一个个block,这些 Block 有可能是一个函数,也有可能是一个函数的一部分,里面有地址和代码指令。可以针对每一个 Block 选择加密方式了,如混淆、加密、虚拟化,不同的加密方式强度不同,对性能的影响也不同,重要的 Block 可以选安全强度最高的,不重要 Block 的选性能最好的或不保护。安装壳代码在程序外部套上壳代码,加上加密和虚拟化手段以及授权方式,程序启动从壳开始。编译保护将block进行保护,实施假分支、立即数加密、指令混淆、虚拟化、代码加密等技术,使得Block 会被掰开、揉碎、打散,变成多个 Block,而且还分散在各处,不易被反编译。链接和保存对之前大三的block进行链接,重定位,使程序加壳后能够正常执行

几款加壳工具(评价收集于网上,仅参考)

Virbox Protector(商用)分带授权的版本和独立壳。带授权的版本加壳后需要绑定许可,许可控制软件能否用,加壳保护安全。独立版的话就只是对代码做加壳,防止代码反编译。碎片代码执行、外壳加密、混淆、数据加密。服务商提供了较为完善的文档以及加密方式,提供了较为充分的产品管理平台,以及云端网络加密,并且对于开发者免费使用。使用评价:简单下载使用了一下,提供的功能很多,并且管理平台较好。比较推荐这一个软件。

https://shell.virbox.com/

DRMsoft EncryptEXE加密模式:非绑定模式 ---- 加密后的文件不绑定用户电脑,但用户需要一个开启密码才可以打开绑定模式 ---- 一机一码授权,加密后的文件不同用户电脑需要不同的开启密码无密码模式 ---- 加密后的文件无需要开启密码即可运行,仅对原始文件做加密保护一码通模式 ---- 采用相同秘钥和产品编号加密的不同文件,在同台电脑上只需认证一次特点:可以设置加密后文件的运行次数和有效期;可以设置加密文件运行过程中锁定用户键盘;可以设置加密文件运行中禁用鼠标右键;可以设置用户提示语,在用户打开之前显示给用户;可以禁止拷贝、编辑、打印;可以禁止虚拟机运行;可以设置加密后的文件只能从命令行打开运行,以便只有你自己的程序可以调用他;可以禁用打印机;

可以检测用户电脑是否开启远程桌面服务并终止运行

http://www.drmsoft.net/

EXECryptor有支持代码和资源的压缩;压缩功能主要用来减少带宽占用和加快下载速度。支持多种文件格式,在保护代码中插入不同的处理器指令或代码片段,并使用其它指令替换,这些指令的运算结果都是相同的。是在 CPU 指令层面上混乱代码而不是在应用层上。

网络评价兼容性不是很好,但是加密安全性表现良好。

VProject(有破解版)原创虚拟机保护引擎、随机指令集、随机填充代码、代码乱序执行、外壳保护、反内存转储存、区段合并、资源加密、反调试、防修改。使用拟机乱序引擎,可以阻止绝大多数人逆向分析。使用SDK,进行重点加密。所以基本上不影响程序运行效率自带授权系统,正常用户管理系统,黑名单,加密SDK,授权API等实用功能,分析使用Vprotect保护后的程序,将不仅仅是一项技术活,同时也会成为高强度的体力活。

Axprotect(商用)加密方式:

在运行时自动解密和重新加密软件的技术,为软件提供自动防护。该技术目前支持多种操作平台,诸如Windows,Linux,Mac OS,.NET 及Java应用程序等等。所有的用户收到的是相同的被保护软件版本。可以针对不同用户购买的不同功能模块或者产品类型,个性化生成对应的许可信息。您有权决定客户以何种方式接受许可,或者将许可存放至CmDongle加密狗中发放给客户,或者通过CmAct许可文件进行发放。可以对客户分配相应的许可类型,例如本地单用户许可、网络并发许可、时间限制型许可(适用于软件测试版)。

特点:

Protection 保护工具用于实现高安全强度的保护软件,防止盗版及逆向工程

Licensing 授权工具用于实现便捷、安全的软件授权,包括创建灵活的授权模式、整合软件的业务流程,以及采用企业现行的办公后台系统对软件所有的生命周期进行完整的管理。

Security 安全工具监控软件最终使用者,防止来自第三方的恶意篡改及攻击。

Vmproject(商用软件、长期更新)虚拟机保护机制,安全系数较高,破解难度大

VMProtect允许对可执行文件(EXE、SCR)、动态链接库(DLL,OCX,BPL)和驱动程序(SYS)进行保护。VMProtect允许对32位和64位应用、库和驱动进行保护。MProtec保护的文件可以在几乎任何版本Windows OS上运行,自Windows 95开始。32和64位版本都被支持,VMProtect兼容DEP和UAC。VMProtect允许生成和验证序列号。手动和自动生成都被支持。序列号可以是有限的时间或日期和硬件锁定的,而免费升级期间也可以被限制。VMProtect确保它实际上无法运行没有一个序列号代码。

网络评价:

加密的安全级别很高,破解难度很大,但是加密数据多,可能会影响系统的性能。

主要功能是代码加密、内存打乱

文章出自【码同学软件测试

码同学公众号:自动化软件测试

码同学抖音号:小码哥聊软件测试


在UI自动化中,我们经常会遇到上传文件操作。处理上传事件是一个比较麻烦的操作,因为点击上传控件会弹出Windows窗口供用户选择文件,但是Windows窗口是浏览器之外的组件,所以selenium本身无法处理这个windows窗口。这里给大家几个处理思路,我们先看一下下面这个HTML。

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />

<title>test</title>

<script language="javaScript">

function toAlert()

{

alert("hello continue...");

}


</script>

</head>

<body>

<form>

<table >


<tr>


<td>

<input name="file" type="file"/>

</td>


</tr>



</table>

</form>

</body>

</html>


用notepad++ 打开,将它存成一个 autotest.html文件,打开之后,只有一个上传按钮,我们来看一下怎么处理上传事件。


1


直接调用selenium自带的sendkeys进行操作,将需要上传的文件路径直接传递进上传控件。


2.import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

/**
* Description:
* Author: ChrisMa
* Date: 2019-05-15
*/
public class testupload2
{
public static void main
(String ags[]) throws InterruptedException {
//初始化webdriver
WebDriver driver=new ChromeDriver
();
//打开本地html
driver.get
("file:///D:/UI/autotest1.html");
// 将文件所在路径传递给上传文件控件
driver.findElement
(By.name("file")).sendKeys("D:\text.txt");
// 等待看到结果
Thread.
sleep(10000);
//关闭webdriver
driver.quit
();

}
}


这种方案可以解决大部分的上传操作,可是对于一些上传框禁止输入的就无法操作了,这时候我们就要考虑其他方案。

免费领取 码同学软件测试 课程笔记+超多学习资料+完整视频+最新面试题,可以转发文章 + 私信「码同学666」获取资料哦

2


针对无法输入的,我们可以考虑采用AutoIT来进行上传。

AutoIt目前最新是v3版本,这是一个使用类似BASIC脚本语言的免费软件,它设计用于Windows GUI(图形用户界面)中进行自动化操作。它利用模拟键盘按键,鼠标移动和窗口/控件的组合来实现自动化任务。

官方网站:https://www.autoitscript.com/site/

从网站上下载AutoIt并安装,安装完成在菜单中会看到下图的目录:


AutoIt Windows Info 用于帮助我们识Windows控件信息。

Compile Script to.exe 用于将AutoIt生成 exe 执行文件。

Run Script 用于执行AutoIt脚本。

SciTE Script Editor 用于编写AutoIt脚本。

我们打开html 网页,然后点击一下上传按钮:


下面我们看一下怎么用autoIT来处理这个上传。

? 打开AutoIT Window Info,然后点击Finder Tool,不松开左键,等鼠标变成瞄准器类型时,将鼠标挪动到文件上传框需要识别的控件上松开左键。

识别出对象之后所有的信息会显示在AutoIT windows info里

经过识别窗口的title为“Open”,标题的Class为“#32770”。

文件名输入框的class 为“Edit”,Instance为“1” ,所以ClassnameNN为“Edit1”。

打开按钮的class 为“Button”,Instance为“1” ,所以ClassnameNN为“Button1”。

我们打开SciTE Script Editor,然后将下列代码填入:


;ControlFocus("title","text",controlID) Edit1=Edit instance 1

ControlFocus("Open", "","Edit1")



; Wait 10 seconds for the Upload window to appear

WinWait("[CLASS:#32770]","",10)



; Set the File name textmargin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; clear: both; min-height: 1em; color: rgb(51, 51, 51); font-family: -apple-system-font, system-ui, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif; font-size: 17px; letter-spacing: 0.544px; text-align: left; text-indent: 39pt;">

ControlSetText("Open", "", "Edit1", "D: est.txt")


Sleep(2000)


; Clickmargin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; clear: both; min-height: 1em; color: rgb(51, 51, 51); font-family: -apple-system-font, system-ui, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif; font-size: 17px; letter-spacing: 0.544px; text-align: left; text-indent: 39pt;">

ControlClick("Open", "","Button1");


将script在SciTE Script Editor保存之后,打开上传窗口,在SciTE Script Editor中选择Tools->go, 来查看一下文件是否可以上传。

确认脚本运行正常, 我们将这个脚本保存成Script.au3, 然后打开Compile Script to.exe,将Script.au3文件转换为Script.exe:

这个时候,我们打开上传文件控件,双击Script.exe文件,可以看到文件上传事件已经处理成功。


免费领取 码同学软件测试 课程笔记+超多学习资料+完整视频+最新面试题,可以转发文章 + 私信「码同学666」获取资料哦


接下来,就是使用java来调用该EXE文件:

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import java.io.IOException;

/**
* Description:
* Author: ChrisMa
* Date: 2019-05-15
*/
public class testupload2
{
public static void main
(String ags[]) throws InterruptedException {
//初始化webdriver
WebDriver driver=new ChromeDriver
();
//打开本地html
driver.get
("file:///D:/ UI/autotest.html");
// 点击选择文件按钮
driver.findElement
(By.name("file")).click();
// 设置等待3秒
Thread.
sleep(3000);
// Java 的Runtime 模块的getruntime.exec()方法可以调用exe 程序并执行。
Runtime exe=Runtime.
getRuntime();
try
{
String str="D://Script.exe";
// 运行指定位置的.exe文件
exe.exec
(str);
} catch (IOException e) {
System.
out.println("Error to run the exe");
e.printStackTrace
();
}
// 等待看到结果
Thread.
sleep(10000);
//关闭webdriver
driver.quit
();

}
}


借助AutoIT也有自己的限制,比如只能在Windows系统中进行,如果要移植到其他系统,就得参考其他方式。

3


如果想在非Windows系统中处理上传,我们可以用纯Java的形式处理,这时候,我们就要用到Robot这个类,在该过程中流程表现为:打开上传文件的控件->将文件在磁盘上的路径,通过robot copy pasty进去(需要文件输入框默认是光标聚焦)->按下回车,触发弹窗确定按钮,完成文件上传过程

4

代码如下:

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

import java.awt.*;
import java.awt.datatransfer.StringSelection;
import java.awt.event.KeyEvent;

/**
* Description:
* Author: ChrisMa
* Date: 2019-05-15
*/
public class testupload
{
public static void main
(String ags[]) throws InterruptedException, AWTException {
//初始化webdriver
WebDriver driver=new ChromeDriver
();
//打开本地html
driver.get
("file:///D:/ UI/autotest.html");
// 指定上传文件的路径
StringSelection sel=new StringSelection
("D:\test\test1.txt");

// 把图片文件路径复制到剪贴板
Toolkit.
getDefaultToolkit().getSystemClipboard().setContents(sel,null);
System.
out.println("selection" +sel);

// 点击上传按钮
driver.findElement
(By.name("file")).click();
// 新建一个Robot类的对象
Robot robot=new Robot
();
Thread.
sleep(1000);

// 按下回车
robot.keyPress
(KeyEvent.VK_ENTER);

// 释放回车
robot.keyRelease
(KeyEvent.VK_ENTER);

// 按下 CTRL+V
robot.keyPress
(KeyEvent.VK_CONTROL);
robot.keyPress
(KeyEvent.VK_V);

// 释放 CTRL+V
robot.keyRelease
(KeyEvent.VK_CONTROL);
robot.keyRelease
(KeyEvent.VK_V);
Thread.
sleep(1000);

// 点击回车 Enter
robot.keyPress
(KeyEvent.VK_ENTER);
robot.keyRelease
(KeyEvent.VK_ENTER);
// 等待看到结果
Thread.
sleep(10000);
//关闭webdriver
driver.quit
();
}
}

上传文件咱们就先处理到这里,希望可以给大家开阔思路,大家下次见。


END

免费领取码同学软件测试课程笔记+超多学习资料+学习完整视频,可以关注我们公众号哦:自动化软件测试

本文著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

、配置Windows注册表

    为了通过HTML超链接调用本地的show.exe程序并传递参数,需要先在Windows注册表中定义一个新的URL协议处理程序。以下步骤将指导您如何创建一个.reg文件来执行此操作:

    1. 创建一个新的文本文件,并将其保存为.reg扩展名(例如,showProtocol.reg)。

    2. 使用文本编辑器打开该文件,并添加以下内容:

    Windows Registry Editor Version 5.00

    [HKEY_CLASSES_ROOT\show]

    @="URL:Show Protocol Handler"

    "URL Protocol"=""

    [HKEY_CLASSES_ROOT\show\DefaultIcon]

    @="D:\show.exe"

    [HKEY_CLASSES_ROOT\show\shell]

    [HKEY_CLASSES_ROOT\show\shell\open]

    [HKEY_CLASSES_ROOT\show\shell\open\command]

    @="\"D:\show.exe\" \"%1\""

    1. 保存并关闭文件。

    2. Windows资源管理器中双击该.reg文件,系统将提示您导入注册表更改。确认后,这些更改将被应用到Windows注册表中。

    二、在HTML页面中创建指向自定义URL协议的链接

    HTML页面中,您可以使用<a>标签创建一个指向自定义URL协议的链接。例如,要调用show.exe并传递参数cmd,可以编写如下代码:

    <a href="show://cmd/"target="_blank">调用本地show.exe,传入参数cmd</a>

    当用户点击这个链接时,Windows将使用在注册表中定义的命令来执行show.exe,并将cmd作为参数传递。

    三、在本地show.exe程序中处理命令行参数

    为了使show.exe能够接收和处理通过URL传递的参数,您需要在程序中实现相应的逻辑。以下是一个简化的C++代码示例,展示了如何将命令行参数转换为字符串并进行处理:

    #include<iostream>

    #include<string>

    #include<windows.h>

    // 假设Common是一个包含辅助函数的命名空间或类

    // 例如,GetSubstr函数用于从字符串中提取子串,WriteLogs函数用于记录日志

    intmain(intargc, char* argv[]){

    // 命令行参数位于argv数组中,其中argv[0]是程序路径,argv[1]及之后是传入的参数

    if(argc > 1) {

    // 第二个参数(argv[1])将包含通过URL传递的参数

    std::string cmdLine=argv[1]; // 直接使用argv[1]而不是lpCmdLine(在WinMain中使用)

    // 将命令行参数进行适当处理,这里简单打印出来

    std::cout << "Received command line argument: "<< cmdLine << std::endl;

    // 如果需要更复杂的解析,可以使用类似Common::GetSubstr的函数

    // std::string strCmd;

    // if (Common::GetSubstr(cmdLine, /*...*/, strCmd)) {

    // Common::WriteLogs(strCmd.c_str());

    // }

    } else{

    std::cout << "No command line argument provided."<< std::endl;

    }

    return0;

    }

    请注意,此示例假设show.exe是一个控制台应用程序,并且使用标准输出(std::cout)来打印接收到的参数。在实际应用中,您可能需要根据程序的类型(如GUI应用程序)和需求来调整参数处理逻辑。