苏紫方璇 发表于 2015-4-13 15:36

关于水淼·电商评论采集器破解的另一种方法

首先说一下原帖地址,我的这个方法是建立在@吃饭睡觉打豆豆 的思路之上的。
地址http://www.52pojie.cn/thread-349238-1-1.html
我原来也发过一篇关于水淼的帖子,当时也是使用的爆破的方法,而吃饭睡觉打豆豆大神找到了明码的地方,但他使用的办法是修改程序的代码,把字符串保存到一个不用的地方,然后进行读取。这样做的方法却有一些小的问题。那串明码会根据机器码的个数产生多个,这种方法却只能读取到最后一个明码。而我使用了另外的一种方法进行读取。
我的方法是,在0x0041D64F这个地方修改为int3,即程序运行到这里会断下,然后自己写一个简单的调试器加载在这个程序上,当程序断下后,自己写的程序就可以得到信息。然后根据这些信息就可以得到注册码了。如果断下后不进行删除断点,可以获得所有的注册码了。下面上源码。




#include <windows.h>

#define SE_DEBUG_PRIVILEGE 20
typedefDWORD(WINAPI *PRtlAdjustPrivilege)   //未文档化函数声明
(
ULONG    Privilege,
BOOLEAN Enable,
BOOLEAN CurrentThread,
PBOOLEAN Enabled
);
void WINAPI AdjustPrivilege()         //ntdll中的提权函数
{
        BOOLEAN Enabled;
        PRtlAdjustPrivilege RtlAdjustPrivilege = (PRtlAdjustPrivilege)GetProcAddress(LoadLibrary(L"ntdll.dll"), "RtlAdjustPrivilege");
        RtlAdjustPrivilege(SE_DEBUG_PRIVILEGE, TRUE, FALSE, &Enabled);
}
void GetAppPath(char *path)       //吃饭睡觉打豆豆大神的获取当前路径
{
        GetModuleFileNameA(0, path, MAX_PATH);
        for (SIZE_T i = strlen(path) - 1; i >= 0; i--)
        {
                if (path == '\\')
                {
                        path = '\0';
                        break;
                }
        }
        strcat(path, "水淼·电商评论采集器.exe");
}


int WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd)
{
        char pass;
        BYTE code = {0xcc,0x00};
        BOOL status = TRUE;
        AdjustPrivilege();      //提升进程权限
        STARTUPINFOA si = { sizeof(si) };
        PROCESS_INFORMATION pi;
        char path;
        GetAppPath(path);
        //创建进程并调试
        if (!CreateProcessA(NULL, path, NULL, NULL, FALSE, DEBUG_ONLY_THIS_PROCESS | DEBUG_PROCESS, NULL, NULL, &si, &pi))
        {
                MessageBoxA(NULL, "无法启动进程", "提示", MB_OK);
                return 0;
        }
        //读取原来的指令
        if (!ReadProcessMemory(pi.hProcess, (LPVOID)0x0041D64F, &code, 1, NULL))
        {
                MessageBoxA(NULL, "读取内存出错", "提示", MB_OK);
                return 0;
        }
        //写入int 3
        if (!WriteProcessMemory(pi.hProcess, (LPVOID)0x0041D64F, code, 1, NULL))
        {
                MessageBoxA(NULL, "写入内存出错", "提示", MB_OK);
                return 0;
        }
        DEBUG_EVENT dbg;
        while (status)
        {
                //接受调试信息
                if (WaitForDebugEvent(&dbg, 50) == 0)
                {
                        Sleep(10);
                        continue;
                }
                if (dbg.dwDebugEventCode == EXCEPTION_DEBUG_EVENT && dbg.u.Exception.ExceptionRecord.ExceptionCode == EXCEPTION_BREAKPOINT)
                {
                        //如果是int3断点并且位置是0x0041D64F
                        if ((DWORD)dbg.u.Exception.ExceptionRecord.ExceptionAddress == 0x0041D64F)
                        {
                                HANDLE h = OpenThread(THREAD_ALL_ACCESS, FALSE, dbg.dwThreadId);
                                CONTEXT ct;
                                ct.ContextFlags = CONTEXT_ALL;
                                if (h > 0)
                                {
                                        SuspendThread(h);
                                        GetThreadContext(h, &ct);
                                        if (!WriteProcessMemory(pi.hProcess, (LPVOID)0x0041D64F, &code, 1, NULL))
                                        {
                                                MessageBoxA(NULL, "写入内存出错", "提示", MB_OK);
                                                return 0;
                                        }
                                        if (!ReadProcessMemory(pi.hProcess, (LPVOID)ct.Eax, pass, 30, NULL))
                                        {
                                                MessageBoxA(NULL, "读取内存出错", "提示", MB_OK);
                                                return 0;
                                        }
                                        MessageBoxA(NULL, pass, "注册码", MB_OK);
                                        status = FALSE;
                                        ct.Eip -= 1;
                                        SetThreadContext(h, &ct);
                                        ResumeThread(h);
                                        CloseHandle(h);
                                }
                        }
                }
                ContinueDebugEvent(dbg.dwProcessId, dbg.dwThreadId, DBG_CONTINUE);
        }
        //退出调试
        DebugActiveProcessStop(pi.dwProcessId);
        return 0;

}

以上代码在win7 X64+VS2013中编译通过。
如果本文有什么错误的地方,还请大家指正。
本文所涉及的软件,还请到吃饭睡觉打豆豆的帖子中下载。
我实在不想做成隐藏回复可见,虽然这样会造成回复很少。
各位的评分就是我的动力,如果大家觉得从本文中学到了什么,请给我加热心、加CB。评分不会扣分。谢谢。

莫谷 发表于 2015-4-13 15:45

不错,水淼的东西确实可以,请问LZ这个方法通杀水淼软件吗

Perry 发表于 2015-4-13 15:52

不过这个没用特码就太可惜了 只能支持这个版本 下次更新就废了

苏紫方璇 发表于 2015-4-13 16:10

莫谷 发表于 2015-4-13 15:45
不错,水淼的东西确实可以,请问LZ这个方法通杀水淼软件吗

水淼的验证好像都是这个样子,使用吃饭睡觉打豆豆的方法应该是可以破解所有的水淼软件(没试过)。

苏紫方璇 发表于 2015-4-13 16:11

ztd 发表于 2015-4-13 15:52
不过这个没用特码就太可惜了 只能支持这个版本 下次更新就废了

不会找特征码,抱歉,如果您会的话还请教我一下,谢谢

hanfeng988 发表于 2015-5-11 08:35

小白来学习了,膜拜大神{:1_921:}

fysxq 发表于 2016-9-23 16:32

我想要一个最新版的水淼门户新闻评论采集器 v1.5,可否赐一个
页: [1]
查看完整版本: 关于水淼·电商评论采集器破解的另一种方法