反破解小技巧總結

網上看了一大堆,七零八碎的湊到一起的

1:ZwSetInformationThread,
該函數可以移除調試線程,遺憾的是StrongOD.dll 在r0下已經HOOK 了此函數,所以該函數無論如何調用,總是返回成功。但實際并沒有移除。
好了,我們可以根據這個函數來判定 StrongOD.dll 是否存在,如何判定,這里不說了,說了以后,該插件估計就要升級啦!

2:GetTickCount 和 GetLocalTime
獲取運行時間
比如,我一個定時器,1秒一次,不斷的獲取時間,

static int Old_Time = GetTickCount();
if(GetTickCount() - Old_Time <=3000)
Old_Time = GetTickCount();
else
{
MessageBox(Null,"程序被調試了","",0);
Old_Time = GetTickCount();
}

定時器1秒一次,高于3秒鐘,說明我們當前線程被暫停運行過。只有調試的時候才會暫停線程,程序肯定被調試了。
因為是程序正常調用,所以呵呵,目前任何OD都無法繞過該檢測.....

有人說,我在你GetTickCount 處下斷點,不就能找到你檢測代碼了嗎?
別急,咱們自己構建這個函數,不用系統的。

DWORD __stdcall MyGetTickCount()
{
DWORD nValue = 0;
__asm
{
MOV EDX,0x7FFE0000
MOV EAX,DWORD PTR DS:[EDX]
MUL DWORD PTR DS:[EDX+4]
SHRD EAX,EDX,0x18
MOV nValue,EAX
}
return nValue;
}
這下破解者會很苦逼的。

3:既然GetTickCount 檢測如此牛逼,我們可以在檢測代碼處進行下進行多重校驗。
大多數驗證代碼都是這樣的
call xxxxxx
cmp eax,1
je 驗證通過
//執行驗證失敗代碼

很多人通過修改匯編代碼,je 改寫成 jmp來實現他們邪惡的目的。
7C809377 /0F85 7A080300 JNZ kernel32.7C839BF7
7C80937D |3977 34 CMP DWORD PTR DS:[EDI+34],ESI
7C809380 |0F85 3D040000 JNZ kernel32.7C8097C3

7C809377 /0F85 7A080300 JNZ kernel32.7C839BF7
7C80937D |3977 34 CMP DWORD PTR DS:[EDI+34],ESI
7C809380 |E9 3E040000 JMP kernel32.7C8097C3
7C809385 |90 NOP

我們可以看到7C809380處jnz 修改成 jmp 后,它對應的HEX 數據也從 0F85 改寫成E9,如何檢測,讓他只要修改任意一條指令就能被我們發現。
其實方法很簡單,只要在地址7C809377開始,讀取指定字節,然后把數據累加下。它是一個固定的值。
方法:開幾個線程互相對對方監控,
線程1監控線程2,線程2監控線程1,線程3監控線程1,只要一處代碼被修改,都能檢測到。也可以對一些敏感的API進行監控,
比如recv,send 因為WPE之類的抓包工具都會對函數進行HOOK.

4:檢測到這些可惡的家伙在弄我們的程序,要ExitProcess退出嗎?
當然不,他會在 TerminateProcess 和 ExitProcess 下斷點等著你呢。我們可以直接破壞自己的程序,讓程序異常退出。
比如,在程序里弄個死循環,無限申請內存,導致內存泄露,
比如,把數組里的數據給清空,導致訪問異常。總之,搞死自己就可以了,別用API退出。

5:關鍵數據放服務器上,進行時間加密,確保每次封包都不一樣,比如,很多外掛,把基址放服務器上,你爆破后,有界面沒功能。

6:采用lua類似的模型。開辟一個獨立的線程,所有的功能都集中在一個函數中完成

void Run(int nIndex)
{
//我們可以對nIndex 的不同類型,完成不同的敏感操作,
比如
為1:我們顯示窗口
為2:彈出窗口
為3:設置字符串
}
由于Run和我們的驗證代碼不在一個線程里,所以,他很難通過棧回溯來找到關鍵call,增加破解難度。

