为无源码的数据批量处理软件添加功能
一
软件简介
二
需求
三
思路
总体流程
四
具体步骤
添加导入表项
IAT hook实现
int HookIAT(char* szModuleName,char* szFuncName,int NewFuncAddress)
{
if (szModuleName == NULL || szFuncName == NULL || NewFuncAddress == NULL)
{
return -1;
}
int ImageBase = (int)GetModuleHandle(NULL);
PIMAGE_DOS_HEADER pDosHeader;
PIMAGE_NT_HEADERS pNtHeader;
//此处暂时不考虑64位的情况,所以直接定义32位的选项头
PIMAGE_OPTIONAL_HEADER32 pOptionalHeader;
pDosHeader = (PIMAGE_DOS_HEADER)ImageBase;
if (pDosHeader->e_magic != 0x5A4D) {
return -1;
}
//获取NT头
pNtHeader = (PIMAGE_NT_HEADERS)(pDosHeader->e_lfanew + ImageBase);
if (pNtHeader->Signature != 0x00004550) {
return -1;
}
//获取选项头
pOptionalHeader = &pNtHeader->OptionalHeader;
IMAGE_DATA_DIRECTORY DataDirectoryImport = pOptionalHeader->DataDirectory[1];
//获取导入表地址
PIMAGE_IMPORT_DESCRIPTOR pImportDirectory = (PIMAGE_IMPORT_DESCRIPTOR)(DataDirectoryImport.VirtualAddress + ImageBase);
//获取需要hook的函数所在的模块对应的模块句柄
HMODULE hModule = GetModuleHandle(szModuleName);
if (hModule == NULL)
{
return -1;
}
//获取原函数的位置
int pFunc = (int)GetProcAddress(hModule, szFuncName);
if (pFunc == NULL)
{
return -1;
}
while (pImportDirectory->OriginalFirstThunk != 0)
{
char* szDllName = (char*)(pImportDirectory->Name + ImageBase);
if (!strcmp(szDllName, szModuleName))
{
DWORD* pAddress = (DWORD*)(pImportDirectory->FirstThunk + ImageBase);
while (*pAddress != 0)
{
if (*pAddress == pFunc)
{
DWORD OldProtect = 0;
//修改内存属性,使其可写
VirtualProtect(pAddress, 0x1000, PAGE_EXECUTE_READWRITE, &OldProtect);
*pAddress = (DWORD)NewFuncAddress;
//改回内存属性,防止兼容性问题
VirtualProtect(pAddress, 0x1000, OldProtect, &OldProtect);
break;
}
pAddress++;
}
break;
}
pImportDirectory++;
}
return 0;
}
修改窗口过程函数
//记录过程函数是否已经被修改
BOOL IsModify = FALSE;
BOOL WINAPI MyGetMessageA(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax)
{
if (!IsModify)
{
char* szWindowNames[3] = {
"全能字符串批量替换机7.0 无限制版(替换/查找/抽取/改名)", //Chinese(S)
"つ匡ゅンい猔種称", //Chinese(T)
"Super Replacer(Replace/Find/extract/rename)" //English
};
HWND hWnd = NULL;
bool IsMyWindow = false;
//查找窗口
for (int i = 0; hWnd == NULL && i < 3; i++)
{
hWnd = ::FindWindow(NULL, szWindowNames[i]);
}
if (hWnd != NULL)
{
DWORD ProcessId = 0;
//判断窗口是否属于本进程
if (GetWindowThreadProcessId(hWnd, &ProcessId) != 0)
{
DWORD MyProcessId = GetCurrentProcessId();
if (MyProcessId == ProcessId)
{
IsMyWindow = true;
}
}
}
if (IsMyWindow)
{
g_Wnd = hWnd;
//判断窗口字符集
BOOL nRet = IsWindowUnicode(hWnd);
//修改窗口过程函数
if (nRet)
{
g_OldWindowProc = (PFN)SetWindowLongW(hWnd, GWL_WNDPROC, (int)WindowProc);
}
else
{
g_OldWindowProc = (PFN)SetWindowLongA(hWnd, GWL_WNDPROC, (int)WindowProc);
}
IsModify = TRUE;
}
}
//调用原先被hook的函数
return GetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax);
}
窗口过程函数功能实现
#define ID_LISTCTRL 1012
//旧的窗口过程函数
PFN g_OldWindowProc = NULL;
//记录过程函数是否已经被修改
BOOL IsModify = FALSE;
HWND g_Wnd;
int g_nClickedColumn;
CListCtrl* g_pListCtrl;
bool IsReverseOrder = false;
int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
CListCtrl* pListCtrl = g_pListCtrl;
CString strItem1 = pListCtrl->GetItemText(lParam1, g_nClickedColumn);
CString strItem2 = pListCtrl->GetItemText(lParam2, g_nClickedColumn);
int nItem1 = StrToInt(strItem1);
int nItem2 = StrToInt(strItem2);
int ret = nItem2 - nItem1;
if (!IsReverseOrder)
{
ret = 0 - ret;
}
return ret;
}
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if (uMsg == WM_NOTIFY)
{
NMHDR* pNMHDR = (NMHDR*)lParam;
if (pNMHDR->code == LVN_COLUMNCLICK)
{
NMLISTVIEW* pNMLV = (NMLISTVIEW*)pNMHDR;
if (pNMLV->hdr.idFrom == ID_LISTCTRL) // 检查控件ID,确保是你要处理的列表控件
{
HWND hListCtrl = ::GetDlgItem(g_Wnd, ID_LISTCTRL);
CListCtrl* pListCtrl = reinterpret_cast<CListCtrl*>(CListCtrl::FromHandle(hListCtrl));
g_pListCtrl = pListCtrl;
g_nClickedColumn = pNMLV->iSubItem;
if (g_nClickedColumn == 2)
{
//将每一项进行排序
pListCtrl->SortItemsEx(CompareFunc, (LPARAM)pListCtrl);
//再次点击的话,就将顺序颠倒
IsReverseOrder = !IsReverseOrder;
}
return TRUE;
}
}
}
return g_OldWindowProc(hwnd, uMsg, wParam, lParam);
}
五
总结

