吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5287|回复: 32
收起左侧

[Web逆向] 某验滑块图片还原

  [复制链接]
冷空气鑫 发表于 2021-7-16 11:31
最近看到一个一个滑块的图片还原挺有意思的,通过js还原,再用画布画上去.
他的原生js长这样
image.png
算法不难看出来 就是把一张图切割成52份(Ge里面包含了切割顺序) 每份宽10px高80px 然后通过getImageData复制原图片的像素 再通过putImageData画进一个新的画布!最开始想着尽量不改变原有代码的情况下,还原用纯js  canvas还原,然后弄了一下午,中途也问过公司的前端,最终放弃.然后就捣鼓这python还原.代码如下:

from PIL import Image
import time
import hashlib

import shutil
class PIG(object):
    def __init__(self):
        ##图片还原的顺序 ,固定不变 除非版本更新
        self.sx=[39,38,48,49,41,40,46,47,35,34,50,51,33,32,28,29,27,26,36,37,31,30,44,45,43,42,12,13,23,22,14,15,21,20,8,9,25,24,6,7,3,2,0,1,11,10,4,5,19,18,16,17]

    def create_dir_not_exist(self,path):
        if not os.path.exists(path):
            os.mkdir(path)

    def get_img(self):
        ###拿到图片还原的坐标 xy
        s=80
        u=10
        self.all=[]
        for  i in range(0,52):
            c=self.sx%26*12+1
            # f=k
            if self.sx>25:
                f=80
            else:
                f=0
            tuple=(c, f, u, s)
            self.all.append(tuple)

    def save_jpg(self,path):
        """
        切割图片
        """
        md5 = hashlib.md5(str(time.time()).encode("utf-8")).hexdigest()
        img = Image.open(path)
        path1 = path.split("/")
        path1=path1[0:-1]
        new_path="/".join(path1)+"/"+md5+"/"
        self.create_dir_not_exist(new_path)
        for  index,i  in enumerate(self.all):
            q=i[0]
            w=i[1]
            e=i[2]
            r=i[3]
            new_img = img.crop((q,w,q+e,w+r))
            new_img.save(f"{new_path}{index}.jpg")
        return new_path

    def work(self,path):
        """
        传入图片路径 ./images/old/12.jpg
        """
        self.get_img()
        new_path=self.save_jpg(path)
        self.pinjie_image(new_path,0,26,"")
        self.pinjie_image(new_path,26,52,1)
        fin_path=self.finally_img(new_path)
        return fin_path

    def pinjie_image(self,old_path,a,b,c):
        joint = Image.new('RGB', (260, 80))
        for i in range(a,b):
            path=f"{old_path}{i}.jpg"
            img=Image.open(path)
            if i>25:
                loca = ((i - 26) * 10, 0)
            else:
                loca = (i * 10, 0)
            joint.paste(img, loca)
        joint.save(f'{old_path}horizontal{c}.png')



    def finally_img(self,path):
        img1 = Image.open(f"{path}horizontal.png")
        img2 = Image.open(f"{path}horizontal1.png")

        joint = Image.new('RGB', (260, 160))
        loc1, loc2 = (0, 0), (0, 80)

        joint.paste(img2, loc2)
        joint.paste(img1, loc1)
        md5 = hashlib.md5(str(time.time()).encode("utf-8")).hexdigest()

        joint.save(f'images/new/{md5}.png')
        shutil.rmtree(path)
        return f'images/new/{md5}.png'

    def is_px_equal(self, img1, img2, x, y):
        """
        判断两个像素是否相同
        :param img1: 图片1
        :param img2:图片2
        :param x:位置1
        :param y:位置2
        :return:像素是否相同
        """
        pix1 = img1.load()[x, y]
        pix2 = img2.load()[x, y]
        threshold = 60

        if abs(pix1[0] - pix2[0]) < threshold and abs(pix1[1] - pix2[1]) < threshold and abs(
                        pix1[2] - pix2[2]) < threshold:
            return True
        else:
            return False

    def get_gap(self, img1, img2):
        """
        获取缺口偏移量
        :param img1: 不带缺口图片
        :param img2: 带缺口图片
        :return:
        """
        left = 0
        for i in range(left, img1.size[0]):
            for j in range(img1.size[1]):
                if not self.is_px_equal(img1, img2, i, j):
                    left = i
                    return left

        return left

if __name__ == '__main__':
    start=PIG()
    path=start.work("images/old/test.jpg")
    path1=start.work("images/old/test1.jpg")
    print(start.get_gap(Image.open(path),Image.open(path1)))
    os.remove(path1)
    os.remove(path)[/mw_shl_code]

完美还原,顺便求出了缺口距离

1111.rar (81.91 KB, 下载次数: 127)

免费评分

参与人数 7吾爱币 +6 热心值 +7 收起 理由
dincia + 1 谢谢@Thanks!
mrxxs + 1 + 1 热心回复!
nmy124 + 1 + 1 谢谢@Thanks!
chenyang33207 + 1 + 1 谢谢@Thanks!
chenkeai深蓝 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
剑来…… + 1 + 1 牛啊牛啊
waltzofjack + 2 + 1 用心讨论,共获提升!

