首页
社区
课程
招聘
[原创]伪外挂?伪扩展?伪按键精灵?―将外部窗体放入自身、用OD杀对话框
发表于: 2015-5-6 13:23 9262

[原创]伪外挂?伪扩展?伪按键精灵?―将外部窗体放入自身、用OD杀对话框

2015-5-6 13:23
9262
一是不知道该不该发――核心技术太简单,十年前发上来应该不错。
二是不知道发哪个版,软件调试逆向?编程技术?
三是不知道标题取什么名字,总之都是不正统的方法。

03年注册的帐号后来没了,08年又注册一个,本人很少来,也不爱学习,写一点给初学者看的东东,不然发帖量真对不起这个看雪帐号。

功能简介:对一个已知win32窗体程序(以下简称软件A)编写外挂(以下简称外挂B)实现按键精灵的功能,每隔一段时间自动点按钮,但考虑到人机界面,让用户操作容易。

实现自动点一个按钮可采用的方法:
1、按键精灵脚本――外部辅助程序。开发快,对软件A无伤,但用户操作不便。
2、用补丁技术扩展EXE的界面和功能,给EXE植入定时器和相关触发代码――软件A仍是单独进程。需要逆向软件A,增加可执行代码。开发流程长。
3、用外挂技术监控对方,模拟鼠操作。例如DLL劫持(内挂)-软件A运行时多了一个DLL模块,对用户透明,开发流程长;DLL远程注入(外挂)――软件A和外挂B是各自独立的进程,用户需多启动一个程序,且开发流程长。
4、伪外挂――本文采用的方法,软件A和外挂B是各自独立的进程但在界面上融为一体,win32 API-SetParent,用户运行外挂B,之后的动作对用户透明――后台悄悄运行软件A并将软件A动态放入自身,将其窗体Style动态改为none-无标题栏无边框无阴影,看上去融为一体,实际却是窗体套了窗体。然后在外挂B里实现定时给某按钮SendMessage。 开发较快,对软件A无伤,用户只需启动一个程序。

(以上涉及到EXE和DLL的技术都在《加密与解密》第三版中有。)

核心技术:
1、界面:窗体融合全用win32API。
2、定时点按钮功能:用VB、VC等能做标准win窗体应用的都可以。点按钮仍用win32API。
3、消除软件A中的一个对话框:用OD动态调试,去掉一个YesNo的MessageBox调用,直接拿到返回值Yes,平衡堆栈――本帖写太多初学者都会的东西,相信唯一与pediy沾边的就唯有这一条了^_^,解释一下,由于软件A中要自动点的“删除”按钮,点了之后会弹一个模态对话框问你要不要删除,如果再API找对话框并自动点Yes也是可以的,但由于软件A和外挂B在界面上已经形成父子形态,模态对话框容易让2个进程都卡住,调试不爽,运行时也可能发生意外,干脆直接用爆破法搞掉它。

(OD动态调试在《加密与解密》第三版中有,杀MessageBoxA相信在《C++反汇编与逆向分析技术揭秘》中。)

以下上一些截图与简短分析:
1、外挂B的Init函数:后台悄悄运行软件A并将软件A动态放入自身,将其窗体Style动态改为none;将下拉列表固定成第一项;一定要搞掉“退出”按钮,否则用户点了软件A的退出,嵌入内部的窗体就被先关了,但如果用户关了外挂B,软件A的进程也会被一起中止;软件自动过一段时间依次点“查找、删除”
软件A的界面:


SetParent到外挂B的效果:


SetParent到外挂B之后并美化的效果:


VB代码:
Dim ChildBtnCombo As Long, ChildBtnQuery As Long, ChildBtnDelete As Long, ChildBtnClear As Long, ChildBtnExit As Long