7:字符串加密,在計算機語言里,有個叫異或運算的簡單加密方式
字符a 和一個密匙進行異或后 變成另一個數
在異或運算一次,就又變回 a

int a = a ^ Password; //讓a 和一個密匙加密
a = a ^ Password; //所得結果和同一個密匙運算一次,還原
因此,把字符串以int 數組的方式保存,然后用密匙還原。確保OD搜索插件搜不到。

1、檢測調試寄存器

(1)檢測 softice 等系統級調試器

檢測softice的方法有很多.檢測主要在驅動里中實現。

(2)監測用戶級調試器用戶級調試器具有一下幾個特征:

用戶級調試器是采用microsoft提供的dbghelp.dll庫來實現對軟件跟蹤調試的。

被調試的軟件其父進程為調試器。

所以可以采用如下的方法來檢測:

a.調用api函數isdebuggerpresent()(或是直接采用isdebuggerpresent的反匯編代碼,以防破解者攔截對該函數的調用)來檢測是否有用戶級調試器存在。

b.監測調試寄存器的方法。

c.采用tlb的方法,檢查父進程的方法. 在winnt下,可以采用進程注入的技術來檢測軟件的父進程是否正確的方法。

d.設置seh進行反跟蹤。

由于破解者者可以攔截軟件對調試器的檢測操作,所以將保護判斷加在驅動程序中。因為驅動程序在訪問系統資源時受到的限制比普通應用程序少得多,這也給了破解者增加了破解的難度。

2、crc檢校

增加對軟件自身的完整性檢查。這包括對磁盤文件和內存映像的檢查,以防止破解者未經允許修改程序以達到破解的目的。dll和exe之間可以互相檢查完整性。

為了防止破解者采用替代word,以及edocguard的dll,通過計算dll的crc值來驗證。

3、運行時庫的重新編寫

破解者往往是在hmemcpy,strcpy等運行時庫函數上下斷點,通過分析其中的字符串來窺視程序的內部運行。對于edocguard,雖然不是密碼的處理,但是內存解密的部分就是使用的memcpy,所以需要重新編寫這些運行時庫,這個可以從vc或其他編譯器的運行時庫中的代碼改寫獲得。

需要修改的是vc6_encry_lib,clinetfile里面,hook dll里面的readfile,驅動里的解密。

4、花指令的添加

用花指令來對付靜態匯編是很有效的,這會使解密者無法一眼看到全部指令,杜絕了先把程序打印下來再慢慢分析的做法。

一條指令的長度是不等長的,假使有一條指令為 3 字節長,從它的第二個字節開始反匯編,會看到一條面目全非的指令,‘花指令’就是在指令流中插入很多‘垃圾’,使靜態反匯編無法進行。

5、干擾代碼的添加

在關鍵部位添加jmp nop cmp 等跳轉指令,比較指令以及一些沒返回的循環等。插入這些大量無用的運算以誤導解密者,防止靜態反匯編,增加破解者動態匯編時難度。

到處貼條件轉移

沒有循環,只是跳轉,作為有條件的路障,這樣,沒有簡單的反向操作可以執行。

6、api函數的不規則調用

在軟件中對于api的調用不采用直接調用api的方法,因為這樣破解者很容易了解到軟件所調用的api,進而了解到軟件的工作流程。可以采用由dll的輸出表來定位api的函數地址的方法。

對于調試器來說,在對api設置斷點時,是在api函數地址上添加一個int 3指令。所以在調用api時,把api的前幾個代碼指令復制到調用處,執行前幾個代碼指令,然后跳轉到api函數中。

這樣調試器對于api斷點的監視是無效的。

7、接口與字符串

dll,com不使用有意義的函數接口.不采用一目了然的名字來命名函數和文件,如openfile( )、setpermisson等。

