吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2647|回复: 10
收起左侧

[CrackMe] 伪64位CM

[复制链接]
JuncoJet 发表于 2020-9-25 15:17
CM是什么?Crackme是什么?这是什么东西?楼主发的什么?
他们都是一些公开给别人尝试破解的小程序,制作 Crackme 的人可能是程序员,想测试一下自己的软件保护技术,也可能是一位 Cracker,想挑战一下其它 Cracker 的破解实力,也可能是一些正在学习破解的人,自己编一些小程序给自己破解,KeyGenMe是要求别人做出它的 keygen (序号产生器), ReverseMe 要求别人把它的算法做出逆向分析, UnpackMe 是要求别人把它成功脱壳,本版块禁止回复非技术无关水贴。

本帖最后由 JuncoJet 于 2020-9-25 15:48 编辑


编写语言VB6+VC2005+NASM

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册[Register]

x

免费评分

参与人数 3吾爱币 +8 热心值 +3 收起 理由
foolboy + 1 + 1 现在还有人用VB 太念旧了
张小凡。 + 1 + 1 热心回复!
CrazyNut + 6 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

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

solly 发表于 2020-9-26 12:36
JuncoJet 发表于 2020-9-25 22:31
我觉得这种伪64位好像有BUG
调试我没调,因为调不了……
不过编写时发现,我无论用 push [rbx] pop rcx ...

可以取到高位值呀,我的测试代码如下:
[C++] 纯文本查看 复制代码
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <Windows.h>


int WINAPI WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow) {

    MessageBox(0, L"start", L"test", MB_OK);

    char strs[] = "0123456789ABCDEF";
    long a = 0, b = 0, c = 0;

    __asm {
        push eax
        push ebx
        push ecx
        push edx
        push ebp
        lea edx, strs
        /// 注意修改ebp后不能使用前面定义的局部变量,要在修改前使用。
        mov ebp, esp       /// 保存esp
        xor eax, eax
        xor ecx, ecx
        mov ebx, x32code   /// get exit point
        push 0x33
        push offset x64code
        jmp far fword ptr ss:[esp];
    x64code:
        //db 0x48, 0x8B, 0x02  //MOV RAX, QWORD PTR DS:[RDX]
        _EMIT 0x48
        _EMIT 0x8B
        _EMIT 0x02
        //db 0x48, 0x8B, 0xC8  //MOV RCX, RAX   ;低32位
        _EMIT 0x48
        _EMIT 0x8B
        _EMIT 0xC8
        //db 0x48, 0xC1, 0xF8, 0x20 //SAR RAX, 32 ; 高32bit
        _EMIT 0x48
        _EMIT 0xC1
        _EMIT 0xF8
        _EMIT 0x20
        //db 0xC7, 0x44, 0x24, 0x04, 0x23, 0x00, 0x00, 0x00 //MOV DWORD PTR SS:[RSP+4], 0x23
        _EMIT 0xC7
        _EMIT 0x44
        _EMIT 0x24
        _EMIT 0x04
        _EMIT 0x23
        _EMIT 0x00
        _EMIT 0x00
        _EMIT 0x00

        //db 0x89, 0x1C, 0x24    ///MOV DWORD PTR SS:[RSP], EBX
        _EMIT 0x89
        _EMIT 0x1C
        _EMIT 0x24
        //db 0xFF, 0x2C, 0x24    ///JMP FAR FWORD PTR SS:[RSP]
        _EMIT 0xFF
        _EMIT 0x2C
        _EMIT 0x24
    x32code:
        mov esp, ebp /// 恢复 esp
        pop ebp      /// 使用局部变量前恢复 ebp
        mov a, eax   /// 高32位
        mov b, ebx
        mov c, ecx   /// 低32位
        pop edx
        pop ecx
        pop ebx
        pop eax
    }

    WCHAR buffer[64];
    swprintf_s(buffer, L"eax = 0x%08X, ecx = 0x%08X", a, c);
    MessageBox(0, buffer, L"result", MB_OK);

    ExitProcess(0);

	return 0;
}
solly 发表于 2020-9-25 20:12
本帖最后由 solly 于 2020-9-25 20:45 编辑

