关于水淼·电商评论采集器破解的另一种方法
首先说一下原帖地址,我的这个方法是建立在@吃饭睡觉打豆豆 的思路之上的。地址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。评分不会扣分。谢谢。
不错,水淼的东西确实可以,请问LZ这个方法通杀水淼软件吗 不过这个没用特码就太可惜了 只能支持这个版本 下次更新就废了 莫谷 发表于 2015-4-13 15:45
不错,水淼的东西确实可以,请问LZ这个方法通杀水淼软件吗
水淼的验证好像都是这个样子,使用吃饭睡觉打豆豆的方法应该是可以破解所有的水淼软件(没试过)。 ztd 发表于 2015-4-13 15:52
不过这个没用特码就太可惜了 只能支持这个版本 下次更新就废了
不会找特征码,抱歉,如果您会的话还请教我一下,谢谢 小白来学习了,膜拜大神{:1_921:} 我想要一个最新版的水淼门户新闻评论采集器 v1.5,可否赐一个
页:
[1]