crackme--002
-
分析程序,无壳,汇编语言编写。直接OD打开,开始分析。
-
开始是一个加载头模块,之后是确定文件是否存在。 如果不存在crackme3.key就返回一个-1,然后就不会跳转。
-
这里的函数是对文件内容进行读取。 这个函数会对004021A0这个地址进行赋值,并且对文件内容存放到00402008这个地址里面。
-
之后对进入函数查看。
/$ 33C9 XOR ECX,ECX |. 33C0 XOR EAX,EAX //先对ecx和eax进行清空 |. 8B7424 04 MOV ESI,DWORD PTR SS:[ESP+4] |. B3 41 MOV BL,41 //在OD窗口可以看到BL是A |> 8A06 /MOV AL,BYTE PTR DS:[ESI] //ESI中存储的就是我们文件中的内容 |. 32C3 |XOR AL,BL //这里是文件中的每一个字符和A进行异或 |. 8806 |MOV BYTE PTR DS:[ESI],AL //在将异或到的结果返回给文件中的字符串 |. 46 |INC ESI //这里做的是读取下一位 |. FEC3 |INC BL //BL也是变成B,如此之后就C、D、E... |. 0105 F9204000 |ADD DWORD PTR DS:[4020F9],EAX //这个地址存入的值会在之后中用到 |. 3C 00 |CMP AL,0 //如果字符和BL相同了,那么就会直接跳转出这个函数 |. 74 07 |JE SHORT Cruehead.00401335 |. FEC1 |INC CL //一个简单的计时器 |. 80FB 4F |CMP BL,4F //表示只比较41~4F,15个字符 |.^ 75 E6 \JNZ SHORT Cruehead.0040131B //循环 |> 890D 49214000 MOV DWORD PTR DS:[402149],ECX //循环次数存入该地址 \. C3 RETN
-
XOR DWORD PTR DS:[4020F9],12345678 ; 将之前异或得到的结果与12345678进行异或 ADD ESP,4 PUSH Cruehead.00402008 ; ASCII " opqr" CALL Cruehead.0040133C ; 这里就是将字符串传入函数0040133c里面,push传参 ADD ESP,4 CMP EAX,DWORD PTR DS:[4020F9] ; 将异或的结果和字符串的后四位进行比较
这里的内容基本就是算法的结尾部分了。将异或后的值累加,再将累加和与12345678进行异或,如果这异或的结果与字符串之后四位的值相等就破解成功。
-
总结算法:程序是一个KeyFile类型,需要一个文件存在才能成功破解。这是破解需要知道的背景前提。算法就是读取文件内容,将文件中前14位字符串分别与大写的ABCD。。。进行异或,异或的结果转化为16进制数累加。累加和再与12345678再次异或得到校验值。校验值如果与文件中的第15位到18位相同,那么就破解成功。
-
破解可以按照它给的要求去完成这么一个Key文件,又或者是找到关键跳转点对其进行强制跳转或NOP填充的修改。下面就是按照要求的一段VB代码,VB的逻辑有些乱,看着感觉有些不对。但事实是成功了!!!
Sub CrackMe3KeyGen() Dim myData(17) As Byte, i%, seRial$, UserNames$, Sum1&, UserNumber& UserNames = "xiaoliniuB666!" For i = 1 To 14 UserNumber = Asc(Mid(UserNames, i, 1)) Sum1 = Sum1 + UserNumber myData(i - 1) = UserNumber Xor (&H40 + i) Next seRial = Hex(Sum1 Xor &H12345678) For i = 1 To 4 myData(18 - i) = "&H" & (Mid(seRial, i * 2 - 1, 2)) Next Open "f:\CRACKME3.KEY" For Binary As #1 Put #1, , myData Close #1 End Sub
基本就是重复一遍算法,然后将前14位得到的结果补充到后四位上,来完成文件的创建。
-
修改跳转点
- 第一处,修改Key文件确认处的跳转点,如果没有Key文件,那么就会进行跳转。
- 第二处,文件内容读取处的跳转点,如果文件内容不符合要求字符太少就会跳转,随便一个长字符串文件都可以。
- 第三处,这里就是算法的核心跳转点,根据算法计算得到校验值和文件中的部分字符串进行比较,相同则跳转,不同则不跳。这里就对文件内容有要求了,所以直接NOP填充。还有需要注意的是,这里push了一个eax,这里的eax还会用到后面的校验中。
- 最后一处,在创建且调用完窗口之后,这里将之前push的eax再pop出来进行二次比较,所以将这里的跳转进行NOP填充也就完成了爆破!
-
最后尝试爆破 这里没有文件。 打开也就是这样,没有爆破成功的提示。 第一处我们就修改成je与之前刚好相反。 第二处就用nop填充,让它能接着往下执行,不会返回开头。 第三处也是。 第四处修改。 然后就成功执行到“Now,try the next crackme!”了。但是还是没有弹窗,哎好像完成了,但又没有完成。使用文件的话是可以的, 不过如果随便创建一个合乎要求的文件还是可以的。