Public Sub Init()
    '用VB的Shell语句启动软件,并得到该软件的pID
    idProc = Shell(软件A的路径, 1)
    'AppActivate idProc  '激活该软件
    
    '根据pid得到hwnd
    windowHandle = GetWinHandle(idProc)
    If windowHandle <= 0 Then Call ShowErr("windowHandle")
    
    '根据hwnd,放入自身窗体
    SetParent windowHandle, Me.hwnd
    
    Dim s As String, ret As Long, hwnd1 As Long
    '查找下拉框,保存句柄备用
    ChildBtnCombo = FindWindowEx(windowHandle, 0, "ComboBox", vbNullString)
    If ChildBtnCombo <= 0 Then Call ShowErr("ComboBox")
    
    '查找几个按钮,保存句柄备用
    hwnd1 = 0
    s = String(255, 0)
    Do
        hwnd1 = FindWindowEx(windowHandle, hwnd1, "Button", vbNullString)
        ret = GetWindowText(hwnd1, s, 255)
        If ret > 0 Then
            If InStr(s, "查 找") Then ChildBtnQuery = hwnd1
            If InStr(s, "删 除") Then ChildBtnDelete = hwnd1
            If InStr(s, "清 空") Then ChildBtnClear = hwnd1
            If InStr(s, "退 出") Then ChildBtnExit = hwnd1
            s = String(255, 0)
        End If
    Loop Until hwnd1 = 0
    If ChildBtnQuery <= 0 Then Call ShowErr("windowHandle")
    If ChildBtnDelete <= 0 Then Call ShowErr("windowHandle")
    If ChildBtnClear <= 0 Then Call ShowErr("windowHandle")
    If ChildBtnExit <= 0 Then Call ShowErr("windowHandle")

    
    '修改窗体样式,去边框和标题栏
    Dim lStyle As Long, lExStyle As Long, lRect As rect, meRect As rect
    Call GetWindowRect(windowHandle, lRect)
    lStyle = GetWindowLong(windowHandle, GWL_STYLE)
    lExStyle = GetWindowLong(windowHandle, GWL_EXSTYLE)
    
    lStyle = lStyle And Not WS_CAPTION
    lStyle = lStyle And Not WS_BORDER
    lStyle = lStyle And Not WS_SYSMENU
    lStyle = lStyle And Not WS_THICKFRAME
    lStyle = lStyle And Not WS_OVERLAPPED
    'lStyle = lStyle Or WS_CLIPSIBLINGS
    'lStyle = lStyle Or WS_CLIPCHILDREN
    'lStyle = lStyle And Not WS_TILEDWINDOW
    SetWindowLong windowHandle, GWL_STYLE, lStyle      '设置新的lStyle风格
    'Call MoveWindow(windowHandle, 0, 0, lRect.Right - lRect.Left, lRect.Bottom - lRect.Top, 1)
    Call SetWindowPos(windowHandle, vbNull, 0, 0 + 25, lRect.Right - lRect.Left, lRect.Bottom - lRect.Top, SWP_FRAMECHANGED)
    
    lExStyle = lExStyle And Not WS_EX_WINDOWEDGE
    lExStyle = lExStyle And Not WS_EX_CLIENTEDGE
    lExStyle = lExStyle And Not WS_EX_DLGMODALFRAME
    SetWindowLong windowHandle, GWL_EXSTYLE, lExStyle      '设置新的lExStyle风格
    'Call MoveWindow(windowHandle, 0, 0, lRect.Right - lRect.Left, lRect.Bottom - lRect.Top, 1)
    Call SetWindowPos(windowHandle, vbNull, 0, 0 + 25, lRect.Right - lRect.Left, lRect.Bottom - lRect.Top, SWP_FRAMECHANGED)
    
    '模拟下拉列表内容翻到第1项,并锁定控件
    'SendMessage ChildBtnCombo, CB_SHOWDROPDOWN, 1, 0    '展开ComboBox列表框
    'SendMessage ChildBtnCombo, CB_SETCURSEL, 1, 0     '指向指定记录号
    SendMessage ChildBtnCombo, WM_SETFOCUS, 0&, 0&    '设置焦点
    Sleep 100
    DoEvents
    SendMessage ChildBtnCombo, WM_KEYDOWN, vbKeyDown, 0& '模拟键盘的“↓”键
    Sleep 200
    DoEvents
    SendMessage ChildBtnCombo, WM_KEYUP, vbKeyDown, 0& '模拟键盘的“↓”键弹起
    EnableWindow ChildBtnCombo, 0   '将下拉框变灰
    
    '隐藏“清除”按钮、“退出”按钮
    ShowWindow ChildBtnClear, 0
    ShowWindow ChildBtnExit, 0
    
    '调整me的窗体大小
    Call GetWindowRect(Me.hwnd, meRect)
    Call MoveWindow(Me.hwnd, meRect.Left, meRect.Top, lRect.Right - lRect.Left, lRect.Bottom - lRect.Top - 10 + 25, 1)
    Me.SetFocus
