无壳易语言Cracke,大家玩玩看.
本帖最后由 scncrenyong 于 2024-11-26 10:50 编辑无壳易语言Cracke,大家玩玩看,修复了一下,不确定还有没有BUG.
修复后:
警告:CM区等技术类版块禁止回复『与主题无关非技术内容』,违者重罚!
本条提醒后再灌水的,一律违规+1处理。 本帖最后由 爱飞的猫 于 2024-11-26 07:26 编辑
代码有 bug。
从堆申请内存(易语言的字符串、字节集都是从堆申请内存),取出指针,然后释放内存。之后验证的时候还想从这个指针读。
释放内存后就不能保证指针里的数据还是之前的数据了。因为其它程序在释放后尝试从堆申请内存,有一定概率得到这个(或附近)指针,然后进行读写。
汇编修正方案就是跳过该次内存释放,即 `004018A5` 的跳转改为 `jmp`。
1337 补丁文件:
```
>Cracke.exe
000018A5:74->EB
```
---
代码写得有点粗糙,能跑出正确的序列号。
```py
# 机器码 1C99-EA31-DE53-8C96
from typing import Literal
from hexdump2 import hexdump
def xor1(data: bytes | bytearray, n: int, xor_method: Literal):
result = bytearray(data)
for i in range(n):
xor_value = 0
if xor_method == 0:
xor_value = 10 + (i * 10)
elif xor_method == 1:
xor_value = (n - i) * 10
for j in range(8):
result ^= xor_value
return result
def keygen(machine_code: str):
# remove '-' and convert hex to bytes
machine_code = bytes.fromhex(machine_code.replace('-', ''))
data1 = xor1(machine_code, 5, 1)
hexdump(data1)
data2 = machine_code[:4].hex().upper().encode('utf-8')
hexdump(data2)
data2 = data2[::-1] # 反转
hexdump(data2)
data2 = xor1(data2, 5, 1)
hexdump(data2)
# 成功文字
data3 = bytes.fromhex('D1 E9 D6 A4 B3 C9 B9 A6')
data4 = bytearray(data2)
for i in range(8):
data4 ^= data3
hexdump(data4)
print(f'key={data4.hex().upper()}')
if __name__ == '__main__':
keygen('1C99-EA31-DE53-8C96') # FAC08DFB90EAE08D
```
脚本输出
```
0000000006 83 f0 2b c4 49 96 8c |...+.I..|
00000008
0000000031 43 39 39 45 41 33 31 |1C99EA31|
00000008
0000000031 33 41 45 39 39 43 31 |13AE99C1|
00000008
000000002b 29 5b 5f 23 23 59 2b |+)[_##Y+|
00000008
00000000fa c0 8d fb 90 ea e0 8d |........|
00000008
key=FAC08DFB90EAE08D
```
爱飞的猫 发表于 2024-11-26 07:22
代码有 bug。
从堆申请内存(易语言的字符串、字节集都是从堆申请内存),取出指针,然后释放内存。 ...
受教了,学习了,我当时就发现了有点问题,在易语言里面运行正常注册,编译后却注册不上了,当时调试了一下,发现指针内存数据变了。原来是子程序调用完,会释放内存,指针自然就没有了。现在我把变量改成全局变量就不存在这个问题了。
页:
[1]