查看: 1198|回复: 2

[其他分享] 分享绝地求生源码解密

[复制链接]
发表于 2018-1-12 12:49 | 显示全部楼层 |阅读模式
非法程序、 2018-1-12 12:49 1198 2 显示全部楼层
.版本 2

.子程序 Test, 整数型
.参数 解密基址, 长整数型
.局部变量 未知基址, 长整数型
.局部变量 获取基址, 长整数型
.局部变量 _0x160, 长整数型
.局部变量 _0x168, 长整数型
.局部变量 _0x164, 整数型
.局部变量 _0x16C, 整数型
.局部变量 Rbx, 长整数型
.局部变量 eax, 整数型
.局部变量 ecx, 整数型
.局部变量 Bx, 整数型
.局部变量 Bp, 整数型
.局部变量 si, 整数型
.局部变量 r9d, 整数型
.局部变量 edi, 整数型
.局部变量 edx, 整数型
.局部变量 r8d, 整数型

未知基址 = TslGame + 61862176
获取基址 = TslGame + 64926352

_0x160 = X64_读整数 (ADD_C (解密基址, 352))
_0x164 = X64_读整数 (ADD_C (解密基址, 356), 4)
_0x168 = X64_读整数 (ADD_C (解密基址, 360))
_0x16C = X64_读整数 (ADD_C (解密基址, 364), 4)

Rbx = 左移_ (_0x16C, 32)

eax = 3365
Bx = Asm_Not (Asm_到短整数 (Rbx))
Bp = 到短整数 (_0x16C)
si = Asm_到短整数 (_0x168)

edi = 0

.如果 (Bx = -1)
    Bx = 位异或 (65535, Bp)
.否则
    Bx = 位异或 (Bx, Bp)
.如果结束

Bx = 位异或 (Bx, si)

Bx = 位异或 (Bx, eax)

.计次循环首 (5, )
    r9d = Asm_到短整数 (Bx)
    eax = r9d
    eax = 位异或 (eax, edi)

    eax = 位异或 (eax, 28)

    eax = 到整数 (到字节 (eax))

    ecx = X64_读整数 (ADD_C (未知基址, eax), 1)

    eax = X64_读整数 (ADD_C (未知基址, ecx), 1)

    eax = 位与 (eax, 3)

    eax = ADD_D (edi, 2)

    edi = ADD_D (edi, 1)

    eax = 位异或 (eax, 28)

    ecx = 到整数 (到字节 (eax))

    eax = X64_读整数 (ADD_C (未知基址, ecx), 1)
    ecx = X64_读整数 (ADD_C (未知基址, eax), 1)

    eax = r9d
    eax = 位异或 (eax, 17408)

    ecx = 位与 (ecx, 3)
    eax = 右移 (eax, 8)
    r9d = 位异或 (r9d, 85)
    eax = X64_读整数 (ADD_C (未知基址, eax), 1)
    edx = X64_读整数 (ADD_C (未知基址, eax), 1)
    eax = 到字节 (r9d)
    ecx = X64_读整数 (ADD_C (未知基址, eax), 1)
    Bx = X64_读整数 (ADD_C (未知基址, ecx), 1)
    Bx = 左移 (Bx, 8)
    Bx = 位或 (Bx, edx)


.计次循环尾 ()

eax = Bx
eax = 位异或 (eax, 3618593468)

Bx = eax
eax = Asm_到短整数 (右移 (eax, 16))
edx = 到字节 (eax)

eax = Bx
eax = 右移 (eax, 8)
ecx = 到字节 (eax)

eax = Bx
eax = 到字节 (右移 (eax, 24))


r8d = X64_读整数 (ADD_C (ADD_C (获取基址, edx × 4), 1024), 4)
r8d = 位异或 (r8d, X64_读整数 (ADD_C (ADD_C (获取基址, ecx × 4), 2048), 4))
r8d = 位异或 (r8d, X64_读整数 (ADD_C (ADD_C (获取基址, eax × 4), 0), 4))
eax = 799063683
ecx = 到字节 (Bx)
r8d = 位异或 (r8d, X64_读整数 (ADD_C (ADD_C (获取基址, ecx × 4), 3072), 4))
edx = 右移 (Ams_乘法取高位 (r8d, 799063683), 3)
ecx = 到字节 (edx × 43)
r8d = SUB_D (到字节 (Asm_Not (r8d)), ecx)
返回 (r8d)


.子程序 Test2, 整数型
.参数 解密基址, 长整数型
.局部变量 未知基址, 长整数型
.局部变量 获取基址, 长整数型
.局部变量 _0x160, 长整数型
.局部变量 _0x168, 长整数型
.局部变量 _0x164, 整数型
.局部变量 _0x16C, 整数型
.局部变量 Rbx, 长整数型
.局部变量 eax, 整数型
.局部变量 ecx, 整数型
.局部变量 Bx, 整数型
.局部变量 Bp, 整数型
.局部变量 si, 整数型
.局部变量 r9d, 整数型
.局部变量 edi, 整数型
.局部变量 edx, 整数型
.局部变量 r8d, 整数型

