欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]修复spy4win无法取ListView内容的BUG

[原创]修复spy4win无法取ListView内容的BUG

逆向发现之所以无法取得ListView的子项内容,是因为没有初始化ListView窗口的ListHeader句柄(此局部变量我们标记为hWndListHeader),就在对它调用SendMessage(hWndListHeader,HDM_GETITEMCOUNT,0,0)了,所以返回值始终为0,所以这个对话框始终是空的,

对其进行修复,也就是获取到hWndListHeader句柄,再执行原逻辑。

好了,成功了,现在能获取到子项内容了。

附修复代码:
// MyWork.cpp
#include "stdafx.h"
PVOID Ori_Call_SendMessageA_HDM_GETITEMCOUN_NoGetListHeaderHWND;
__declspec(naked) void Fix_Call_SendMessageA_HDM_GETITEMCOUN_NoGetListHeaderHWND()
{
        /*
        hListViewWnd              = ebx
        hWndListHeader            = dword ptr -3Ch
    ................................................................
        .text:0040857D                 push    0               ; lParam
        .text:0040857F                 push    0               ; wParam
        .text:00408581                 push    1200h           ; Msg
        .text:00408586                 mov     eax, [ebp+hWndListHeader]
        .text:00408589                 push    eax             ; hWnd
        .text:0040858A                 call    j_SendMessageA
        */
        __asm
        {
           push 0
           push 0
           push LVM_GETHEADER
           push ebx //hListViewWnd
           mov eax,[SendMessageA]
           call eax
           mov [ebp-3ch],eax //hWndListHeader
                   jmp Ori_Call_SendMessageA_HDM_GETITEMCOUN_NoGetListHeaderHWND;
        }
}
void BeginMyWork()
{
      PVOID pThatFunction=(0x0040857D-0x00400000)+(PBYTE)GetModuleHandle(NULL);
      HookFunction(pThatFunction,Fix_Call_SendMessageA_HDM_GETITEMCOUN_NoGetListHeaderHWND,&Ori_Call_SendMessageA_HDM_GETITEMCOUN_NoGetListHeaderHWND);
}
void EndMyWork()
{
     PVOID pThatFunction=(0x0040857D-0x00400000)+(PBYTE)GetModuleHandle(NULL);
     UnhookFunction(pThatFunction,&Ori_Call_SendMessageA_HDM_GETITEMCOUN_NoGetListHeaderHWND);
}
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "stdafx.h"
#pragma comment(linker,"/EXPORT:DllMain=_DllMain@12")
void BeginMyWork();
void EndMyWork();
EXTERN_C BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{
        switch (ul_reason_for_call)
        {
        case DLL_PROCESS_ATTACH:
                {
                        //MessageBox(NULL,_T("加载成功"),_T("XXX.DLL"),MB_OK);
                BeginMyWork();
                }
                break;
        case DLL_THREAD_ATTACH:
                break;
        case DLL_THREAD_DETACH:
                break;
        case DLL_PROCESS_DETACH:
                {
                        EndMyWork();
                }
                break;
        }
        return TRUE;
}
编译为XXX.DLL,并对脱壳后Spy4Win.exe,用Lord PE的PE编辑器添加对XXX.DLL的依赖。Spy4Win.exe的脱壳,可以直接用Peid搞定。
HookFunction,及UnhookFunction是inline hook函数,可以在mhook等开源hook库中找到类似函数,本人恕不提供。
完美收官,YEAH。

上传的附件 QQ截图20130907203708.png
QQ截图20130907203829.png
QQ截图20130907203910.png
spy4winFix_NotFull.rar

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功