首页
社区
课程
招聘
[分享]TraceMe注册机编写
发表于: 2020-10-11 14:46 4149

[分享]TraceMe注册机编写

2020-10-11 14:46
4149

TraceMe和自己编写的注册机程序下载,文章末尾有链接
OD:
首先对于这种弹框程序,我们需要找到它的弹框位置,或者程序把我们的输入写入程序的地方。
用OD打开,使用Ctrl+N打开导入表
发现一个重要的函数,它是获取我们输入的函数,那肯定得找到它,双击一下,发现OD带我们去了一个数据面板(数据区)
一般已77开头的地址就是windows API地址,在这个程序里,我们的代码地址为0040开头
Ctrl+G跳转到772E1000,F2下一个断点
通过观察栈。调用GetDlgItemTextA函数的地址为004011B4
004011B6为返回地址
F8单步跟踪
栈地址0019F67C处存储的是用户名,EAX存储的为用户名长度

观察上图栈空间压入用户名和序列号,所以该函数一定是计算序列号的地方,不妨进去瞧瞧

循环以7为基础,eax又是从0开始的,而且控制加密数组,所以加密数组为8个元素,在数据面板跳转到00405030地址处,找到加密数组
总结:1.首先把输入的用户名转为ASCII码
2.加密数组{0x0c,0x0a,0x13,0x09,0x0c,0x0b,0x0a,0x08}
3.循环esi += 用户名第三位开始 * 加密数组
4.如果循环超过8次,加密数组从0开始进行运算
python代码

C++汇编语言内联式
编写简单,注意参数和跳转就行

IDA就要简单的多了,尝试以一下神奇的F5

TraceMe下载

#!python3
def sub_401340(lpstring):
    v3 = 3
    v4 = 0
    j = 0
    n = 0
    byte_405030=[0x0c,0x0A,0x13,9,0x0c,0x0b,0x0a,8]
    for i in lpstring:
        if n >= v3:
            if j > 7:
                j = 0
            v4 = v4 + byte_405030[j] * ord(str(i))
            j = j + 1
        n = n+1     #用户名第三位开始计算序列号
    print("序列号为:",v4)
#!python3
def sub_401340(lpstring):
    v3 = 3
    v4 = 0
    j = 0
    n = 0
    byte_405030=[0x0c,0x0A,0x13,9,0x0c,0x0b,0x0a,8]
    for i in lpstring:
        if n >= v3:
            if j > 7:
                j = 0
            v4 = v4 + byte_405030[j] * ord(str(i))
            j = j + 1
        n = n+1     #用户名第三位开始计算序列号
    print("序列号为:",v4)
#include<iostream>
#include<string>
 
using namespace std;
 
char Salt[8] = { 0x0c,0x0A,0x13,9,0x0c,0x0b,0x0a,8 };
char username[20] = "";
int len;
int result = 0;
 
int main()
{
    while (len<5)
    {
        cout << "请输入用户名(大于四个字符):" << endl;
        cin >> username;
        len = strlen(username);
        cout << endl;
    }
    __asm
    {
 
        /*4011DB*/  //push    ebx
        /*4011DC*/  //lea     eax, dword ptr[esp + A0]
        /*4011E3*/  //push    edx
        /*4011E4*/  //push    eax
        /*4011E5*/  //call    00401340
 
 
        /*401340*/  push    ebp
        /*401341*/  mov     ebp, offset username    //  mov     ebp, dword ptr [esp+C]
        /*401345*/  //push    esi                       
        /*401346*/  //push    edi
        /*401347*/  mov     edi, len                //  mov     edi, dword ptr [esp+18]
        /*40134B*/  mov     ecx, 3
        /*401350*/  xor esi, esi
        /*401352*/  xor eax, eax
        /*401354*/  cmp     edi, ecx  //03<=len(str)跳转
        /*401356*/  jle     _00401379
        /*401358*/  push    ebx
        /*401359*/  _00401359 : cmp     eax, 7
        /*40135C*/  jle     _00401360
        /*40135E*/  xor eax, eax
        /*401360*/  _00401360 : xor edx, edx
        /*401362*/  xor ebx, ebx
        /*401364*/  mov     dl, byte ptr[ecx + ebp]
        /*401367*/  mov     bl, byte ptr[eax + Salt]
        /*40136D*/  imul    edx, ebx
        /*401370*/  add     esi, edx
        /*401372*/  inc     ecx
        /*401373*/  inc     eax
        /*401374*/  cmp     ecx, edi
        /*401376*/  jl      _00401359
                            mov        result,esi    //本来程序是在401379处把序列号保存到栈中的
        /*401378*/  pop     ebx
        /*401379*/  //push    esi
        /*40137A*/  //push    00405078  //%ld
        /*40137F*/  //push    ebp
        /*401380*/  //call    dword ptr[<&USER32.wsprintfA>]
        /*401386*/  //mov     eax, dword ptr[esp + 1C]
        /*40138A*/  //add     esp, 0C
        /*40138D*/  //push    ebp
        /*40138E*/  //push    eax
        /*40138F*/  //call    dword ptr[<&KERNEL32.lstrcmpA>]
        /*401395*/  //neg     eax
        /*401397*/  //sbb     eax, eax
        /*401399*/  _00401379 : nop//pop     edi
        /*40139A*/  //pop     esi
        /*40139B*/  //inc     eax
        /*40139C*/  pop     ebp
        /*40139D*/  //retn
 
 
    }
    cout << "序列号为:" << result << endl;
    return 0;
}
#include<iostream>
#include<string>
 
using namespace std;
 
char Salt[8] = { 0x0c,0x0A,0x13,9,0x0c,0x0b,0x0a,8 };
char username[20] = "";
int len;
int result = 0;
 
int main()
{
    while (len<5)
    {
        cout << "请输入用户名(大于四个字符):" << endl;
        cin >> username;
        len = strlen(username);
        cout << endl;
    }
    __asm
    {
 
        /*4011DB*/  //push    ebx
        /*4011DC*/  //lea     eax, dword ptr[esp + A0]
        /*4011E3*/  //push    edx
        /*4011E4*/  //push    eax
        /*4011E5*/  //call    00401340
 
 
        /*401340*/  push    ebp

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2020-10-11 14:50 被702编辑 ,原因:
上传的附件:
收藏
免费 2
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//