【文章标题】: 无源码改程序系列一 (改标题&添加按钮)
【文章作者】: Mradxz
【软件名称】: 高通一键开端口工具.exe
【使用工具】: VC++6.0、Stub_PE
【版权声明】: 本文原创于Mradxz, 转载请注明作者并保持文章的完整, 谢谢!
0x00 前言
1)最近在写一个手机串号修改平台软件,而这个平台上用到的软件一部分是网上搜集来或者朋友给的,为了保持平台的看上去统一性。所以,要对这些软件进行二次开发。
2)大部分源码思路 来自 http://www.52pojie.cn/thread-393655-1-1.html 这篇文章
0x01 修改程序标题
思路:DLL注入主程序 然后遍历获取 程序主窗口的句柄 然后 用 SetWindowTextA 函数给窗口修改标题
[C++] 纯文本查看 复制代码 BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
DWORD dwCurProcessId = *((DWORD*)lParam);
DWORD dwProcessId = 0;
GetWindowThreadProcessId(hwnd, &dwProcessId);
if(dwProcessId == dwCurProcessId && GetParent(hwnd) == NULL)
{
*((HWND *)lParam) = hwnd;
return FALSE;
}
return TRUE;
}
//这个函数用来获取主窗口句柄
HWND GetMainWindow()
{
DWORD dwCurrentProcessId = GetCurrentProcessId();
if(!EnumWindows(EnumWindowsProc, (LPARAM)&dwCurrentProcessId))
{
return (HWND)dwCurrentProcessId;
}
return NULL;
}
BOOLEAN WINAPI DllMain(
IN HINSTANCE hDllHandle,
IN DWORD nReason,
IN LPVOID Reserved)
{
BOOLEAN bSuccess = TRUE;
switch ( nReason )
{
case DLL_PROCESS_ATTACH:
//这里加个定时器 循环判断 GetMainWindow() 是否为 NULL 一旦 GetMainWindow 获取窗口句柄成功就 停止计时器 然后 修改标题
// SetWindowTextA(GetMainWindow(),"我是新标题");
break;
case DLL_PROCESS_DETACH:
break;
}
return bSuccess;
}
0x02 添加按钮
思路:hook窗口过程函数 用CreateWindow给 主窗口 添加 按钮,再写一个 Main_OnCommand 函数 来处理按钮事件 [C++] 纯文本查看 复制代码 #include "stdafx.h"
#ifdef _X86_
extern "C" { int _afxForceUSRDLL; }//添加的部分
#else
extern "C" { int __afxForceUSRDLL; }
#endif
extern "C" __declspec(dllexport) void EmptyFunc()
{
//Do nothing
}
#define IDB_OK 3301
//
//初始化全局变量
//
HHOOK hhk;
HINSTANCE g_hModule;
//
//自定义函数前置声明
//
void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify); //控制按钮的函数
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam); //遍历
HWND GetMainWindow(); //获取主窗口句柄
HHOOK StartHook(); //开始hook
BOOL EndHook(); //停止hook
LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam);
HHOOK StartHook()
{
return SetWindowsHookEx(WH_CALLWNDPROC, HookProc, g_hModule, GetCurrentThreadId());//设置hook,类型为WH_CALLWNDPROC,过程函数为HookProc,hook当前线程
}
BOOL EndHook()
{
return UnhookWindowsHookEx(hhk); //结束hook
}
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
DWORD dwCurProcessId = *((DWORD*)lParam);
DWORD dwProcessId = 0;
GetWindowThreadProcessId(hwnd, &dwProcessId);
if(dwProcessId == dwCurProcessId && GetParent(hwnd) == NULL)
{
*((HWND *)lParam) = hwnd;
return FALSE;
}
return TRUE;
}
HWND GetMainWindow()
{
DWORD dwCurrentProcessId = GetCurrentProcessId();
if(!EnumWindows(EnumWindowsProc, (LPARAM)&dwCurrentProcessId))
{
return (HWND)dwCurrentProcessId;
}
return NULL;
}
LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
CWPSTRUCT* cwps = (CWPSTRUCT*)lParam;
if (nCode >= 0)
{
switch(cwps->message)
{
case WM_COMMAND:
Main_OnCommand(cwps->hwnd, //窗口句柄
LOWORD(cwps->wParam), //控件ID
GetDlgItem(cwps->hwnd,LOWORD(cwps->wParam)), //控件句柄
HIWORD(cwps->wParam) //事件消息
);
break;
case WM_CREATE:{
//获取主窗口句柄
HWND find = GetMainWindow();
if(find){
CreateWindow(
TEXT("BUTTON"),
TEXT("OK"),
WS_VISIBLE|WS_CHILD|BS_DEFPUSHBUTTON,
10, 10,200, 60,
find,
(HMENU)IDB_OK,
(HINSTANCE)GetWindowLong(find,GWL_HINSTANCE),
NULL);
}
break;}
default:break;
}
}
return CallNextHookEx(hhk, nCode, wParam, lParam);
}
void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
switch(id)
{
case IDB_OK:{
CTime tmSCan = CTime::GetCurrentTime();
CString szTime = tmSCan.Format("'%Y-%m-%d %H:%M:%S'");
SetWindowTextA(hwnd,szTime);
break;}
default:break;
}
}
BOOLEAN WINAPI DllMain(
IN HINSTANCE hDllHandle,
IN DWORD nReason,
IN LPVOID Reserved)
{
BOOLEAN bSuccess = TRUE;
switch ( nReason )
{
case DLL_PROCESS_ATTACH:
g_hModule = hDllHandle;
hhk = StartHook();
break;
case DLL_PROCESS_DETACH:
EndHook();
break;
}
return bSuccess;
}
0x03 总结
上面的两端代码都是 vc++ 纯C 写的dll
把写好的dll 注入 程序中就可以了 注入方法可以 参考
http://www.52pojie.cn/thread-393655-1-1.html
苦逼程序员光会写代码不会说话 也不知道你们看懂没
先写怎么多 有人看 有人问 我就补充细节没人看 我就当笔记了
最后上图
|