易语言程序怎么跳过卡密

易语言程序怎么跳过卡密,第1张

1、程序使用的语言为易语言,运行时在任务管理器看到的;用PEID查了一下壳,发现没有壳;登录框是输入32位卡密的然后登录的,程序打开的时候会联网获取最新版本。

2、push窗体大法,搜索FF25时上面没有push520在站内搜索了一下发现应该是这个程序编译的时候选的是子程序,然后用了这个大佬的插件。

前言

我写Delphi程序是从MIS系统入门的,开始尝试子系统划分的时候采用的是MDI窗体的结构。随着系统功能的扩充,不断有新的子系统加入系统中,单个工程会变得非常大,每次做一点修改都要重新编译,单个工程的形式也不利于团队协作。为了提高工作效率,我希望利用DLL动态链接库的形式实现插件结构的编程。

插件结构的编程需要一个插件容器来控制各DLL的运行情况,将划分好的每个子系统安排到一个DLL库文件中。对每个DLL程序需要为容器预留接口函数,一般接口函数包括:启动调用DLL库的函数、关闭DLL库的函数。通过接口函数,插件容器可以向DLL模块传递参数实现动态控制。具体实现细节我将在下文说明并给出响应代码。

您可能需要先了解一下DELPHI中UNIT的结构,工程的结构。本文没有深入讨论DLL编程的理论细节,只是演示了一些实用的代码,我当时学习的是刘艺老师的《DELPHI深入编程》一书。

我也处于DELPHI的入门阶段,只是觉得这次的DLL开发有一些值得讨论的地方,所以写这篇文章,希望各位能对我做的不好的地方慷慨建议。

示例程序简介

为了便于阅读我将使用一个MIS系统的部分程序代码演示插件编程的一些方法。示例程序是典型的C/S结构DBMS应用程序,我们关注的部分将是框架程序(下文简称Hall)的控制语句和dll插件程序的响应控制。

1、程序结构

插件容器Hall使用一个独立的工程创建,Hall的主窗口的作用相当于MDI程序中的MDI容器窗体,Hall中将显式调用Dll中的接口函数。

每个插件程序独立使用各自的工程,与普通工程不同的是,DLL工程创建的是Dll Wizard,相应编译生成的文件是以DLL为后缀。

2、接口设计

实例程序Narcissus中我们预留两个接口函数:

ShowDLLForm

该函数将应用程序的句柄传递给DLL子窗口,DLL程序将动态创建DLL窗体的实例。还可以将一些业务逻辑用参数的形式传递给DLL子窗口,比如窗体名称、当前登陆的用户名等。初次调用一个DLL窗体实例时使用此函数创建。

FreeDLLForm

该函数将显示释放DLL窗口实例,在退出应用程序时调用每个DLL窗体的FreeDLLForm方法来释放创建的实例,不然会引起内存只读错误。同样,也可以将一些在释放窗体时需要做的业务逻辑用参数的形式传递给DLL窗体。

3、调试方式

DLL窗体程序无法直接执行,需要有一个插件容器来调用。应此我们需要先实现一个基本的Hall程序,然后将Hallexe保存在一个固定的目录中。对每个DLL工程做如下设置:

1) 打开DLL工程

2) 选择菜单 Run – Parameters

3) 在d出的窗口中浏览到我们的容器Hallexe

这样在调试DLL程序时将会自动调用Hall程序,利用Hall中预留的调用接口调试DLL程序。

1、检测主程序大小,防止破解补丁之类:

Function TForm1GesSelfSf: integer;

var

F: file of byte;

begin

Filemode:=0;

Assignfile(F,'\FileNameexe');

Reset(f);

Result:=Filesize(F);

Closefile(F);

end;

2、检测创建日期和时间,让破解补丁实效:

Function TForm1FinDate:String;

var

t:TDate;

begin

ShortDateFormat:='yyyy-mm-dd';

t:=FileDateToDateTime(FileAge('FileNameexe'));

Result:=DateToStr(t);

end;

3、注册码加密函数嵌入数学函数,增加破解难度:

(略)

4、必要时自己删除自己(主程序):

procedure TForm1Funll;

var

hModule:THandle;

buff:array[0255]of Char;

hKernel32:THandle;

pExitProcess,pDeleteFileA,pUnmapViewOfFile:Pointer;

begin

hModule:=GetModuleHandle(nil);

GetModuleFileName(hModule, buff, sizeof(buff));

CloseHandle(THandle(4));

hKernel32:=GetModuleHandle('KERNEL32');

pExitProcess:=GetProcAddress(hKernel32, 'ExitProcess');

pDeleteFileA:=GetProcAddress(hKernel32, 'DeleteFileA');

pUnmapViewOfFile:=GetProcAddress(hKernel32, 'UnmapViewOfFile');

asm

LEA EAX, buff

PUSH 0

PUSH 0

PUSH EAX

PUSH pExitProcess

PUSH hModule

PUSH pDeleteFileA

PUSH pUnmapViewOfFile

RET

end;

begin

Funll;

end;

end;

具体怎么使用,那要看你自己的意愿了和需要了。反正我是这样做的,我的软件ADSL拨号计时器只在很早版本上出过注册机,后来的v370出过破解补丁——其实只是破掉了启动时提示注册的对话框,实质上根本没破解。用了上述的着法以后,到现在的v528版本,再没有过什么破解补丁或注册机。