所有可能被破解者利用的字符串都不以明文形式直接存放在可執行文件中,采用加密的形式,在需要時進行解密。

盡可能少地給用戶提示信息以防解密者直接了解軟件的流程。比如,當檢測到破解企圖之后,不要立即給用戶提示信息,而是在系統的某個地方做一個記號,隨機地過一段時間后使軟件停止工作,或者裝作正常工作但實際上卻在所處理的數據中加入了一些垃圾。

8、輸入表輸出表攔截的檢測

定時檢測軟件各個模塊的輸入輸出表是否一致,輸入表、輸出表中的函數地址是否處于對應模塊的內存區域中,防止破解者采用hook api 的方法對軟件進程破解操作。

9、加殼

軟件最終發行之前將可執行程序進行加殼/壓縮,使得解密者無法直接修改程序。如果采用現成的加殼工具,最好不選擇流行的工具,因為這些工具已被廣泛深入地加以研究,有了通用的脫殼/解壓辦法。另外,采用兩種以上的不同的工具來對程序進行加殼/壓縮,并盡可能地利用這些工具提供的反跟蹤特性。

10、有條件允許使用加密狗,加密狗盡量選最新的,因為許多解密者對于新狗是沒有研究的,即使他本人精通加密狗,也需要花費一段時間才能弄懂,這就為你的軟件在第一時間銷售爭取到足夠的時間。
  
  11、發布功能不全的軟件提供免費試用,正版則要花錢購買。這樣即使解密者破解了軟件但因為功能不全,他一樣相當于什么也沒得到,而只有匯款給你的人才能得到功能齊全的版本。

12、推出無需注冊的免費軟件,這個不是一般人能承受的起的,但是已經有許多人在做了,試想如果你的軟件根本不用注冊就能使用,那解密的人就會沒有軟件可破而下崗。同時你的軟件也會在使用者中留下良好的口碑。大家都用你的軟件,你就會逐漸成為市場的主流,而你的同行恐怕就會慢慢退出市場了。

13、在軟件中加入一些程序,使軟件在運行一段時間后自動丟失信息或自動銷毀或突然死機。如財務管理軟件,這樣一來使用者會擔心自己因為使用破解版本造成巨大損失,而不得不主動購買你的正版軟件。

14、
  15、上面沒有寫是想給你們留下廣闊的空間,我相信每一位聰明人看了這13條之后都能獨立想出一個行之有效的辦法來保護你的軟件。那這一條就教由你自己來完成了。
最后一條就是聯合起來,搞破解的人可以聯合,所以他們破一個軟件會很容易,因為那不是某個人的智慧而是多個人的智慧,反過來,搞軟件研發的人也應該聯合起來,這樣你們的保護才能不斷的完善。采用高難度算法,如果想在算法上更勝一籌就得換成不可逆算法,讓破解者找不到頭緒。如同走迷宮,我介紹一種方法,不是CRC,因為我是應試教育的受害者,本人數學只會解方程。如果把方程應用到算法中會很有效。比如
設注冊碼為:X,Y兩部分,
x,y的運算過程是:x,y是方程組:
      2    3
     X Y - X  -331 Y  =19     編程后為:XXY- XXX-331*Y=19

2  2
     X Y -X -1312 Y =38
的兩根,把你的注冊碼兩部分經過代入方程組中檢驗,這樣破解者推出方程,根本解不出來。
他累死也不會想到 X=26 Y=51,其它值均錯誤。既你的注冊碼前一部分是26,后一部分是51,這樣看起來好象并沒有多大作用,但是x,y并不完全是固定的數字,可以是你的注冊碼每一位字母或數字的ascii碼相加之和,經過四則運算,再減去一個數的結果。最后x,y的值可以不超過百位數,x,y也就可以按你的需要賦值了。像這樣的方程我這里要多少有多少,保證X,Y解全都不一樣,當然只是舉一個很簡單的例子

侵刪。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容