Joe1sn's Cabinet

【破解】一次无害的Coploit激活工具破解

难度:⭐

- 要不要后面把怎么写外挂啥的放上来?还是说开一个知识星球?-

难度一星,一颗给go,一颗给密码学,减一颗给简单的认证过程

静态分析

首先是来源

image-20240328142334526

下载Windows版看看

image-20240328142559130

哦?golang打包的,看看版本

1
2
> go version .\authTool.exe
.\authTool.exe: go1.21.0

有点难搞啊,有无Go是无符号的,IDA打开看也是一坨

粗略动态

这个阶段就是看网络活动,文件操作等等,先打开WireSharkProcmon64

image-20240328142838195

然后打开软件跑一下

image-20240328143029707

这个时候ProcessMonitor已经有了,凭经验来说这里只有网络连接有点价值

image-20240328143233355

两个IP:43.x.x.x(记为ipA)和149.x.x.x(记为ipB),按照先后顺序看

在wireshark中ip.addr == 43.x.x.x

image-20240328143548755

image-20240328143744161

在wireshark中ip.addr == 149.x.x.x

image-20240328144255295

两段都是密文,一眼base64,而且解码完成过后也是乱码,接下来回到你想本身

动静结合

根据运行时候的字符串,用golang写过网络请求的小伙伴都知道,网络请求部分是在net库中,立刻在main_main中找到相关

image-20240328145108076

有时间的还在静态跟流程,心急的已经开始用ida动调了

43.x.x.x

写过golang的都知道,获得发送完请求的结果需要使用一个ReadAll之类的东西

image-20240328145645886

看看下面的AES解密

image-20240328145713758

发现有个相关值1234567890123456,但是CBC加密方式的话不知道这个是key还是iv,动态看看

image-20240328145840300

这里slicebytetostring刚好返回,根据汇编的传参,说明接收到的内容可能在RAX寄存器里面

image-20240328150411467

和wireshark拦截到的报文一样,跟进AES解密看看

image-20240328150500799

这里可以自己确认一下,确实是Base64解码的

image-20240328151834101

这里看一下crypto_aes_NewCipher,根据Windows下的传参规则,看一下栈和rcxrdxr8r9 ...

image-20240328152054358

那么应该就是Key了

image-20240328150718900

这里要开始解密了对吧,还是看下相关参数

猜测:这时候的key和iv都是1234567890123456,写个python脚本验证下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
import base64

def aes_cbc_decrypt(key, iv, ciphertext):
cipher = AES.new(key, AES.MODE_CBC, iv)
plaintext = cipher.decrypt(ciphertext)
plaintext = unpad(plaintext, AES.block_size)
return plaintext

def main():
# 密钥和IV(Initialization Vector)
key = b'1234567890123456'
iv = b'1234567890123456'
ciphertext = base64.b64decode(b'k9FQxxxxxxxxxxxxxxxxxxx9wy7w==')

# 解密
plaintext = aes_cbc_decrypt(key, iv, ciphertext)

# 输出解密后的明文
print("Decrypted plaintext:\n", plaintext.decode('utf-8'))

if __name__ == "__main__":
main()

得到了两个IP,根据后续操作会把解密出的字符串按照,切分开,而且第一个ip就是wireshark得到的,那么就是一个主用,一个备用两个IP

image-20240328152657681

image-20240328153020248

143.x.x.x

image-20240328153057080

image-20240328153154421

image-20240328153647769

这里有个很明显的拼接api的操作,得到url:http://149.x.x.x:8699/api/v,和ipB的流量对上了

image-20240328153718535

接着用了和上面一样的解密函数,解密一下看看

image-20240328153927993

发现了一个新的url,记为urlB

image-20240328154034283

image-20240328154130156

解析这个json,然后就是一些文件操作,然后来到了输入激活码的地方

激活

image-20240328154349545

image-20240328154517796

第一处认证,说明输入的激活码长度要为16,这里后续可能要patch,记一下patch点:00000000006A3CF1

image-20240328154705589

这里还有后续都做了一些信息搜集,其中包括有:时间戳,主机名(hostname),所有网卡的mac,本地IP,还有一个user(可能是正确的激活码才会有的)

image-20240328155108207

这里调用了一个main_ec,先看一下截至目前拼接的字符串

image-20240328155141755

image-20240328155231715

不用认证分析了,功能:加密,key和iv两个都试一下,密文选择后面base64过后的内容

image-20240328160202691

image-20240328160242425

最后发现使用,key:1234567890ABCDEF,iv:ABCDEF1234567890

image-20240328160352591

image-20240328160553109

image-20240328160643189

拼接好参数,用最开始通讯的密钥和iv进行加密,使用POST送回服务端,貌似我们距离最后的认证也来越近了

校验

image-20240328161126355

image-20240328161105890

接收到返回后就开始各种比较,那么这里就是校验的地方了,直接nop或者jmp掉就可以了,注意jmp的话栈上面的修改别覆盖了,得到第二个patch的位置:00000000006A4293

这里动态调试我就直接改rip过了

image-20240328161249744

image-20240328161327045

破解coploit

哈哈,你不会真的以为有什么方法能免费试用coploit吧

无害之处就在于此

就和chatGPT一样,这个用的时候要联网,联网会验证token,所以这样的token肯定没有在他数据库里面注册过

这些平台只是做一个流量转发,买几个key然后做个token转换然后卖给大家用而已,是不是割韭菜就仁者见仁智者见智了

image-20240328161936587

根据我所了解的大多是修改js文件等等的操作进行的,后续具体修改插件什么的操作,js相关文件怎么实现的,就不再分析了,点到为止

打包

截图的地址可能有问题是因为我重新用IDA打开过一次

0x6A3CF1

image-20240328162119065

nop掉,但是这个内容会返回到服务端,如果服务端默认这个是16个字符串而且使用了下标寻找内容,可能会出问题

image-20240328162228494

0x6A4293

需要注意的是

1
2
3
4
5
6
7
.text:00000000006A42B5                 mov     rax, [rsp+0A58h+var_5F0]
.text:00000000006A42BD mov rbx, [rsp+0A58h+var_968]
.text:00000000006A42C5 mov rcx, [rsp+0A58h+var_560]
.text:00000000006A42CD mov rdi, [rsp+0A58h+var_8C8]
.text:00000000006A42D5 mov rsi, [rsp+0A58h+var_680]
.text:00000000006A42DD mov r8, [rsp+0A58h+var_9C8]
.text:00000000006A42E5 call main_writeHostsJSON2

这段修改了寄存器的值,如果跳过可能对main_writeHostsJSON2有不好的影响,把校验全部nop

image-20240328165823229


初步达到效果

image-20240328170337749

网络连接

思路A

根据相关传参,按照一下两次jmp

1
2
3
4
5
.text: 00000000006631B9                 call    net_http___Client__Get
.text: 00000000006638D8 call os_UserHomeDir
----------------------------------------------------------------------------
.text: 00000000006641B4 call net_http___Client__Post
.text: 00000000006642B5 mov rax, [rsp+0A58h+var_5F0]

思路B

修改域名和ip为自己的,自己搭一套服务

  1. urlA的网络模拟

    urls = authURL_A+“,”+authURL_B

    使用Key-iv = 1234567890123456-1234567890123456进行AES-CBC加密urls 并返回

  2. urlB的网络模拟

    返回如下json值

    1
    {"link":"https://xxxxx.xyz/xxxx.html","type":"x","title":"x.x","id":x,"linktext":"xxxxxxxxx"}
  3. 接收post传参,返回值随便(客户端得patch)


最终效果

image-20240328174729083