未知基址 = TslGame + 61862176
获取基址 = TslGame + 64926352

_0x160 = X64_读整数 (ADD_C (解密基址, 368))
_0x164 = X64_读整数 (ADD_C (解密基址, 372), 4)
_0x168 = X64_读整数 (ADD_C (解密基址, 376))
_0x16C = X64_读整数 (ADD_C (解密基址, 380), 4)
Rbx = 左移_ (_0x16C, 32)

eax = 3365
Bx = Asm_Not (Asm_到短整数 (Rbx))
Bp = 到短整数 (_0x16C)
si = Asm_到短整数 (_0x168)

edi = 0

.如果 (Bx = -1)
    Bx = 位异或 (65535, Bp)
.否则
    Bx = 位异或 (Bx, Bp)
.如果结束
Bx = 位异或 (Bx, si)
Bx = 位异或 (Bx, eax)

.计次循环首 (5, )
    r9d = Asm_到短整数 (Bx)
    eax = r9d
    eax = 位异或 (eax, edi)

    eax = 位异或 (eax, -84)

    eax = 到整数 (到字节 (eax))
    ecx = X64_读整数 (ADD_C (未知基址, eax), 1)
    eax = X64_读整数 (ADD_C (未知基址, ecx), 1)
    eax = 位与 (eax, 3)
    eax = ADD_D (edi, 2)

    edi = ADD_D (edi, 1)

    eax = 位异或 (eax, -84)
    ecx = 到整数 (到字节 (eax))
    eax = X64_读整数 (ADD_C (未知基址, ecx), 1)
    ecx = X64_读整数 (ADD_C (未知基址, eax), 1)
    eax = r9d
    eax = 位异或 (eax, 17408)
    ecx = 位与 (ecx, 3)
    eax = 右移 (eax, 8)
    r9d = 位异或 (r9d, 85)
    eax = X64_读整数 (ADD_C (未知基址, eax), 1)
    edx = X64_读整数 (ADD_C (未知基址, eax), 1)
    eax = 到字节 (r9d)
    ecx = X64_读整数 (ADD_C (未知基址, eax), 1)
    Bx = X64_读整数 (ADD_C (未知基址, ecx), 1)
    Bx = 左移 (Bx, 8)
    Bx = 位或 (Bx, edx)


.计次循环尾 ()

eax = Bx
eax = 位异或 (eax, 1558700812)

Bx = eax
eax = Asm_到短整数 (右移 (eax, 16))
edx = 到字节 (eax)

eax = Bx
eax = 右移 (eax, 8)
ecx = 到字节 (eax)

eax = Bx
eax = 到字节 (右移 (eax, 24))


r8d = X64_读整数 (ADD_C (ADD_C (获取基址, edx × 4), 1024), 4)
r8d = 位异或 (r8d, X64_读整数 (ADD_C (ADD_C (获取基址, ecx × 4), 2048), 4))
r8d = 位异或 (r8d, X64_读整数 (ADD_C (ADD_C (获取基址, eax × 4), 0), 4))

ecx = 到字节 (Bx)
r8d = 位异或 (r8d, X64_读整数 (ADD_C (ADD_C (获取基址, ecx × 4), 3072), 4))
edx = 右移 (Ams_乘法取高位 (r8d, 799063683), 3)
ecx = 到字节 (edx × 43)
r8d = SUB_D (到字节 (Asm_Not (r8d)), ecx)
返回 (r8d)

.子程序 Ams_乘法取高位, 整数型
.参数 整数1, 整数型
.参数 整数2, 整数型
.局部变量 Ret, 整数型

Ret = 0
置入代码 ({ 139, 77, 8, 139, 69, 12, 247, 209, 247, 225, 137, 85, 252 })
返回 (Ret)

.子程序 Asm_Not, 整数型
.参数 整数, 整数型
.局部变量 Ret, 整数型

Ret = 0
置入代码 ({ 139, 69, 8, 247, 208, 137, 69, 252 })
返回 (Ret)

.子程序 Asm_到短整数, 整数型
.参数 整数, 整数型
.局部变量 Ret, 整数型

Ret = 0
置入代码 ({ 139, 133, 8, 0, 0, 0, 15, 183, 192, 137, 133, 252, 255, 255, 255 })
返回 (Ret)


.版本 2

.子程序 右移_, 长整数型, , 将某整数的数据位右移指定位数,返回移动后的结果。本命令为中级命令。
.参数 欲移动的整数, 长整数型
.参数 欲移动的位数, 整数型

' push ebp
置入代码 ({ 137, 229, 139, 69, 8, 139, 85, 12, 139, 77, 16, 232, 4, 0, 0, 0, 93, 194, 12, 0, 128, 249, 64, 115, 22, 128, 249, 32, 115, 6, 15, 173, 208, 211, 250, 195, 137, 208, 193, 250, 31, 128, 225, 31, 211, 248, 195, 193, 250, 31, 137, 208, 195 })
' 本源码来自易语言资源网(www.5A5X.com)
' mov ebp,esp
' mov eax,[ebp+0x8]
' mov edx,[ebp+0xC]
' mov ecx,[ebp+0x10]
' call a0
' pop ebp
' retn 0xC
' a0:
' cmp cl,0x40
' jnb short a1
' cmp cl,0x20
' jnb short a2
' shrd eax,edx,cl
' sar edx,cl
' retn
' a2:
' mov eax,edx
' sar edx,0x1F
' and cl,0x1F
' sar eax,cl
' retn
' a1:
' sar edx,0x1F
' mov eax,edx
' retn
返回 (0)

