PE文件格式
Portable_Executable_32_bit_Structure
exe破解所涉及的技術(shù)屬于軟件逆向工程軟件逆向可以繞過軟件使用限制、利用軟件漏洞、制造外掛等。逆向工程并不能直接還原代碼,但是可以分析行為特征來還原算法,從匯編層面修改程序執(zhí)行流程。
http://www.cjzzc.com/article/853.html
逆向破解步驟
· 反編譯
· 調(diào)試
· 修改數(shù)據(jù)
如何防護(hù)
· 防止反編譯
· 反調(diào)試
· 防篡改
具體落地就是加殼
所謂的“殼”就是一種對(duì)軟件進(jìn)行保護(hù)的加密程序,它可以具體分為三種:(1)壓縮殼壓縮殼的主要目的是壓縮應(yīng)用程序的體積,例如最穩(wěn)定的UPX可以將一般的應(yīng)用程序壓縮到原體積的30%左右。壓縮殼并不會(huì)對(duì)被加殼程序本身做任何修改,而是直至將其換成一種更加節(jié)省空間的存儲(chǔ)方式,其目的大致類似于我們經(jīng)常使用的RAR或ZIP。經(jīng)過壓縮殼處理過的程序在真正被CPU執(zhí)行前是會(huì)自動(dòng)解壓縮(解密)的。(2)加密殼加密殼的主要目的是保護(hù)原程序不被破解,一般情況下,經(jīng)過加密殼處理的應(yīng)用程序體積會(huì)增加,但也有部分加密殼結(jié)合了壓縮殼的特性,會(huì)在加密完成后再進(jìn)行壓縮。而且一般情況下,加密殼會(huì)對(duì)原程序進(jìn)行一定的修改,例如代碼亂序、代碼混淆等,因此經(jīng)過加密殼處理的程序即便是提交給CPU去執(zhí)行,原程序的代碼也還是發(fā)生了改變。(3)虛擬機(jī)保護(hù)殼虛擬機(jī)保護(hù)殼是近幾年在軟件安全領(lǐng)域內(nèi)流行起來的一種非常強(qiáng)悍的加密保護(hù)方案。它的關(guān)鍵技術(shù)就在于實(shí)現(xiàn)了一個(gè)軟件版的CPU,被加密的可執(zhí)行代碼已經(jīng)不再遵守Intel制定的OPCode標(biāo)準(zhǔn)了,而是執(zhí)行由虛擬機(jī)作者本身制定的非公開的、動(dòng)態(tài)的CPU指令編碼解碼標(biāo)準(zhǔn),我們通常稱之為TextCode。虛擬機(jī)保護(hù)殼會(huì)將被保護(hù)程序的可執(zhí)行代碼重新編碼為自己的軟件CPU可以識(shí)別的格式,并進(jìn)行存儲(chǔ)、加載及模擬執(zhí)行。因此在任何時(shí)候,原程序代碼對(duì)外界來說都將是一個(gè)徹底的黑盒,任何人都很難破解。
現(xiàn)在的殼已經(jīng)變成一種混合殼,兼具以上幾種功能。
加殼工具的工作原理解析二進(jìn)制先將文件拆開成一個(gè)個(gè)block,這些 Block 有可能是一個(gè)函數(shù),也有可能是一個(gè)函數(shù)的一部分,里面有地址和代碼指令。可以針對(duì)每一個(gè) Block 選擇加密方式了,如混淆、加密、虛擬化,不同的加密方式強(qiáng)度不同,對(duì)性能的影響也不同,重要的 Block 可以選安全強(qiáng)度最高的,不重要 Block 的選性能最好的或不保護(hù)。安裝殼代碼在程序外部套上殼代碼,加上加密和虛擬化手段以及授權(quán)方式,程序啟動(dòng)從殼開始。編譯保護(hù)將block進(jìn)行保護(hù),實(shí)施假分支、立即數(shù)加密、指令混淆、虛擬化、代碼加密等技術(shù),使得Block 會(huì)被掰開、揉碎、打散,變成多個(gè) Block,而且還分散在各處,不易被反編譯。鏈接和保存對(duì)之前大三的block進(jìn)行鏈接,重定位,使程序加殼后能夠正常執(zhí)行
Virbox Protector(商用)分帶授權(quán)的版本和獨(dú)立殼。帶授權(quán)的版本加殼后需要綁定許可,許可控制軟件能否用,加殼保護(hù)安全。獨(dú)立版的話就只是對(duì)代碼做加殼,防止代碼反編譯。碎片代碼執(zhí)行、外殼加密、混淆、數(shù)據(jù)加密。服務(wù)商提供了較為完善的文檔以及加密方式,提供了較為充分的產(chǎn)品管理平臺(tái),以及云端網(wǎng)絡(luò)加密,并且對(duì)于開發(fā)者免費(fèi)使用。使用評(píng)價(jià):簡單下載使用了一下,提供的功能很多,并且管理平臺(tái)較好。比較推薦這一個(gè)軟件。
https://shell.virbox.com/
DRMsoft EncryptEXE加密模式:非綁定模式 ---- 加密后的文件不綁定用戶電腦,但用戶需要一個(gè)開啟密碼才可以打開綁定模式 ---- 一機(jī)一碼授權(quán),加密后的文件不同用戶電腦需要不同的開啟密碼無密碼模式 ---- 加密后的文件無需要開啟密碼即可運(yùn)行,僅對(duì)原始文件做加密保護(hù)一碼通模式 ---- 采用相同秘鑰和產(chǎn)品編號(hào)加密的不同文件,在同臺(tái)電腦上只需認(rèn)證一次特點(diǎn):可以設(shè)置加密后文件的運(yùn)行次數(shù)和有效期;可以設(shè)置加密文件運(yùn)行過程中鎖定用戶鍵盤;可以設(shè)置加密文件運(yùn)行中禁用鼠標(biāo)右鍵;可以設(shè)置用戶提示語,在用戶打開之前顯示給用戶;可以禁止拷貝、編輯、打印;可以禁止虛擬機(jī)運(yùn)行;可以設(shè)置加密后的文件只能從命令行打開運(yùn)行,以便只有你自己的程序可以調(diào)用他;可以禁用打印機(jī);
可以檢測(cè)用戶電腦是否開啟遠(yuǎn)程桌面服務(wù)并終止運(yùn)行
http://www.drmsoft.net/
EXECryptor有支持代碼和資源的壓縮;壓縮功能主要用來減少帶寬占用和加快下載速度。支持多種文件格式,在保護(hù)代碼中插入不同的處理器指令或代碼片段,并使用其它指令替換,這些指令的運(yùn)算結(jié)果都是相同的。是在 CPU 指令層面上混亂代碼而不是在應(yīng)用層上。
網(wǎng)絡(luò)評(píng)價(jià)兼容性不是很好,但是加密安全性表現(xiàn)良好。
VProject(有破解版)原創(chuàng)虛擬機(jī)保護(hù)引擎、隨機(jī)指令集、隨機(jī)填充代碼、代碼亂序執(zhí)行、外殼保護(hù)、反內(nèi)存轉(zhuǎn)儲(chǔ)存、區(qū)段合并、資源加密、反調(diào)試、防修改。使用擬機(jī)亂序引擎,可以阻止絕大多數(shù)人逆向分析。使用SDK,進(jìn)行重點(diǎn)加密。所以基本上不影響程序運(yùn)行效率自帶授權(quán)系統(tǒng),正常用戶管理系統(tǒng),黑名單,加密SDK,授權(quán)API等實(shí)用功能,分析使用Vprotect保護(hù)后的程序,將不僅僅是一項(xiàng)技術(shù)活,同時(shí)也會(huì)成為高強(qiáng)度的體力活。
Axprotect(商用)加密方式:
在運(yùn)行時(shí)自動(dòng)解密和重新加密軟件的技術(shù),為軟件提供自動(dòng)防護(hù)。該技術(shù)目前支持多種操作平臺(tái),諸如Windows,Linux,Mac OS,.NET 及Java應(yīng)用程序等等。所有的用戶收到的是相同的被保護(hù)軟件版本。可以針對(duì)不同用戶購買的不同功能模塊或者產(chǎn)品類型,個(gè)性化生成對(duì)應(yīng)的許可信息。您有權(quán)決定客戶以何種方式接受許可,或者將許可存放至CmDongle加密狗中發(fā)放給客戶,或者通過CmAct許可文件進(jìn)行發(fā)放。可以對(duì)客戶分配相應(yīng)的許可類型,例如本地單用戶許可、網(wǎng)絡(luò)并發(fā)許可、時(shí)間限制型許可(適用于軟件測(cè)試版)。
特點(diǎn):
Protection 保護(hù)工具用于實(shí)現(xiàn)高安全強(qiáng)度的保護(hù)軟件,防止盜版及逆向工程
Licensing 授權(quán)工具用于實(shí)現(xiàn)便捷、安全的軟件授權(quán),包括創(chuàng)建靈活的授權(quán)模式、整合軟件的業(yè)務(wù)流程,以及采用企業(yè)現(xiàn)行的辦公后臺(tái)系統(tǒng)對(duì)軟件所有的生命周期進(jìn)行完整的管理。
Security 安全工具監(jiān)控軟件最終使用者,防止來自第三方的惡意篡改及攻擊。
Vmproject(商用軟件、長期更新)虛擬機(jī)保護(hù)機(jī)制,安全系數(shù)較高,破解難度大
VMProtect允許對(duì)可執(zhí)行文件(EXE、SCR)、動(dòng)態(tài)鏈接庫(DLL,OCX,BPL)和驅(qū)動(dòng)程序(SYS)進(jìn)行保護(hù)。VMProtect允許對(duì)32位和64位應(yīng)用、庫和驅(qū)動(dòng)進(jìn)行保護(hù)。MProtec保護(hù)的文件可以在幾乎任何版本W(wǎng)indows OS上運(yùn)行,自Windows 95開始。32和64位版本都被支持,VMProtect兼容DEP和UAC。VMProtect允許生成和驗(yàn)證序列號(hào)。手動(dòng)和自動(dòng)生成都被支持。序列號(hào)可以是有限的時(shí)間或日期和硬件鎖定的,而免費(fèi)升級(jí)期間也可以被限制。VMProtect確保它實(shí)際上無法運(yùn)行沒有一個(gè)序列號(hào)代碼。
網(wǎng)絡(luò)評(píng)價(jià):
加密的安全級(jí)別很高,破解難度很大,但是加密數(shù)據(jù)多,可能會(huì)影響系統(tǒng)的性能。
主要功能是代碼加密、內(nèi)存打亂
文章出自【碼同學(xué)軟件測(cè)試】
碼同學(xué)公眾號(hào):自動(dòng)化軟件測(cè)試
碼同學(xué)抖音號(hào):小碼哥聊軟件測(cè)試
在UI自動(dòng)化中,我們經(jīng)常會(huì)遇到上傳文件操作。處理上傳事件是一個(gè)比較麻煩的操作,因?yàn)辄c(diǎn)擊上傳控件會(huì)彈出Windows窗口供用戶選擇文件,但是Windows窗口是瀏覽器之外的組件,所以selenium本身無法處理這個(gè)windows窗口。這里給大家?guī)讉€(gè)處理思路,我們先看一下下面這個(gè)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++ 打開,將它存成一個(gè) autotest.html文件,打開之后,只有一個(gè)上傳按鈕,我們來看一下怎么處理上傳事件。
1
直接調(diào)用selenium自帶的sendkeys進(jìn)行操作,將需要上傳的文件路徑直接傳遞進(jìn)上傳控件。
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");
// 等待看到結(jié)果
Thread.sleep(10000);
//關(guān)閉webdriver
driver.quit();
}
}
這種方案可以解決大部分的上傳操作,可是對(duì)于一些上傳框禁止輸入的就無法操作了,這時(shí)候我們就要考慮其他方案。
免費(fèi)領(lǐng)取 碼同學(xué)軟件測(cè)試 課程筆記+超多學(xué)習(xí)資料+完整視頻+最新面試題,可以轉(zhuǎn)發(fā)文章 + 私信「碼同學(xué)666」獲取資料哦
2
針對(duì)無法輸入的,我們可以考慮采用AutoIT來進(jìn)行上傳。
AutoIt目前最新是v3版本,這是一個(gè)使用類似BASIC腳本語言的免費(fèi)軟件,它設(shè)計(jì)用于Windows GUI(圖形用戶界面)中進(jìn)行自動(dòng)化操作。它利用模擬鍵盤按鍵,鼠標(biāo)移動(dòng)和窗口/控件的組合來實(shí)現(xiàn)自動(dòng)化任務(wù)。
官方網(wǎng)站:https://www.autoitscript.com/site/
從網(wǎng)站上下載AutoIt并安裝,安裝完成在菜單中會(huì)看到下圖的目錄:
AutoIt Windows Info 用于幫助我們識(shí)Windows控件信息。
Compile Script to.exe 用于將AutoIt生成 exe 執(zhí)行文件。
Run Script 用于執(zhí)行AutoIt腳本。
SciTE Script Editor 用于編寫AutoIt腳本。
我們打開html 網(wǎng)頁,然后點(diǎn)擊一下上傳按鈕:
下面我們看一下怎么用autoIT來處理這個(gè)上傳。
? 打開AutoIT Window Info,然后點(diǎn)擊Finder Tool,不松開左鍵,等鼠標(biāo)變成瞄準(zhǔn)器類型時(shí),將鼠標(biāo)挪動(dòng)到文件上傳框需要識(shí)別的控件上松開左鍵。
識(shí)別出對(duì)象之后所有的信息會(huì)顯示在AutoIT windows info里
經(jīng)過識(shí)別窗口的title為“Open”,標(biāo)題的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, 來查看一下文件是否可以上傳。
確認(rèn)腳本運(yùn)行正常, 我們將這個(gè)腳本保存成Script.au3, 然后打開Compile Script to.exe,將Script.au3文件轉(zhuǎn)換為Script.exe:
這個(gè)時(shí)候,我們打開上傳文件控件,雙擊Script.exe文件,可以看到文件上傳事件已經(jīng)處理成功。
免費(fèi)領(lǐng)取 碼同學(xué)軟件測(cè)試 課程筆記+超多學(xué)習(xí)資料+完整視頻+最新面試題,可以轉(zhuǎn)發(fā)文章 + 私信「碼同學(xué)666」獲取資料哦
接下來,就是使用java來調(diào)用該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");
// 點(diǎn)擊選擇文件按鈕
driver.findElement(By.name("file")).click();
// 設(shè)置等待3秒
Thread.sleep(3000);
// Java 的Runtime 模塊的getruntime.exec()方法可以調(diào)用exe 程序并執(zhí)行。
Runtime exe=Runtime.getRuntime();
try {
String str="D://Script.exe";
// 運(yùn)行指定位置的.exe文件
exe.exec(str);
} catch (IOException e) {
System.out.println("Error to run the exe");
e.printStackTrace();
}
// 等待看到結(jié)果
Thread.sleep(10000);
//關(guān)閉webdriver
driver.quit();
}
}
借助AutoIT也有自己的限制,比如只能在Windows系統(tǒng)中進(jìn)行,如果要移植到其他系統(tǒng),就得參考其他方式。
3
如果想在非Windows系統(tǒng)中處理上傳,我們可以用純Java的形式處理,這時(shí)候,我們就要用到Robot這個(gè)類,在該過程中流程表現(xiàn)為:打開上傳文件的控件->將文件在磁盤上的路徑,通過robot copy pasty進(jìn)去(需要文件輸入框默認(rèn)是光標(biāo)聚焦)->按下回車,觸發(fā)彈窗確定按鈕,完成文件上傳過程
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");
// 把圖片文件路徑復(fù)制到剪貼板
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(sel,null);
System.out.println("selection" +sel);
// 點(diǎn)擊上傳按鈕
driver.findElement(By.name("file")).click();
// 新建一個(gè)Robot類的對(duì)象
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);
// 點(diǎn)擊回車 Enter
robot.keyPress(KeyEvent.VK_ENTER);
robot.keyRelease(KeyEvent.VK_ENTER);
// 等待看到結(jié)果
Thread.sleep(10000);
//關(guān)閉webdriver
driver.quit();
}
}
上傳文件咱們就先處理到這里,希望可以給大家開闊思路,大家下次見。
END
免費(fèi)領(lǐng)取碼同學(xué)軟件測(cè)試課程筆記+超多學(xué)習(xí)資料+學(xué)習(xí)完整視頻,可以關(guān)注我們公眾號(hào)哦:自動(dòng)化軟件測(cè)試
本文著作權(quán)歸作者所有,任何形式的轉(zhuǎn)載都請(qǐng)聯(lián)系作者獲得授權(quán)并注明出處。
、配置Windows注冊(cè)表為了通過HTML超鏈接調(diào)用本地的show.exe程序并傳遞參數(shù),需要先在Windows注冊(cè)表中定義一個(gè)新的URL協(xié)議處理程序。以下步驟將指導(dǎo)您如何創(chuàng)建一個(gè).reg文件來執(zhí)行此操作:
創(chuàng)建一個(gè)新的文本文件,并將其保存為.reg擴(kuò)展名(例如,showProtocol.reg)。
使用文本編輯器打開該文件,并添加以下內(nèi)容:
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\""
保存并關(guān)閉文件。
在Windows資源管理器中雙擊該.reg文件,系統(tǒng)將提示您導(dǎo)入注冊(cè)表更改。確認(rèn)后,這些更改將被應(yīng)用到Windows注冊(cè)表中。
在HTML頁面中,您可以使用<a>標(biāo)簽創(chuàng)建一個(gè)指向自定義URL協(xié)議的鏈接。例如,要調(diào)用show.exe并傳遞參數(shù)cmd,可以編寫如下代碼:
<a href="show://cmd/"target="_blank">調(diào)用本地show.exe,傳入?yún)?shù)cmd</a>
當(dāng)用戶點(diǎn)擊這個(gè)鏈接時(shí),Windows將使用在注冊(cè)表中定義的命令來執(zhí)行show.exe,并將cmd作為參數(shù)傳遞。
為了使show.exe能夠接收和處理通過URL傳遞的參數(shù),您需要在程序中實(shí)現(xiàn)相應(yīng)的邏輯。以下是一個(gè)簡化的C++代碼示例,展示了如何將命令行參數(shù)轉(zhuǎn)換為字符串并進(jìn)行處理:
#include<iostream>
#include<string>
#include<windows.h>
// 假設(shè)Common是一個(gè)包含輔助函數(shù)的命名空間或類
// 例如,GetSubstr函數(shù)用于從字符串中提取子串,WriteLogs函數(shù)用于記錄日志
intmain(intargc, char* argv[]){
// 命令行參數(shù)位于argv數(shù)組中,其中argv[0]是程序路徑,argv[1]及之后是傳入的參數(shù)
if(argc > 1) {
// 第二個(gè)參數(shù)(argv[1])將包含通過URL傳遞的參數(shù)
std::string cmdLine=argv[1]; // 直接使用argv[1]而不是lpCmdLine(在WinMain中使用)
// 將命令行參數(shù)進(jìn)行適當(dāng)處理,這里簡單打印出來
std::cout << "Received command line argument: "<< cmdLine << std::endl;
// 如果需要更復(fù)雜的解析,可以使用類似Common::GetSubstr的函數(shù)
// std::string strCmd;
// if (Common::GetSubstr(cmdLine, /*...*/, strCmd)) {
// Common::WriteLogs(strCmd.c_str());
// }
} else{
std::cout << "No command line argument provided."<< std::endl;
}
return0;
}
請(qǐng)注意,此示例假設(shè)show.exe是一個(gè)控制臺(tái)應(yīng)用程序,并且使用標(biāo)準(zhǔn)輸出(std::cout)來打印接收到的參數(shù)。在實(shí)際應(yīng)用中,您可能需要根據(jù)程序的類型(如GUI應(yīng)用程序)和需求來調(diào)整參數(shù)處理邏輯。
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。