学习crack-day05
  CoCRnVPHhERh 2023年11月02日 23 0

crackme--002

  1. 分析程序,无壳,汇编语言编写。直接OD打开,开始分析。

  2. 开始是一个加载头模块,之后是确定文件是否存在。 image-20220902201618204.png 如果不存在crackme3.key就返回一个-1,然后就不会跳转。

  3. 这里的函数是对文件内容进行读取。 image-20220902202034939.png 这个函数会对004021A0这个地址进行赋值,并且对文件内容存放到00402008这个地址里面。

  4. 之后对进入函数查看。

    /$  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
    
  5. 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进行异或,如果这异或的结果与字符串之后四位的值相等就破解成功。

  6. 总结算法:程序是一个KeyFile类型,需要一个文件存在才能成功破解。这是破解需要知道的背景前提。算法就是读取文件内容,将文件中前14位字符串分别与大写的ABCD。。。进行异或,异或的结果转化为16进制数累加。累加和再与12345678再次异或得到校验值。校验值如果与文件中的第15位到18位相同,那么就破解成功。

  7. 破解可以按照它给的要求去完成这么一个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位得到的结果补充到后四位上,来完成文件的创建。

  8. 修改跳转点

    1. image-20220903194556090.png第一处,修改Key文件确认处的跳转点,如果没有Key文件,那么就会进行跳转。
    2. image-20220903195117495.png第二处,文件内容读取处的跳转点,如果文件内容不符合要求字符太少就会跳转,随便一个长字符串文件都可以。
    3. image-20220903195309963.png第三处,这里就是算法的核心跳转点,根据算法计算得到校验值和文件中的部分字符串进行比较,相同则跳转,不同则不跳。这里就对文件内容有要求了,所以直接NOP填充。还有需要注意的是,这里push了一个eax,这里的eax还会用到后面的校验中。
    4. image-20220903195659271.png最后一处,在创建且调用完窗口之后,这里将之前push的eax再pop出来进行二次比较,所以将这里的跳转进行NOP填充也就完成了爆破!
  9. 最后尝试爆破 image-20220903200146081.png这里没有文件。 image-20220903200214330.png打开也就是这样,没有爆破成功的提示。 image-20220903200357482.png第一处我们就修改成je与之前刚好相反。 image-20220903200550326.png第二处就用nop填充,让它能接着往下执行,不会返回开头。 image-20220903200658562.png第三处也是。 image-20220903200748623.png第四处修改。 image-20220903201057132.png然后就成功执行到“Now,try the next crackme!”了。但是还是没有弹窗,哎好像完成了,但又没有完成。使用文件的话是可以的, image-20220903201321516.png不过如果随便创建一个合乎要求的文件还是可以的。image-20220903201545986.png

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
CoCRnVPHhERh
作者其他文章 更多