.子程序 左移_, 长整数型, , 将某整数的数据位左移指定位数,返回移动后的结果。本命令为中级命令。
.参数 欲移动的整数, 长整数型
.参数 欲移动的位数, 整数型

' push ebp
置入代码 ({ 137, 229, 139, 69, 8, 139, 85, 12, 139, 77, 16, 232, 4, 0, 0, 0, 93, 194, 12, 0, 128, 249, 64, 115, 21, 128, 249, 32, 115, 6, 15, 165, 194, 211, 224, 195, 137, 194, 49, 192, 128, 225, 31, 211, 226, 195, 49, 192, 49, 210, 195 })
' mov ebp,esp
' mov eax,[ebp+0x8]
' mov edx,[ebp+0xC]
' mov ecx,[ebp+0x10]
' call a0
' pop ebp
' retn 0xC
' a0:
' cmp cl,0x40
' jnb a1
' cmp cl,0x20
' jnb a2
' shld edx,eax,cl
' shl eax,cl
' retn
' a2:
' mov edx,eax
' xor eax,eax
' and cl,0x1F
' shl edx,cl
' retn
' a1:
' xor eax,eax
' xor edx,edx
' retn
返回 (0)

.子程序 位与_, 长整数型, , 如两个数值有某共同比特位为1,则返回值的对应位也为1,否则为0。返回计算后的结果。本命令为中级命令。命令参数表中最后一个参数可以被重复添加。
.参数 位运算数值一, 长整数型
.参数 位运算数值二, 长整数型

' push ebp' 本源码来自易语言资源网(www.5A5X.com)
置入代码 ({ 137, 229, 139, 69, 8, 35, 69, 16, 139, 85, 12, 35, 85, 20, 93, 194, 16, 0 })
' mov ebp,esp
' mov eax,[ebp+0x8]
' and eax,[ebp+0x10]
' mov edx,[ebp+0xC]
' and edx,[ebp+0x14]
' pop ebp
' retn 0x10
返回 (0)

.子程序 位或_, 长整数型, , 如两个数值中有一个数值的某一比特位不为零,则返回值的对应位就为1,否则为0。返回计算后的结果。本命令为中级命令。命令参数表中最后一个参数可以被重复添加。
.参数 位运算数值一, 长整数型
.参数 位运算数值二, 长整数型

' push ebp
置入代码 ({ 137, 229, 139, 69, 8, 11, 69, 16, 139, 85, 12, 11, 85, 20, 93, 194, 10, 0 })
' mov ebp,esp
' mov eax,[ebp+0x8]
' or eax,[ebp+0x10]
' mov edx,[ebp+0xC]
' or edx,[ebp+0x14]
' pop ebp
' retn 10
返回 (0)

.子程序 Xor_, 长整数型
.参数 位运算数值一, 长整数型
.参数 位运算数值二, 长整数型

置入代码 ({ 139, 236, 139, 133, 8, 0, 0, 0, 51, 133, 16, 0, 0, 0, 139, 149, 12, 0, 0, 0, 51, 149, 20, 0, 0, 0, 93, 194, 16, 0 })
返回 (0)



.版本 2

.子程序 GetGNames, 文本型
.参数 ID, 整数型
.局部变量 GNamesAddress, 长整数型, 静态
.局部变量 NamePtr, 长整数型
.局部变量 Name, 长整数型
.局部变量 IdDiv, 整数型
.局部变量 Idtemp, 整数型

.如果真 (ID ≤ 0 或 ID ≥ 200000)
    返回 (“”)
.如果真结束
.如果真 (GNamesAddress = 0)
    GNamesAddress = Xor_ (X64_读整数 (ADD_C (ADD_C (TslGame, 66283840), Test (ADD_C (TslGame, 66283840)) × 8)), Test2 (ADD_C (TslGame, 66283840)))
.如果真结束
.如果真 (GNamesAddress > 0)
    IdDiv = 到整数 (ID ÷ 16384)
    Idtemp = 到整数 (ID % 16384)
    NamePtr = X64_读整数 (GNamesAddress + IdDiv × 8, 8)
    Name = X64_读整数 (NamePtr + 8 × Idtemp, 8)
    返回 (到文本 (X64读内存 (Name + 16, 64)))
.如果真结束
返回 (“”)

发表于 2018-1-12 14:22 | 显示全部楼层
1098765787 2018-1-12 14:22 显示全部楼层
感谢楼主分享!zn50有你更精彩!
回复

使用道具 举报

发表于 2018-1-12 15:12 来自手机 | 显示全部楼层
x78807100 2018-1-12 15:12 显示全部楼层
加密基址解密吗,缺模块啊。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则 返回列表 发新帖

快速回复 返回顶部 返回列表