是一个多解题:

汇编码:
[Asm] 纯文本查看 复制代码
 xor rax,rax                            
 push qword ptr ds:[rdx]                
 push qword ptr ds:[rdx+4]              
 pop rdx                                
 pop rcx                                
 or rcx,rdx                             
 mov rdx,8771432856936762               
 xor rcx,rdx                            
 shl rdx,6                              
 xor rcx,rdx                            
 mov edx,8E34CA8D                       
 cmp ecx,edx                            
 jne $+3 ;(跳过 inc rax 指令)                 
 inc rax                                
 xor rdx,rdx                            
 xor rcx,rcx                            
 mov dword ptr ss:[rsp+4],23            
 mov dword ptr ss:[rsp],ebx             
 jmp far fword ptr ss:[rsp]  

按两个 push 的长度算,中间有4字节重叠,按其计算结果,只要前4字符与后4字符重复,中间可以插入4个字符,中间4字符与前面4字符的 or 计算为 0xXXXXXXXX7C7E756F 即可,X为任何值,因为只有低32位比较,高32位无要求。
上面的我验证用的字符如下:
lTXXCavdlTXX

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册[Register]

x

免费评分

参与人数 1吾爱币 +3 热心值 +1 收起 理由
CrazyNut + 3 + 1 用心讨论,共获提升!

查看全部评分

灰灰。 发表于 2020-9-25 18:09
xjun 发表于 2020-9-25 19:36
题目为多解,提供一组pass: "ou~|ou~|"

条件:
比如输入12345678
rcx 低32位 为4个字符,v1 = 0x34333231
rdx低32为为4个字符, v2 = 0x38373635
满足 v1 or v2 = 0x7c7e756f 即可。

x64code:
00000000`1000105b 5a              pop     rdx
00000000`1000105c 59              pop     rcx
00000000`1000105d 4809d1          or      rcx,rdx
00000000`10001060 48ba6267935628437187 mov rdx,8771432856936762h
00000000`1000106a 4831d1          xor     rcx,rdx
00000000`1000106d 48c1e206        shl     rdx,6
00000000`10001071 4831d1          xor     rcx,rdx
00000000`10001074 ba8dca348e      mov     edx,8E34CA8Dh
00000000`10001079 39d1            cmp     ecx,edx

免费评分

参与人数 1吾爱币 +3 热心值 +1 收起 理由
CrazyNut + 3 + 1 用心讨论,共获提升!

查看全部评分

AmanoHina. 发表于 2020-9-25 20:40
大佬膜拜!!
 楼主| JuncoJet 发表于 2020-9-25 22:31
本帖最后由 JuncoJet 于 2020-9-25 22:34 编辑
solly 发表于 2020-9-25 20:12
是一个多解题:

汇编码:

我觉得这种伪64位好像有BUG
调试我没调,因为调不了……
不过编写时发现,我无论用 push [rbx] pop rcx
还是 mov rcx,[rbx] 这样的,我都没法实际赋值64位数据
 楼主| JuncoJet 发表于 2020-9-26 13:33
本帖最后由 JuncoJet 于 2020-9-26 13:36 编辑
solly 发表于 2020-9-26 12:36
可以取到高位值呀,我的测试代码如下:
[mw_shl_code=cpp,true]#include
#include

我的意思是,指针的值,mov rbx,qword[esp+4]
你可以?难道是我写错了
solly 发表于 2020-9-26 13:46
本帖最后由 solly 于 2020-9-26 13:48 编辑
JuncoJet 发表于 2020-9-26 13:33
我的意思是,指针的值,mov rbx,qword[esp+4]
你可以?难道是我写错了

我第1条x64指令 MOV RAX, QWORD PTR DS:[RDX],就是你这个情况吧,可以读入8字节数据。
你那个是要写成 rsp ,不是esp吧

另外,取地址指针,要用 LEA 指令吧,不是 mov,mov rbx,qword[rsp+4]也其实是取值。
sks2013 发表于 2020-9-26 15:53
学习了,厉害
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

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

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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