如果现在的v528版本谁能破解,将立即公布程序源码。

附:注册机破解法的原理以及应对方法

认识注册机破解法

顾名思义,写注册机来破解软件注册的方法,就是模仿你的注册码生成算法或者逆向注 册码验证算法而写出来的和你一模一样的注册机。如果被写出注册机,你的软件只好免费了。或者你必须更换算法,但以前注过册的合法用户都得被迫更换注册码了。

#include <windowsh>

#include <windowsxh>

#include <commctrlh>

#include <tcharh>

#pragma comment(lib, "user32lib")

#pragma comment(lib, "gdi32lib")

#pragma comment(lib, "comctl32lib")

TCHAR g_szMainText[128] = _T("显示一些东西");

LRESULT CALLBACK MainProc(HWND hwnd, UINT uMsg, WPARAM wp, LPARAM lp)

{

    switch(uMsg) {

        case WM_CLOSE:

            DestroyWindow(hwnd);

            return 0;

        case WM_NCDESTROY:

            PostQuitMessage(0);

            return 0;

        case WM_PAINT: {

            PAINTSTRUCT ps;

            HDC dc = BeginPaint(hwnd, &ps);

            TextOut(dc, 0, 0, g_szMainText, lstrlen(g_szMainText));

            EndPaint(hwnd, &ps);

            return 0;

        }

        case WM_CREATE: {

            CreateWindow(_T("BUTTON"), _T("变更文字"), WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,

                300, 200, 80, 50, hwnd, (HMENU) 10001, (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), 0);

            return 0;

        }

        case WM_COMMAND: {

            if (LOWORD(wp) == 10001 && HIWORD(wp) == BN_CLICKED) {

                EnableWindow(hwnd, FALSE);

                

                HWND h = CreateWindow(_T("SubWindow"), _T("子窗口"), WS_OVERLAPPEDWINDOW,

                    CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, NULL, NULL, (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), 0);

                ShowWindow(h, SW_SHOWNORMAL);

                UpdateWindow(h);

                

                MSG msg;

                while(GetMessage(&msg, 0, 0, 0) > 0) {

                    TranslateMessage(&msg);

                    DispatchMessage(&msg);

                }

                

                InvalidateRect(hwnd, NULL, TRUE);

                EnableWindow(hwnd, TRUE);

                SetFocus(hwnd);

            }

            return 0;

        }

        default:

            return DefWindowProc(hwnd, uMsg, wp, lp);

    }

}

LRESULT CALLBACK SubProc(HWND hwnd, UINT uMsg, WPARAM wp, LPARAM lp)

{

    static HWND hEdit;

    

    switch(uMsg) {

        case WM_CLOSE:

            DestroyWindow(hwnd);

            return 0;

        case WM_NCDESTROY:

            PostQuitMessage(0);

            return 0;

        case WM_CREATE:

            hEdit = CreateWindow(_T("EDIT"), g_szMainText, WS_TABSTOP | WS_VISIBLE | WS_CHILD | WS_BORDER | ES_AUTOHSCROLL,

                10, 10, 250, 30, hwnd, NULL, (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), 0);

            CreateWindow(_T("BUTTON"), _T("确定"), WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,

                300, 200, 80, 50, hwnd, (HMENU) 10001, (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), 0);

            SetFocus(hEdit);

            return 0;

        case WM_COMMAND: {

            if (LOWORD(wp) == 10001 && HIWORD(wp) == BN_CLICKED) {

                Edit_GetText(hEdit, g_szMainText, 128);

                PostMessage(hwnd, WM_CLOSE, 0, 0);

            }

            return 0;

        }

        default:

            return DefWindowProc(hwnd, uMsg, wp, lp);

    }

}

int APIENTRY _tWinMain(HINSTANCE hInst, HINSTANCE hPrev, LPTSTR szCmd, INT nShow)

{

    InitCommonControls();

    

    WNDCLASS wc;

    ZeroMemory(&wc, sizeof(wc));

    wcstyle = CS_HREDRAW | CS_VREDRAW;

    wclpfnWndProc = MainProc;

    wchInstance = hInst;

    wclpszClassName = _T("MainWindow");

    wchbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);

    wchCursor = LoadCursor(NULL, IDC_ARROW);

    RegisterClass(&wc);

    

    wclpszClassName = _T("SubWindow");

    wclpfnWndProc = SubProc;

    RegisterClass(&wc);

    

    HWND hMain = CreateWindow(_T("MainWindow"), _T("主窗口"), WS_OVERLAPPEDWINDOW,

        CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, NULL, NULL, hInst, 0);

    ShowWindow(hMain, SW_SHOWNORMAL);

    UpdateWindow(hMain);

    

    MSG msg;

    while(GetMessage(&msg, 0, 0, 0) > 0) {

        TranslateMessage(&msg);

        DispatchMessage(&msg);

    }

    

    return msgwParam;

}

我写了个例子,你看看?

ps 我记得你以前好像不是学windows api写图形界面的样子,记错了吗orz

以上就是关于易语言程序怎么跳过卡密全部的内容,包括:易语言程序怎么跳过卡密、共享软件防破解的实用招法、Windows api编写窗口应用程序在子窗口中遇到的问题。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10217290.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存