吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 929|回复: 8
收起左侧

[学习记录] 汇编_字节集异或

[复制链接]
hdxzd12 发表于 2023-8-16 17:53
屏幕截图 2023-08-16 175159.png

汇编_字节集异或.zip (2.28 KB, 下载次数: 18)

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
MywifeDouma + 1 + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

爱飞的猫 发表于 2023-8-17 07:15
本帖最后由 爱飞的猫 于 2023-8-17 08:48 编辑

如果要优化性能,还是直接传引用然后改比较好,可以纯汇编实现:

.版本 2

.子程序 汇编__字节集_XOR, , , [爱飞的猫 @ 52pojie] 使用汇编对两个字节集进行 XOR 处理
.参数 内容, 字节集, 参考, [ebp + 0x08] 直接更改该参数传参值
.参数 密钥, 字节集, , [ebp + 0x0C] 若短于内容,则重复处理密钥

置入代码 ({ 86, 87, 83, 139, 117, 8, 139, 54, 131, 198, 8, 139, 126, 252, 1, 247, 57, 254, 116, 35, 139, 77, 12, 139, 9, 131, 193, 8, 139, 81, 252, 1, 202, 137, 203, 57, 209, 116, 16, 138, 1, 65, 48, 6, 70, 57, 209, 117, 2, 137, 217, 57, 254, 117, 240, 91, 95, 94 })

汇编代码如下,使用 FASM 编译即可。

use32 ; 爱飞的猫制作
      ; [易语言] 置入代码 - 汇编__字节集_XOR

push esi
push edi
push ebx

p_input     equ esi
p_input_end equ edi
p_key       equ ecx
p_key_end   equ edx
p_key_start equ ebx
temp        equ al

mov p_input, dword[ebp + 0x08]
mov p_input, dword[p_input]
add p_input, 0x08
mov p_input_end, [p_input - 0x04]
add p_input_end, p_input
cmp p_input, p_input_end
je __end

mov p_key, dword[ebp + 0x0C]
mov p_key, dword[p_key]
add p_key, 0x08
mov p_key_end, [p_key - 0x04]
add p_key_end, p_key
mov p_key_start, p_key

cmp p_key, p_key_end
je __end

__loop:
    mov temp, byte[p_key]
    inc p_key

    xor byte[p_input], temp
    inc p_input

    cmp p_key, p_key_end
    jne @f
        mov p_key, p_key_start
    @@:

    cmp p_input, p_input_end
    jne __loop

__end:

pop ebx
pop edi
pop esi

测试代码:

.版本 2

.子程序 _启动子程序, 整数型, , [爱飞的猫] 制作
.局部变量 数据, 字节集
.局部变量 密钥, 字节集

数据 = 到字节集 (“A0 测试内容”)
密钥 = { 255, 0, 0 }
密钥 [2] = 二进制 (“01010101”)
密钥 [3] = 二进制 (“10101010”)

