吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5551|回复: 4
收起左侧

[原创] 无源码改程序系列一 <改标题&添加按钮>

[复制链接]
Mradxz 发表于 2015-8-6 16:12
【文章标题】: 无源码改程序系列一 (改标题&添加按钮)
【文章作者】: 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
苦逼程序员光会写代码不会说话 也不知道你们看懂没
先写怎么多 有人看 有人问 我就补充细节没人看 我就当笔记了
最后上图
QQ截图20150806161027.png

免费评分

参与人数 1威望 +1 热心值 +1 收起 理由
Hmily + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩.

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

小人国历险记 发表于 2015-8-6 16:42
感谢楼主总结
Gnod 发表于 2015-8-6 17:06
北涯丶 发表于 2015-8-6 17:13
bpsd 发表于 2015-8-6 17:43
卤煮甚叼
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-17 17:49

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表