查看全部评分

本帖被以下淘专辑推荐:

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

dejavuwl 发表于 2021-7-16 17:17
所以还原的目的纯粹就是为了那张原图吗?
还是就是纯技术爱好?
QingYi. 发表于 2021-7-25 19:14
看着难受


[Asm] 纯文本查看 复制代码
from PIL import Imageimport time
import hashlib

import shutil
class PIG(object):
    def __init__(self):
        ##图片还原的顺序 ,固定不变 除非版本更新
        self.sx=[39,38,48,49,41,40,46,47,35,34,50,51,33,32,28,29,27,26,36,37,31,30,44,45,43,42,12,13,23,22,14,15,21,20,8,9,25,24,6,7,3,2,0,1,11,10,4,5,19,18,16,17]

    def create_dir_not_exist(self,path):
        if not os.path.exists(path):
            os.mkdir(path)

    def get_img(self):
        ###拿到图片还原的坐标 xy
        s=80
        u=10
        self.all=[]
        for  i in range(0,52):
            c=self.sx%26*12+1
            # f=k
            if self.sx>25:
                f=80
            else:
                f=0
            tuple=(c, f, u, s)
            self.all.append(tuple)

    def save_jpg(self,path):
        """
        切割图片
        """
        md5 = hashlib.md5(str(time.time()).encode("utf-8")).hexdigest()
        img = Image.open(path)
        path1 = path.split("/")
        path1=path1[0:-1]
        new_path="/".join(path1)+"/"+md5+"/"
        self.create_dir_not_exist(new_path)
        for  index,i  in enumerate(self.all):
            q=i[0]
            w=i[1]
            e=i[2]
            r=i[3]
            new_img = img.crop((q,w,q+e,w+r))
            new_img.save(f"{new_path}{index}.jpg")
        return new_path

    def work(self,path):
        """
        传入图片路径 ./images/old/12.jpg
        """
        self.get_img()
        new_path=self.save_jpg(path)
        self.pinjie_image(new_path,0,26,"")
        self.pinjie_image(new_path,26,52,1)
        fin_path=self.finally_img(new_path)
        return fin_path

    def pinjie_image(self,old_path,a,b,c):
        joint = Image.new('RGB', (260, 80))
        for i in range(a,b):
            path=f"{old_path}{i}.jpg"
            img=Image.open(path)
            if i>25:
                loca = ((i - 26) * 10, 0)
            else:
                loca = (i * 10, 0)
            joint.paste(img, loca)
        joint.save(f'{old_path}horizontal{c}.png')



    def finally_img(self,path):
        img1 = Image.open(f"{path}horizontal.png")
        img2 = Image.open(f"{path}horizontal1.png")

        joint = Image.new('RGB', (260, 160))
        loc1, loc2 = (0, 0), (0, 80)

        joint.paste(img2, loc2)
        joint.paste(img1, loc1)
        md5 = hashlib.md5(str(time.time()).encode("utf-8")).hexdigest()

        joint.save(f'images/new/{md5}.png')
        shutil.rmtree(path)
        return f'images/new/{md5}.png'

    def is_px_equal(self, img1, img2, x, y):
        """
        判断两个像素是否相同
        :param img1: 图片1
        :param img2:图片2
        :param x:位置1
        :param y:位置2
        :return:像素是否相同
        """
        pix1 = img1.load()[x, y]
        pix2 = img2.load()[x, y]
        threshold = 60

        if abs(pix1[0] - pix2[0]) < threshold and abs(pix1[1] - pix2[1]) < threshold and abs(
                        pix1[2] - pix2[2]) < threshold:
            return True
        else:
            return False

    def get_gap(self, img1, img2):
        """
        获取缺口偏移量
        :param img1: 不带缺口图片
        :param img2: 带缺口图片
        :return:
        """
        left = 0
        for i in range(left, img1.size[0]):
            for j in range(img1.size[1]):
                if not self.is_px_equal(img1, img2, i, j):
                    left = i
                    return left

        return left

if __name__ == '__main__':
    start=PIG()
    path=start.work("images/old/test.jpg")
    path1=start.work("images/old/test1.jpg")
    print(start.get_gap(Image.open(path),Image.open(path1)))
    os.remove(path1)
    os.remove(path)

[/mw_shl_code]
zhaoshutao123 发表于 2021-7-16 14:25
南宫零 发表于 2021-7-16 15:38
感谢楼主分享..不过我水平不够还没看太懂...
加奈绘 发表于 2021-7-16 16:29
先收藏了,以后慢慢学
xiaoAmie 发表于 2021-7-16 16:45
感谢分享
叶隽 发表于 2021-7-17 00:00
谢谢,学习到了
有白云的日子。 发表于 2021-7-17 01:07
感谢分享,虽然对我没用
woaipojie14152 发表于 2021-7-17 01:58
谢谢分享
cool1000 发表于 2021-7-17 07:47
学习学习。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-21 20:11

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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