标准输出 (#标准输出设备, “  原始数据 (十六进制): ”)
标准输出 (#标准输出设备, 汇编_字节集到十六进制 (数据, 真))
标准输出 (#标准输出设备, #换行符)

标准输出 (#标准输出设备, “      密钥 (十六进制): ”)
标准输出 (#标准输出设备, 汇编_字节集到十六进制 (密钥, 真))
标准输出 (#标准输出设备, #换行符)

汇编__字节集_XOR (数据, 密钥)  ' 第一次处理

标准输出 (#标准输出设备, “第一次处理 (十六进制): ”)
标准输出 (#标准输出设备, 汇编_字节集到十六进制 (数据, 真))
标准输出 (#标准输出设备, #换行符)

汇编__字节集_XOR (数据, 密钥)  ' 第二次处理

标准输出 (#标准输出设备, “第二次处理 (十六进制): ”)
标准输出 (#标准输出设备, 汇编_字节集到十六进制 (数据, 真))
标准输出 (#标准输出设备, #换行符)

标准输出 (#标准输出设备, “第二次处理 (字 符 串): ”)
标准输出 (#标准输出设备, 到文本 (数据))
标准输出 (#标准输出设备, #换行符)

标准输入 (假)
返回 (0)  ' 可以根据您的需要返回任意数值

输出:

  原始数据 (十六进制): 41 30 20 B2 E2 CA D4 C4 DA C8 DD
      密钥 (十六进制): FF 55 AA
第一次处理 (十六进制): BE 65 8A 4D B7 60 2B 91 70 37 88
第二次处理 (十六进制): 41 30 20 B2 E2 CA D4 C4 DA C8 DD
第二次处理 (字 符 串): A0 测试内容

来跑个测速,测速代码:

.版本 2

.子程序 测速
.局部变量 数据, 字节集
.局部变量 数据副本, 字节集
.局部变量 密钥, 字节集
.局部变量 开始时间, 整数型
.局部变量 耗时毫秒, 整数型
.局部变量 耗时记录, 双精度小数型, , "1"
.局部变量 次数, 整数型
.局部变量 耗时最高, 整数型
.局部变量 耗时最低, 整数型
.局部变量 累计耗时, 整数型
.局部变量 平均耗时, 整数型
.局部变量 切尾均值, 双精度小数型

数据副本 = 到字节集 (“A1 测试内容”)
密钥 = { 255, 0, 0, 0 }
密钥 [2] = 二进制 (“01010101”)
密钥 [3] = 二进制 (“10101010”)

' #采样次数 = 10
重定义数组 (耗时记录, 假, #采样次数)

.计次循环首 (#采样次数, 次数)  ' 取样 10 次
    开始时间 = 取启动时间 ()
    .计次循环首 (100 × 10000, )
        数据 = 数据副本
        汇编__字节集_XOR (数据, 密钥)
    .计次循环尾 ()
    耗时毫秒 = 取启动时间 () - 开始时间

    累计耗时 = 累计耗时 + 耗时毫秒
    耗时记录 [次数] = 耗时毫秒
    printf__siis_v (“百万次执行耗时 [%02d] -- %dms%s”, 次数, 耗时毫秒, #换行符)
.计次循环尾 ()

数组排序 (耗时记录, 真)

' 切尾均值: 去掉两个最低和最高的成绩,再次计算
平均耗时 = 累计耗时 ÷ #采样次数
切尾均值 = (累计耗时 - 耗时记录 [1] - 耗时记录 [2] - 耗时记录 [#采样次数 - 0] - 耗时记录 [#采样次数 - 1]) ÷ (#采样次数 - 4)

printf__dds_v (“  平均耗时: %.2fms (切尾均值=%.2fms)%s”, 平均耗时, 切尾均值, #换行符)
printf__is_v (“  最佳成绩: %dms%s”, 耗时记录 [1], #换行符)
printf__is_v (“  最差成绩: %dms%s”, 耗时记录 [#采样次数 + 0], #换行符)

.DLL命令 printf__siis_v, , "msvcrt.dll", "@printf"
    .参数 fmt, 文本型
    .参数 i1, 整数型
    .参数 i2, 整数型
    .参数 s1, 文本型

.DLL命令 printf__dds_v, , "msvcrt.dll", "@printf"
    .参数 fmt, 文本型
    .参数 d1, 双精度小数型
    .参数 d2, 双精度小数型
    .参数 s1, 文本型

.DLL命令 printf__is_v, , "msvcrt.dll", "@printf"
    .参数 fmt, 文本型
    .参数 i1, 整数型
    .参数 s1, 文本型

.常量 采样次数, "10"

测速结果(静态编译):

百万次执行耗时 [01] -- 62ms
百万次执行耗时 [02] -- 78ms
百万次执行耗时 [03] -- 63ms
百万次执行耗时 [04] -- 63ms
百万次执行耗时 [05] -- 62ms
百万次执行耗时 [06] -- 63ms
百万次执行耗时 [07] -- 78ms
百万次执行耗时 [08] -- 63ms
百万次执行耗时 [09] -- 62ms
百万次执行耗时 [10] -- 63ms
  平均耗时: 65.00ms (切尾均值=62.83ms)
  最佳成绩: 62ms
  最差成绩: 78ms

然后测测你的(静态编译):

百万次执行耗时 [01] -- 156ms
百万次执行耗时 [02] -- 141ms
百万次执行耗时 [03] -- 141ms
百万次执行耗时 [04] -- 156ms
百万次执行耗时 [05] -- 140ms
百万次执行耗时 [06] -- 141ms
百万次执行耗时 [07] -- 141ms
百万次执行耗时 [08] -- 156ms
百万次执行耗时 [09] -- 141ms
百万次执行耗时 [10] -- 140ms
  平均耗时: 145.00ms (切尾均值=143.50ms)
  最佳成绩: 140ms
  最差成绩: 156ms

感觉应该是 参与异或的字节集 = 取重复字节集 (参与异或的字节集长度, 参与异或的字节集) 这一行对性能的影响最大。

易语言代码(附赠一个 汇编_字节集到十六进制 的实现):
汇编_字节集处理.7z (2.7 KB, 下载次数: 3)

免费评分

参与人数 1吾爱币 +3 热心值 +1 收起 理由
610100 + 3 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

tly111222 发表于 2023-8-16 19:00
gjdir 发表于 2023-8-16 19:26
头像被屏蔽
moruye 发表于 2023-8-16 20:51
提示: 作者被禁止或删除 内容自动屏蔽
lixiong627 发表于 2023-8-16 22:31
感谢分享
 楼主| hdxzd12 发表于 2023-8-17 08:49
爱飞的猫 发表于 2023-8-17 07:15
[md]如果要优化性能,还是直接传引用然后改比较好,可以纯汇编实现:

```text

能不能在这里加一个返回值
屏幕截图 2023-08-17 084833.png

点评

速度会慢一倍,因为易语言会申请一样大的内存然后重新拷贝过去。  详情 回复 发表于 2023-8-17 08:51
爱飞的猫 发表于 2023-8-17 08:51
本帖最后由 爱飞的猫 于 2023-8-17 09:38 编辑
20230713G001133 发表于 2023-8-17 08:49
能不能在这里加一个返回值

速度会慢一倍,因为易语言会申请一样大的内存然后重新拷贝过去。

.版本 2

.子程序 汇编__字节集_XOR_拷贝1, 字节集, , 不更改参数,返回新的字节集。
.参数 内容, 字节集
.参数 密钥, 字节集, , 若短于内容,则重复处理密钥
.局部变量 内容副本, 字节集, , , ebp - 4

内容副本 = 内容  ' 申请内存,会变慢
汇编__字节集_XOR (内容副本, 密钥)
返回 (内容副本)

.子程序 汇编__字节集_XOR_拷贝2, 字节集, , 不更改参数,返回新的字节集。
.参数 内容, 字节集
.参数 密钥, 字节集, , 若短于内容,则重复处理密钥
.局部变量 内容副本, 字节集, , , ebp - 4

内容副本 = 内容  ' 申请内存,会变慢
置入代码 ({ 86, 87, 83, 139, 117, 252, 131, 198, 8, 139, 126, 252, 1, 247, 57, 254, 116, 35, 139, 77, 12, 139, 9, 131, 193, 8, 139, 81, 252, 1, 202, 137, 203, 57, 209, 116, 16, 138, 1, 65, 48, 6, 70, 57, 209, 117, 2, 137, 217, 57, 254, 117, 240, 91, 95, 94 })
返回 (内容副本)

测试结果

性能测试_无拷贝
百万次执行耗时 [01] -- 78ms
百万次执行耗时 [02] -- 62ms
百万次执行耗时 [03] -- 63ms
百万次执行耗时 [04] -- 62ms
百万次执行耗时 [05] -- 63ms
百万次执行耗时 [06] -- 47ms
百万次执行耗时 [07] -- 62ms
百万次执行耗时 [08] -- 63ms
百万次执行耗时 [09] -- 62ms
百万次执行耗时 [10] -- 63ms
  平均耗时: 62.00ms (切尾均值=62.50ms)
  最佳成绩: 47ms
  最差成绩: 78ms

性能测试_拷贝1
百万次执行耗时 [01] -- 172ms
百万次执行耗时 [02] -- 172ms
百万次执行耗时 [03] -- 171ms
百万次执行耗时 [04] -- 172ms
百万次执行耗时 [05] -- 172ms
百万次执行耗时 [06] -- 172ms
百万次执行耗时 [07] -- 172ms
百万次执行耗时 [08] -- 187ms
百万次执行耗时 [09] -- 172ms
百万次执行耗时 [10] -- 172ms
  平均耗时: 173.00ms (切尾均值=172.00ms)
  最佳成绩: 171ms
  最差成绩: 187ms

性能测试_拷贝2
百万次执行耗时 [01] -- 172ms
百万次执行耗时 [02] -- 156ms
百万次执行耗时 [03] -- 172ms
百万次执行耗时 [04] -- 172ms
百万次执行耗时 [05] -- 172ms
百万次执行耗时 [06] -- 172ms
百万次执行耗时 [07] -- 172ms
百万次执行耗时 [08] -- 156ms
百万次执行耗时 [09] -- 172ms
百万次执行耗时 [10] -- 172ms
  平均耗时: 168.00ms (切尾均值=172.00ms)
  最佳成绩: 156ms
  最差成绩: 172ms

这个代码我就不打包了… 如果真的需要就直接复制来用吧

zxmkji 发表于 2023-10-2 12:46
牛逼牛逼
感谢分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 19:37

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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