【獻寶】利用DebugAPI做一些原先手工完成的動作,我用這種方法做過記憶體補丁,記憶體序號產生器等,完全VC編譯 (6千字)
內容:
這段程式碼針對的是LanTalk XP v2.7.1.0 Build 7123
// LanTalk_ldr.cpp :
Defines the entry point for the application.
//
#include "stdafx.h"
#include <stdlib.h>
#include "shlwapi.h"
#pragma comment(lib,
"shlwapi.lib")
typedef struct
{
LPVOID
lpAddr;
BYTE byData;
DWORD
nCount;
} BPDATA;
BPDATA g_bpData[10] = {0};
BOOL SetBreakPoint(HANDLE
hProcess, LPVOID lpAddr, UINT nNum)
{
if (nNum >=
sizeof(g_bpData) / sizeof(BPDATA)) return FALSE;
BYTE
byTemp;
DWORD dwNewProt, dwOldProt;
VirtualProtectEx(hProcess,
lpAddr, 1, PAGE_EXECUTE_READWRITE, &dwOldProt);
BOOL
bOK = ReadProcessMemory(hProcess, lpAddr, &byTemp, 1, NULL);
if
(!bOK) goto End;
g_bpData[nNum].lpAddr = lpAddr;
g_bpData[nNum].byData = byTemp;
g_bpData[nNum].nCount
= 0;
byTemp = 0xcc;
bOK =
WriteProcessMemory(hProcess, lpAddr, &byTemp, 1, NULL);
End:
VirtualProtectEx(hProcess, lpAddr, 1, dwOldProt, &dwNewProt);
return bOK;
}
BOOL RemoveBreakPoint(HANDLE
hProcess, UINT nNum)
{
if (nNum >= sizeof(g_bpData)
/ sizeof(BPDATA)) return FALSE;
BYTE byTemp;
DWORD dwNewProt, dwOldProt;
LPVOID
lpAddr = g_bpData[nNum].lpAddr;
VirtualProtectEx(hProcess,
lpAddr, 1, PAGE_EXECUTE_READWRITE, &dwOldProt);
BOOL
bOK = ReadProcessMemory(hProcess, lpAddr, &byTemp, 1, NULL);
bOK
= (byTemp == 0xcc);
if (!bOK) goto End;
bOK = WriteProcessMemory(hProcess, lpAddr, &g_bpData[nNum].byData,
1, NULL);
if (bOK) ZeroMemory(g_bpData + nNum, sizeof(BPDATA));
End:
VirtualProtectEx(hProcess, lpAddr, 1, dwOldProt,
&dwNewProt);
return bOK;
}
BOOL GetDllName(HANDLE
hProcess, LPLOAD_DLL_DEBUG_INFO lddi, LPSTR dll_name, int nSize)
{
LPVOID ptr = 0;
ReadProcessMemory(hProcess, lddi->lpImageName,
&ptr, sizeof(ptr), NULL);
if( ptr == 0 ) return FALSE;
WCHAR dll_name_u[MAX_PATH + 1] = {0};
ReadProcessMemory(hProcess, ptr, dll_name_u, sizeof(dll_name_u), NULL);
if( dll_name_u[0] == 0 ) return FALSE;
if( lddi->fUnicode
)
wcstombs(dll_name, dll_name_u, nSize);
else
lstrcpyn(dll_name, (LPSTR)dll_name_u,
nSize);
return TRUE;
}
int APIENTRY WinMain(HINSTANCE
hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
STARTUPINFO si = {0};
PROCESS_INFORMATION
pi = {0};
// Start the child process.
if( !CreateProcess( NULL, // No module name (use command line).
//"D:\\Program Files\\Lantalk XP\\LanTalk.exe", // Command line.
"LanTalk.exe", // Command line.
NULL,
// Process handle not inheritable.
NULL,
// Thread handle not inheritable.
TRUE, // Set handle
inheritance to FALSE.
DEBUG_ONLY_THIS_PROCESS,
// creation flags.
NULL,
// Use parent's environment block.
//"D:\\Program Files\\Lantalk XP\\",
NULL,
// Use parent's starting directory.
&si,
// Pointer to STARTUPINFO structure.
&pi
) // Pointer to PROCESS_INFORMATION structure.
)
{
MessageBox(NULL,
"CreateProcess failed.", "Error", MB_OK);
return
0;
}
LPVOID lpBase[] = {
0, // kernel32.GetVersion
0, // kernel32.GetCommandLineA
LPBYTE(0x0099f8c0),
// get clsid string
0, // advapi32.RegCreateKeyExA
LPBYTE(0x00402255), // jnz xxx (75
15) --- change to jmp xxx (eb 15)
};
// 設定前兩個斷點的目的是為了跳過ASProtect 1.2x的解密過程,
// 第三個斷點獲得登錄檔鍵值
// 最後一個斷點作了一個記憶體補丁
HMODULE hModule = LoadLibrary("kernel32.dll");
lpBase[0] = GetProcAddress(hModule, "GetVersion");
lpBase[1] = GetProcAddress(hModule, "GetCommandLineA");
FreeLibrary(hModule);
hModule = LoadLibrary("advapi32.dll");
lpBase[3] = GetProcAddress(hModule, "RegCreateKeyExA");
FreeLibrary(hModule);
DEBUG_EVENT dbg
= {0};
CONTEXT context = {0};
while
(WaitForDebugEvent(&dbg, INFINITE))
{
if (dbg.dwDebugEventCode == LOAD_DLL_DEBUG_EVENT)
{
char dll_name[MAX_PATH] = {0};
if (GetDllName(pi.hProcess, &dbg.u.LoadDll, dll_name, sizeof(dll_name)))
{
if (*dll_name)
{
char *p =
strrchr(dll_name, '\\');
if (p && lstrcmpi(p + 1, "kernel32.dll")
== 0)
SetBreakPoint(pi.hProcess, lpBase[0], 0);
}
}
}
else if (dbg.dwDebugEventCode
== EXCEPTION_DEBUG_EVENT)
{
if (dbg.u.Exception.ExceptionRecord.ExceptionCode
== EXCEPTION_BREAKPOINT)
{
LPVOID
lpAddr = dbg.u.Exception.ExceptionRecord.ExceptionAddress;
if (lpAddr == lpBase[0] || lpAddr
== lpBase[1])
{
context.ContextFlags = CONTEXT_CONTROL;
if
(GetThreadContext(pi.hThread, &context))
{
RemoveBreakPoint(pi.hProcess,
0);
context.Eip--;
SetThreadContext(pi.hThread,
&context);
if (lpAddr == lpBase[0])
SetBreakPoint(pi.hProcess, lpBase[1],
0);
else
SetBreakPoint(pi.hProcess,
lpBase[2], 1);
}
}
else if (lpAddr == lpBase[2])
{
context.ContextFlags
= CONTEXT_CONTROL | CONTEXT_INTEGER;
if (GetThreadContext(pi.hThread,
&context))
{
RemoveBreakPoint(pi.hProcess,
1);
context.Eip--;
SetThreadContext(pi.hThread,
&context);
LPVOID ptr = NULL;
if (ReadProcessMemory(pi.hProcess, (LPVOID)context.Ebx, &ptr,
sizeof(ptr), NULL))
{
char szClsid[45] = {0};
if
(ReadProcessMemory(pi.hProcess, ptr, szClsid, sizeof(szClsid), NULL))
SHDeleteKey(HKEY_CLASSES_ROOT,
szClsid);
}
SetBreakPoint(pi.hProcess,
lpBase[3], 0);
}
}
else if (lpAddr == lpBase[3])
{
context.ContextFlags
= CONTEXT_CONTROL;
if (GetThreadContext(pi.hThread, &context))
{
RemoveBreakPoint(pi.hProcess,
0);
context.Eip--;
SetThreadContext(pi.hThread,
&context);
DWORD dwTemp = 0;
ReadProcessMemory(pi.hProcess,
lpBase[4], &dwTemp, 4, NULL);
if (dwTemp == 0xbe391575)
{
dwTemp = 0xeb;
WriteProcessMemory(pi.hProcess,
lpBase[4], &dwTemp, 1, NULL);
}
}
}
ContinueDebugEvent(dbg.dwProcessId,
dbg.dwThreadId, DBG_CONTINUE);
}
}
else if (dbg.dwDebugEventCode == EXIT_PROCESS_DEBUG_EVENT)
break;
ContinueDebugEvent(dbg.dwProcessId, dbg.dwThreadId, DBG_EXCEPTION_NOT_HANDLED);
}
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return 0;
}
相關文章
- 用KEYMAKE製作記憶體序號產生器特殊一例
(11千字)2015-11-15記憶體
- 如何製作VB程式記憶體序號產生器--國內某軟體的序號產生器(隱去軟體資訊)
(14千字)2002-08-04記憶體
- (譯) 記憶體補丁的製作例項-修改WDASM2015-11-15記憶體ASM
- 自動共享記憶體管理 自動記憶體管理 手工記憶體管理2017-11-20記憶體
- 我寫的一個記憶體補丁,很基本。。高手莫入。。
(5千字)2015-11-15記憶體
- 軟體採用非明碼比較的KEYMAKE記憶體序號產生器制作
(754字)2015-11-15記憶體
- 製作自己的記憶體序號產生器--------檔案隱藏精靈註冊碼獲取 (4千字)2015-11-15記憶體
- 聊聊 記憶體模型與記憶體序2022-06-16記憶體模型
- 【譯】JavaScript的記憶體管理和 4 種處理記憶體洩漏的方法2019-03-24JavaScript記憶體
- 我用VB做了一份記憶體補丁。請大家鑑定。2015-11-15記憶體
- 誰動了我的記憶體之 PHP 記憶體溢位2017-04-05PHP記憶體溢位
- 誰動了我的記憶體之PHP記憶體溢位2017-08-05PHP記憶體溢位
- ExtJS-2.2記憶體洩漏補丁2012-02-12JS記憶體
- Kalua Cocktails 1.1完全破解,內附彙編序號產生器(用序號產生器編寫器,並有它的使用教程)
(22千字)2002-02-27AI
- 給記憶體加上AI?三星是這樣做的2021-08-25記憶體AI
- 記憶體補丁小小節---有聲有色另類解法 (3千字)2000-10-07記憶體
- Android記憶體洩漏產生的6大原因2014-11-29Android記憶體
- C++六種記憶體序詳解2024-04-19C++記憶體
- 實踐App記憶體優化:如何有序地做記憶體分析與優化2019-03-04APP記憶體優化
- Resource
Builder 1.1.0 完全破解~~附彙編序號產生器 (10千字)2015-11-15UI
- Go 語言的手工記憶體管理2015-05-27Go記憶體
- 手工清除linux中的記憶體2011-02-24Linux記憶體
- 【譯】JavaScript的工作原理:記憶體管理和4種常見的記憶體洩漏2018-12-19JavaScript記憶體
- 影音神探V2.02 bY E語言 (註冊碼與爆破附記憶體序號產生器) (8千字)2015-11-15記憶體
- Flink 的記憶體管理是如何做的?2023-02-22記憶體
- [轉帖]Solaris記憶體管理以及判定記憶體是否夠用的方法2011-08-24記憶體
- 簡單VC記憶體檢測2019-03-04記憶體
- 電腦記憶體佔用過高怎麼辦 電腦記憶體佔用過高解決方法2020-12-29記憶體
- [譯] JavaScript 工作原理:記憶體管理 + 處理常見的4種記憶體洩漏2017-12-05JavaScript記憶體
- [翻譯]查詢Windows記憶體洩露的幾種方法2018-04-20Windows記憶體洩露
- 一種避免 iOS 記憶體碎片的方法2017-10-25iOS記憶體
- GoldenGate通過CACHEMGR限制記憶體利用2012-06-21Go記憶體
- Redis記憶體——記憶體消耗(記憶體都去哪了?)2021-05-20Redis記憶體
- Win10記憶體佔用過多怎麼辦 win10清理記憶體佔用的方法2022-04-16Win10記憶體
- 【譯】JavaScript 的記憶體模型2019-04-15JavaScript記憶體模型
- [譯]記憶體洩露的八種花樣2017-11-13記憶體洩露
- 記憶體_大頁記憶體2016-05-24記憶體
- weblogic記憶體佔用等問題的解決方法2015-11-06Web記憶體