新160个CrackMe048-monkeycrackme1、049-THraw-crackme8、050-daxxor逆向分析

📅 2026/7/5 2:18:22
新160个CrackMe048-monkeycrackme1、049-THraw-crackme8、050-daxxor逆向分析
048无壳暴力破解找到关键跳转将其给nop掉即可获取破解版本算法分析继续想上找到函数头进行下断点重新运行继续分析显示获取了用户名之后将用户名与一个参数0x4DE1一起经过函数466230获取生成的序列号之后再获取用户输入的序列号进行对比相等则成功下面通过IDA来分析函数466230主要是进行一个循环将程序自带的参数n19937_1逻辑右移8位和用户名的ASCII码值进行异或之后再将程序内置字符串str16、str14进行(str16)(str14)*(n19937_1刚才计算出的异或结果得到的值作为新结果覆盖到n19937_1这个n19937_1作为种子进行到下一循环每次循环都要将异或结果转换成十六进制的二位数之后再转换成字符n19937_1的值为4DE1在x32dbg的追踪中可以找到str16和str14这两个值分别为58BFCE6D、58BF可以生成keygen:def generate_serial(username): key1 0xCE6D key2 0x58BF seed 0x4DE1 serial v10 seed for ch in username: high_byte (v10 8) 0xFF xor_result high_byte ^ ord(ch) v10 (key2 key1 * (v10 xor_result)) 0xFFFF serial format(xor_result, 02X) return serial def main(): username input(Input username: ).strip() if not username: print(Username cannot be empty!) return serial generate_serial(username) print(fSerial: {serial}) if __name__ __main__: main()049UPX壳脱壳发现没办法脱壳可能是因为加壳之后程序的部分信息被修改使用010Editer查看头部信息一般UPX壳的位置在200处一般UPX处的标志位是.upx0、.upx1、.rsrc 等标准名称。这里第一个段被改名为 .code第二个段被改名为 .text这破坏了 UPX 的自动识别机制。用十六进制编辑器将 .code 改回 .upx0将 .text 改回 .upx1之后再脱壳暴力破解找到通往正确窗口关键跳转将跳转给改成nop和判断用户名是否大于2个字符将跳转给改成jmp即可获取破解版本算法分析先是进行一个循环对用户名的每个字符都将ASCII码值转换成整数再拼接在一起之后再将一个地址里面的数据直接取出来转换成整数之后再提取之前根据用户名获取的字符串将这两个字符串进行拼接生成一个新的字符串再将用户输入的字符串与新的字符串进行对比相等则成功可以生成keygen:usernameinput(Input username:).strip() serial1549945052 for ch in username: serial format(ord(ch), x).upper() print(fSerial:{serial})050无壳暴力破解分析发现用户名长度必须大于6继续向下可以发现失败和成功语句前面的跳转语句将他给nop掉和前面判断用户名长度的跳转给改成jmp即可获得破解版本软件算法分析先是对用户名的每个字符串进行当前字符的ASCII码值源字符串长度-0x4-源字符串长度-0x20x2即相当于当前字符的ASCII码值-0x4边计算边将计算后的字符直接替换源字符串中的字符之后再对生成的字符串中的第三个位置后拼接一个“-”第五个位置后拼接一个“-”第六个位置后拼接一个“axd”可以生成keygen:username input(Input username:).strip() name for ch in username: name chr(ord(ch) - 0x4) print(fname:{name}) inserts [(3, -), (4, -), (4, axd)] for pos, content in sorted(inserts, reverseTrue): if len(name) pos: name name[:pos] content name[pos:] else: name name content print(ffinal result: {name})