看雪ID:UltraTC
https://bbs.kanxue.com/user-home-980660.htm

# 往期推荐
1、移动应用安全与风控——应用分析常用工具
2、Nep CTF password:rc4和换表base64算法分析
3、摘除MiniFilter回调的正确姿势
4、bpf在android逆向中的辅助效果
5、NDK集成OLLVM模块流程记录
6、【NKCTF】babyHeap-Off by one&Tcache Attack


球分享

球点赞

球在看

点击阅读原文查看更多
相关文章:
奇迹怀旧服(魔光奇迹)元素插件词条推荐
浙金中心APP恢复运营了,债权人有话讲.
某款专门仅针对「中国网民」的勒索软件(含源码下载)
短剧《朝阳似我》完整版
短剧元年备忘录
软件代码几种常见命名规则
关于川渝两地侵害用户权益APP名单的通报(2025年第十二期)
-2025爆款*APP苹果iOS伪装可变身追剧合集
iOS 17.0 App 加速 win 版,可能月底发布
今日热门短剧《如此登对》1-70(完整版/后续/大结局)
热门短剧《死在最爱你的第十八年》完整版1-70集/大结局/合集
这6款修图app闭眼入不踩雷!/妙图AI
震惊!高性价比geo优化软件源码部署竟能达顶尖排名!
文献管理软件Zotero进阶必备:这7款插件神器,让你的科研效率飙升
短剧《*江山入我怀第二季》完整版1-集(合集/大结局/后续)
香港保诚客户必看!保诚app「MyPrudential」使用攻略
热门短剧《摄像头下的秘密》完整版1-68集(大结局/合集/宋维后续)
插件合集「24」: 21 个免费的小插件集合
【WordPress开源免费插件2】AI自动生成文章
绝对龙头(指标源码)
热门短剧《霸王餐风波》全集/完整版
红果9部甜到齁的短剧,熬夜追都不亏,看完想谈恋爱!
这款APP,细思极恐!
1月2日必追短剧预告(高质量精选)
「插件」后期必装神器,E3D史上最全超级豪华资源包来啦!!!
抖音淘宝客:了解抖音运营规则轻松上热门
1.4 周日 APP星座运势
【羊毛好用的APP️】一个让孩子喊着我还要做“题”的神奇APP️——都都思维(原嘟嘟数学、数感星球、都都数学️)
超好看!热门短剧丨大结局《霍太太她听得见心声》全集在线看
我设计的PCB,还能这么高级?!这个免费插件,绝了……
[古装剧][包青天][1993][源码ts][百度网盘]
为无源码的数据批量处理软件添加功能
短剧完整版《长生阙》大结局全剧终
资料汇总|FPGA软件安装包、书籍、源码、技术文档…(2025.03.01更新)
超好看!热门短剧丨大结局《轻烟染日暮》全集在线看
短剧《姐姐我装的》大结局1-74集(完整版/后续)
【快报】中国软件开发人员被指控窃取美公司源代码 安卓之父看好人工智能
这5个超良心的电脑插件,免费无广告还好用到爆!
1月2日热门短剧上线推荐!
「2025年最佳免费插件」年度免费软件大大大合集
爆款短剧《半熟老公》完整版1-82集/大结局/合集
超好看!热门短剧丨大结局《七岁萌宝老祖宗驾到》全集在线看
恶意软件团队解散,5 万美元起拍源代码;美团“停用”支付宝,王兴回应了
赠通话时长,APP自助办理.
有啥必装的浏览器插件
资料汇总|FPGA软件安装包、书籍、源码、技术文档…(2025.05.15更新)
SU百款插件合集来了
红果短剧“小众但笑发财”的TOP3短剧!新年第一天就得看点开心的!真的太搞笑啦!
SketchUp实用插件运用介绍篇
用了这些app新手也能秒变修图大神/妙图AI