End Sub

2、外挂B自动点按钮的代码,在定时器里使用SendMessage
VB代码:SendMessage 按钮句柄, BM_CLICK, 0, 0

3、用OD分析去掉对话框并打上静态补丁(永久去除)
该软件A看图标就知道是MFC基于对话框的应用,当然要首选OD。
根据对话框内容查找字符串,一下子就找到弹对话框的代码:


改之前要记录下对话框返回后EIP=403F0F时的ESP值,不管怎么改,改完后要保证ESP仍正确。ESI值在后面有用,也需要先记下来。
总之把调用messagebox的那几句杀掉,然后把EAX和ESI设置成常量,假装用户点了Yes就行了,如果有多余的代码空间用NOP填充。
这是我用爆破法改的,目的是灭掉对话框的参数和调用,并且JE这一句不实现跳转,所以MOV EAX,6;CMP EAX,7;JE这3句其实都是多余的,应该可以全NOP掉让它无条件顺序执行。


关于杀对话框的调试成功之后,要做的是:
动态去除对话框:在外挂B里使用API修改软件A内存中的代码区动态打补丁,OpenProcess和WriteMemory好麻烦不用。
永久去除对话框:给EXE打静态补丁这个当然简单了,但我忘记用OD存EXE的方法了,只好用WinHex软件写入。

于是,一个看上去像包装过的增加了一些功能的软件A就诞生了(实际仍是2个独立的EXE文件),而且自动点按钮时不会被软件本身弹的对话框干扰。用户只需要启动外挂B,而且界面变化不大不需要改变操作习惯。

写完了,无技术含量(要增删改软件内核功能还得用DLL),浪费大家时间了,不过点进来的同学应该可以学到一点界面美工知识^_^

要不为了增加新意我再写2个自动点按钮的方法吧:
1.将软件A重写一遍,想怎么自动就怎么自动--好傻
2.启动软件A,把鼠标或键盘焦点定到要自动点的按钮上,找个51单片机,接上马达模块搭个简单机械,机械臂固定在键盘或鼠标表面,在单片机上写个定时自动敲打回车键或鼠标左键的程序,然后启动单片机--!@#$%&~

[注意]APP应用上架合规检测服务,协助应用顺利上架!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 4560
活跃值: (1012)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
有新意不错
2015-5-6 13:37
0
雪    币: 3671
活跃值: (2002)
能力值: ( LV6,RANK:93 )
在线值:
发帖
回帖
粉丝
3
跟chrome使用的窗体技术类似,有个clover也是如此(用了chrome源码,将explorer窗体包含到自身当中)。
2015-5-6 14:13
0
雪    币: 768
活跃值: (540)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
4
好思想,谢谢楼主~:)
2015-5-6 20:57
0
雪    币: 24
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
收藏了。。。。。
2015-5-6 21:58
0
雪    币: 71
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
果然是另辟蹊径啊
不错
2015-5-6 22:21
0
雪    币: 229
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
看看自己多久没来了。
2015-5-7 01:04
0
雪    币: 95
活跃值: (119)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
移花接木,好的想法
2015-5-7 08:31
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
看完了半懂不懂的
2015-5-7 14:00
0
雪    币: 81
活跃值: (115)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
也只有小工具可以弄弄了,中型开发这种解决方案会有很多问题,异常,输入输出,多语言
时间成本也划不来
2015-5-7 14:39
0
游客
登录 | 注册 方可回帖
返回
//