新160个CrackMe039-eKH.1、040-DaNiEl-RJ.1、041-genocide1逆向分析

新160个CrackMe039-eKH.1、040-DaNiEl-RJ.1、041-genocide1逆向分析

039

无壳

暴力破解

找到关键跳转将其改成jmp即可获取破解版本

算法分析

先获取用户名和序列号,之后经过一个函数将函数返回值与0xBC614E(十进制数是12345678)进行对比,相等则成功

步进分析函数ekh.1.427A20

进行一个循环先是每次都获取用户输入的用户名再将它逻辑左移八位之后从一个固定字符串中取出当前用户名字符串下标对应的固定字符串中的字符,将他与逻辑左移后的数进行异或

之后将获取的字符串从十六进制转换成十进制,并且获取计算之后的字符串长度进行下一个循环,将获得的整数除0xA,求出的余数作为下标从新的系统自带的字符串中其提出相应的字符,经过n次循环之后获取正确的序列号

可以生成keygen:

username = input("Input username:").strip() sum_val = 0 a = "LANNYDIBANDINGINANAKEKHYANGNGENTOT" b = "LANNY5646521" len_a = len(a) b_len = len(b) for i, ch in enumerate(username): sum_val += ord(ch) sum_val = (sum_val << 8) & 0xFFFFFFFF index = a[i] if i < len_a else a[i % len_a] sum_val = (sum_val | ord(index)) & 0xFFFFFFFF if sum_val & 0x80000000: sum_val = (0x100000000 - sum_val) & 0xFFFFFFFF sum_val = (sum_val ^ 0x12345678) & 0xFFFFFFFF print(f"sum: {sum_val}") print(f"Hex: 0x{sum_val:08X}") index = '' temp = sum_val while temp > 0: idx = temp % 0xA idx = idx % b_len char = b[idx] index += char temp = temp // 0xA print(f"index: {index}")

040

无壳

直接点开程序没办法进入到到验证页面,要先点下面的about关闭弹窗之后才可以继续点击注册页面

暴力破解

发现关键跳转,将其给nop掉即可获取破解版本

算法分析

经过一个循环,将用户名的每一个字符ASCII码值+5再转换成字符,拼接起来,生成的新的字符串就是生成的序列号

可以生成keygen:

username=input("Input username:").strip() serial='' for ch in username: char=chr(ord(ch)+5) serial+=char print(f"Serial:{serial}")

041

UPX壳

脱壳

直接点开程序发现只有一个弹窗,将该弹窗关掉之后程序自动退出

解开程序

从这里看到程序会验证是否存在Reg.dat文件,如果存在就不会出现弹窗

将该跳转给改成jmp即可解开程序,让程序成功正常运行

输入序列号和用户名发现没办法点击确认按钮,初步推测是在序列号部分实时验证是否正确,来决定确认按钮是否可以点击

算法分析

先用PE Explorer来分析整个程序,可以观察到TForm2是关于输入用户名和序列号的那个窗体,TForm3是关于about窗体

TForm2下的Edit1Change、Edit2Change和下面的3,4分别对应了注册窗体的四个序列号,在IDA中可以找到相关函数的地址分别是437E70、437E7C、437E88、437E94

在相关位置下断点

进入函数发现有四个跳转,每个跳转都跳转到调用函数的位置,期间没有进行运算,继续进入函数,发现函数437BD8内有运算,在该函数内下断点,方便后续动态调试

运行打开注册窗口,发现在用户名和序列号输入之前就断下了,点了四次运行才成功看到注册窗口,输入用户名之后调试序列号发现没有变化,需要继续点击运行,直到前三位序列号都正常显示,调试第四位序列号时不运行,开始步过观察,发现对输入的第1、3、4、5位对0xA求商存到指定位置

之后又经过了一个循环,检验获取的每一位序列号是否大于9,如果是,则重新对0xA取商覆盖原来的值

接下来将通过用户名获取的序列号与用户输入的序列号进行对比,不相等就跳转失败

可以得到keygen:

username=input("Input username:").strip() serial='' for i,ch in enumerate(username): if i==1: continue if i==5: break temp=ord(ch)//0xA while temp>=0xA: temp=temp//0xA serial+=chr(temp+48) print(f"Serial:{serial}")

暴力破解

根据前面的分析可以得出,将地址处的跳转给nop掉即可获得破解版本程序