VB 異或(Xor)字串的方法

2021-10-09 21:04:39 字數 4506 閱讀 9641

關鍵字:vb,vba,異或,xor,字串 前言

一、方法一,比較笨。

二、方法二,感覺輕鬆多了。

三、說一說關於ultraiso的部分演算法

簡介:大家都知道,異或(xor)是最常用的加密方式,在學習逆向時,經常會見到異或(xor)操作。最近研究 ultraiso 8.6.5.2140 版的演算法,裡面全是異或(xor)操作,就試著用vb寫了一下它的加密程式,用c語言寫起來感覺很簡單,但用vb確不會做,網上搜了一下,也沒有詳盡的教學,只好自己琢磨,別說,雖然走了一些彎路,但總算搞明白了,分享給大家,希望能幫到需要的人。

第一天晚上做出了「方法一」,後來,又到另一台電腦寫同樣的程式時,就出現了「方法二」。

第乙個strxor1函式:

function strxor1(s1 as

string

, s2 as

string

)dim m1 as

double

, m2 as

double

m1 =

val(s1)

m2 =

val(s2)

strxor1 = hex(s1 xor s2)

endfunction

說明:函式接收兩個十六進製制字串s1和s2,先用val()函式將十六進製制轉成十進位制後,再做異或操作,再用hex()函式轉回成十六進製制返回。在傳遞引數之前,s1和s1必須在前面加上「&h",看下面呼叫**:

sub test1(

)dim s1 as

string

, s2 as

string

dim s3 as

string

, s4 as

string

,str

asstring

dim x as

integer

s1 =

"3e76f499"

s2 =

"20020920"

for x =1to

len(s1)

s3 =

"&h"

&mid

(s1, x,1)

s4 =

"&h"

&mid

(s2, x,1)

str=

str& strxor1(s3, s4)

next

endsub

測試**說明:一開始不知道直接就可以s1 xor s2,所以就做了個迴圈,乙個字元乙個字元的異或。用函式mid()從字串裡取任一字元。整個字串能否異或呢?本身就是在測試嗎,所以就又做了下面的測試:

sub test2(

)dim s1 as

string

, s2 as

string

,str

asstring

dim x as

integer

s1 =

"&h"

&"3e76f499"

s2 =

"&h"

&"20020920"

str= strxor1(s1, s2)

endsub

果然可以整個字串進行異或操作。但必須為十六進製制形式,後面會講到不是十六進製制形式的字串怎麼處理。下面請看程式的彙編**:

00469550   c745 fc 99f

4763e mov [local.1]

,0x3e76f499

00469557

8175 fc 20090220 xor [local.1]

,0x20020920

怎麼感覺彙編操作異或如此簡單呢?

第二天,又到別的電腦上寫這個程式時,一下子忘了怎麼寫的了,就按大概記憶寫成了這個樣子:

**如下:

function strxor2(s1 as

string

, s2 as

string

) strxor2 = hex(

"&h"

& s1 xor

"&h"

& s2)

endfunction

是不是簡單了,一句搞定。引數s1,s2接收的為十六進製制字元。下面測試一下:

sub testxor2(

)dim s1 as

string

, s2 as

string

,str

asstring

s1 =

"3e76f499"

s2 =

"20020920"

str= strxor2(s1, s2)

endsub

結果也完全正確。

在逆向ultraiso時,還會出現很多的異或情況,比如把前面異或得到的十六進製制字串:1e74fdb9轉為小寫後與字串:"aa938b8d90b6acb0"進行異或,這裡就只能逐一異或了,即1 xor aa,e xor 93。

咱們邊看邊說吧,異或函式就用上面第二個吧,ultraiso裡會把異或得到的字串:1e74fdb9轉為小寫,vb的**也很簡單,加個lcase()函式就行了:

dim s1 as

string

, s2 as

string

,str

asstring

s1 =

"3e76f499"

s2 =

"20020920"

str=

lcase

(strxor2(s1, s2)

)

執行結果:str = 「1e74fdb9」,從str逐一取字元並非按1-8的順序,而是按"75316420"(下標為0)的順序,取完後的字串就變成了:「9d4ebf71」,請看**:

dim  s3 as

string

, s4 as

string

, ss1 as

string

dim x as

integer

, i as

integer

s3 =

"75316420"

s4 =

"aa938b8d90b6acb0"

'備註一下:str = "1e74fdb9"

for x =1to

len(

str)

i =val(

mid(s3, x,1)

)+1 s1 = hex(asc(

mid(

str, i ,1)

))s2 =

mid(s4, x *2-

1,2)

ss1 = ss1 & strxor2(s1, s2)

next

程式說明:s3變數為取字元的順序,用mid()函式逐一取出,用val()函式轉成數字+1賦給變數i(+1的目的是把下標改為1)。第9行,s2簡單,就是從s4字串裡兩個兩個的取字元,是十六進製制的。第8行,s1就相對複雜一些,首先i=8,從str裡取到的字元就是9,因為9不是十六進製制字元,必須轉換,所以要用asc()取得它的ascii碼57,是十進位制的,再用hex()函式轉成十六進製制的39。這樣就保證了傳給strxor2()函式的兩個引數都是十六進製制的。

執行結果:ss1=「93f7bfe8f2d09b81」,然後又拿序列號與ss1字串進行異或處理,這裡我們假定輸入的序列號為:」0123-4567-89ab-cdef「(在ultraiso軟體裡,輸入的序列號要先進行統一字元處理,這裡就不多說了,因為本文並非逆向文章)。與序列號的異或操作如下:

dim registcode as

string

, rcode as

string

, ss2 as

string

registcode =

"0123-4567-89ab-cdef"

rcode = replace(registcode,

"-","")

i=0for x =1to

len(rcode)

s1 = hex(asc(

mid(rcode, x,1)

))i = i +

1 s2 =

mid(ss1, i *2-

1,2)

ss2 = ss2 & strxor2(s1, s2)

if i >=

8then i =

0next

執行結果:ss2=「a3c68ddbc6e5adb6abcefeaab194dec7」,最後再與使用者名稱異或,得到的字串再轉為小寫後,寫入登錄檔裡。

vb裡的異或xor操作就說到這,你學會了嗎?

# 總結

個人認為,程式設計並不難,難的是人的思維,專業點說應該叫:」演算法「吧,你不必背會程式設計裡用到的全部函式,你只要知道你要做什麼,然後查資料或到網上搜,找到相似的**,照著你的意圖去改就行了。

關於異或(XOR)的有趣應用

異或是個非常有意思的東西,利用異或的性質我們可以做一些有意思的事情。異或加密解密 下面是乙個非常簡單的加密解密函式 public static string encryption string srcstring,char key return new string srcchars 給出測試 st...

python 異或加密字串的例項

做個簡單習題 輸入明文給定秘鑰,密文還原,按位異或處理。import base64 as b64 def xor encrypt tips,key ltips len tips lkey len key secret num 0 for each in tips if num lkey num nu...

XOR 異或的性質與應用總結

下面的內容均來自於網路的收集和彙總。異或的實質是按位模2加,簡單理解就是不進製加法如 1 1 1 1 0 1 0 1 0 1 0 0 0 0 0 按位模2加 101 110 111 100 101 110111 322 2 100交換律 a b b a 結合律 a b c a b c a b c 恒...