吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 43312|回复: 201
收起左侧

[原创] 无源码给程序添加功能-记事本标题添加当前时间

    [复制链接]
苏紫方璇 发表于 2015-7-28 20:15
本帖最后由 苏紫方璇 于 2015-7-28 20:18 编辑

【文章标题】: 无源码给程序添加功能-记事本标题添加当前时间
【文章作者】: 苏紫方璇
【软件名称】: WindowsXP记事本
【保护方式】: 无
【使用工具】: OD、Stub_PE、LordPe、ResHacker
【版权声明】: 本文原创于苏紫方璇, 转载请注明作者并保持文章的完整, 谢谢!
--------------------------------------------------------------------------------
首先放出成品图:
12.png
修改方法是:
使用资源编辑器(本例用的ResHacker)给记事本添加菜单项,开启时间和关闭时间,并且在后面填上菜单的ID(十分重要)
1.png
然后使用od载入记事本,有窗口的程序都会有消息循环,不然整个程序都会卡死在哪里,不接受任何的响应,而注册大多使用的是RegisterClassEx,所以在RegisterClassExW上下断,然后F9运行,程序断下后,在右下角的堆栈中找到唯一一个参数,这个参数指向了一个结构体。
在RegisterClassExW断下后,堆栈中可以看到参数
2.png
查询MSDN可知RegisterClassEx的原型为
[C++] 纯文本查看 复制代码
1
ATOM RegisterClassEx(  CONST WNDCLASSEX *lpwcx  // class data);

而其中WNDCLASSEX为一个结构体
这个结构体的定义为
[C++] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
typedef struct _WNDCLASSEX {
    UINT       cbSize;
    UINT       style;
    WNDPROC    lpfnWndProc;
    int        cbClsExtra;
    int        cbWndExtra;
    HINSTANCE  hInstance;
    HICON      hIcon;
    HCURSOR    hCursor;
    HBRUSH     hbrBackground;
    LPCTSTR    lpszMenuName;
    LPCTSTR    lpszClassName;
    HICON      hIconSm;
} WNDCLASSEX, *PWNDCLASSEX;

事件处理函数就在第三项,下面在参数上按右键数据窗口跟随0x01003429就是事件处理地址了。

3.png
所以这样就找到消息循环的事件处理的地址。
下面在事件处理头部下断看看。
事件处理函数原型
[C++] 纯文本查看 复制代码
1
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM)

断下后堆栈如下
4.png

在本次修改中,只用考虑前三个参数就可以了,HWND窗口句柄,UINT消息类型,WPARAM传递的数据(这里是菜单的ID)
下面就考虑编写代码来实现上面添加菜单项的功能了。有两种方案,
1、直接patch这个文件,在程序中新建一个区段,然后查看导入表是否有需要的api,如果没有的话就要手动添加,然后在区段中使用纯汇编来编写全部代码。
2、编写一个dll文件,将将自己编写的事件处理函数导出,然后再手动添加到记事本的导入表中,最后在程序原来的事件处理中做一个跳转即可。
两种办法都有优点和缺点,第一种做完后只是一个单文件,汇编代码很精简,但纯汇编编写频繁调用api很是麻烦。第二种方法,dll的编写可以使用各种语言,代码灵活,但最后程序需要带一个dll文件。
所以我使用第二种办法,在码代码之前,先整理一下思路
首先写一个函数来替换程序自带的事件处理函数,在这里面要判断用户是否点了自建的菜单项,判断方法就是UINT=WM_COMMAND(事件为菜单触发事件),WPARAM=65或者66(ID为刚才编辑文件时填写的部分),如果不是的话就返回。如果是开启时间的话就调用SetTimer启动定时器。如果是关闭的话,就调用KillTimer来终止定时器就好了。
下面是程序代码
[C++] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/*
以下代码由苏紫方璇编写。我尽量在每行都做详细的注释
*/
 
 
#include <windows.h>
#include <string.h>
#include <stdio.h>
 
char OldTittle[255];       //记录原始标题
//DLL入口函数
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lp)
{
        //加载时不做任何响应,直接返回加载成功
        return TRUE;
}
 
//定时器的回调函数
void CALLBACK TimeProc(HWND hWnd, UINT uMsg, UINT nTimerid, DWORD dwTime)
{
        char Caption[255];
        char szTime[10];
        SYSTEMTIME st = { 0 };
        GetLocalTime(&st);             //获取时间
        sprintf(szTime, "%02d:%02d:%02d", st.wHour, st.wMinute, st.wSecond);     //格式化字符串(把时间转成字符串“时:分:秒”)
        GetWindowText(hWnd, Caption, 255);              //获取程序标题
        if (Caption[0] != '*') strcpy(OldTittle, Caption);       //若第一个字符不是*   就把这个标题当做原始标题
        sprintf(Caption, "* %s   %s", OldTittle, szTime);    //拼合字符串
        SetWindowText(hWnd, Caption);   //设置标题
}
 
//导出的函数,此函数原型应是
//LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
//但实际使用时,多调用了一次函数,所以将第一个参数改为LPVOID其实这个就是
//调用原程序中事件处理函数的地址(程序最终返回的地址)
extern "C"
__declspec(dllexport) LRESULT WINAPIV WndProc(LPVOID lp, HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
        if (message == WM_COMMAND)        //判断消息是否为WM_COMMAND
                switch (wParam)
        {
                case 66:                //如果是id=66(开启)就启动定时器,每秒一次
                        SetTimer(hWnd, 1, 1000, TimeProc);
                        break;
                case 67:                //如果是id=67(关闭)就取消定时器,并恢复原来的标题
                        KillTimer(hWnd, 1);
                        SetWindowText(hWnd, OldTittle);
                        break;
        }
        return 0;
}

编译好dll之后,使用lordPE添加导入表,方法,打开lordpe中的pe编辑器,选择文件,然后点击目录,点击输入表后面的“...”,在弹出的对话框中按右键,add import。在dll和api中填写dll的名字和导出的函数名。按加号添加后,保存即可。
5-1.png 6-1.png
也可以使用Stud PE来给记事本手动添加导入表。(使用别的程序完美添加,但我这个记事本不知为何,添加后报错,若有知道为什么的,还望告知。谢谢)
打开Stud PE,把文件拖进去,找到函数(Functions),在输入函数(Imported Function)里面点击右键添加新输入(Add new Import)
在新对话框中填入刚才编译的dll,选择导出的函数。点击添加到列表(Add to list),确定即可
5.png

回到刚才的导入表,找到刚才添加的那条,记下虚拟偏移地址rva和文件头界面的基址(ImageBase)
6.png 7.png
下面继续使用od载入记事本程序,在左下的内存窗口右键-转到-表达式(或者Ctrl+G)
里面选择RVA,列表中选择记事本程序。(如果没有rva选项的话,请将刚才记下的基址和rva相加,填入此处)。
8.png
点击确定就可以找到刚才导入的dll文件函数地址了。
9.png
记下这个地址,然后找到刚才的事件处理部分,在头部五个int3 还有函数第一句mov edi,edi(这句没用不用恢复)
用这些构造一个call,来调用dll。(dll的那个替换事件处理要使用__cdecl调用约定,即调用者负责清理堆栈,这样就可以达到dll中程序返回后,程序原来的事件处理还可以接着进行处理。)

修改前: 10.png
修改后: 10-1.png
然后保存到可执行文件,在重新附加一次。下断RegisterClassExW,回溯到调用部分。(右下调用堆栈第一行鼠标点一下,然后按回车)找到上面的一堆mov操作,把其中的事件处理函数地址改成刚才构造的call的地址即可。
修改前: 11.png
修改后: 11-1.png
保存,运行,程序稳定运行,点击显示时间也可以显示。


最后说点题外话,这种文章在网上一抓一大把,记事本、计算器都被改烂了,为什么还要发这个帖子,因为前几天小生大牛在群上的一席话,使我感触颇深,他说“你能在吾爱写上一篇学习心得可能就能挽救一个准备放弃的人,技术是共进的,如果学到东西然后悄无声息,那么论坛久而久之将没有人气。”其实这方面的东西原来就在看,只不过没看懂。最近又看了看,有些理解了就做了这么个东西,希望与大家共同学习下吧。
再此感谢@小生我怕怕 在群上的一番话,感谢@Hmily 提供这个良好的学习环境  感谢培训课程的各位讲师牺牲自己的时间来给我们讲课。

修改记事本.7z (62.4 KB, 下载次数: 262)
最后的最后,以上是本人的一点拙见,如果有什么错误和不足之处,还请各位批评指出,如果各位觉得学到了什么,还请不要吝啬手中的热心和CB,都砸给我吧,我不嫌多。

--------------------------------------------------------------------------------
                                                                     2015年07月28日


点评

我看的第一课跟第四课,kido大神教程真没看  发表于 2015-7-30 00:12
@kido 无情被打脸。。  发表于 2015-7-29 20:00
这是在打@Kido师傅的脸么  发表于 2015-7-29 17:58
教程真是太好,不过确实实践的话,c语言实在不懂。没法动手,代码也看不太懂  发表于 2015-7-29 14:24
如果自己要实践起来还是败在C语言上了。。  发表于 2015-7-28 22:23

免费评分

参与人数 73吾爱币 +6 热心值 +73 收起 理由
hejialong + 2 + 1 谢谢@Thanks!
E小歪 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
2lht_love + 1 + 1 谢谢@Thanks!
liujie1995gg + 1 + 1 没有基础的我坐看大神说话
overfreeedom + 1 + 1 我很赞同!
会飞的飞机 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩.
LDVE + 1 谢谢@Thanks!
qyff + 1 我很赞同!
chenyanlin + 1 谢谢@Thanks!
wr1596357 + 1 热心回复!
百物易用是苏生 + 1 谢谢@Thanks!
Ink + 1 鼓励转贴优秀软件安全工具和文档!
Dowson小菜 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩.
华夏小荧虫 + 1 谢谢@Thanks!
zcytelove2014 + 1 不错不错,学习啦!呵呵
饭没味 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩.
布吉岛葫芦娃 + 1 谢谢@Thanks!
scblue + 1 我很赞同!
tmsdy + 1 谢谢@Thanks!
caleb110 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩.
guojiaming + 1 很牛叉我想请教在程序结束之前执行自己的命.
丶夜猫 + 1 大神又调皮了。
LadyGaga + 1 谢谢@Thanks!
ysd87 + 1 谢谢@Thanks!
fox丶 + 1 热心回复!
t40462860 + 1 鼓励转贴优秀软件安全工具和文档!
盈盈一水间cc + 1 很详细的教程,赞
fenghaoda + 1 已答复!
adm697 + 1 好教程,能否发个MSDN的连接
smnra + 1 我很赞同!
HonDmOon + 1 感谢发布原创作品,吾爱破解论坛因你更精彩.
amscracker + 1 求大大做一个exe增加网络验证的教程
qaz003 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩.
smile1110 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩.
syuyjh + 1 谢谢@Thanks!
三少爷的剑 + 1 我很赞同!
Terrorblade + 1 谢谢@Thanks!
Tortoise + 1 谢谢@Thanks!
haoren + 1 大神辛苦了。。。
h939030952 + 1 我很赞同!
Lucas丶 + 1 我很赞同!
祈祷灬烦恼 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩.
logic1985 + 1 谢谢@Thanks!
howsk + 1 楼主的想法和实践方法非常新颖!
LoongKing + 1 感谢发布原创作品,吾爱破解论坛因你更精彩.
wulongxiang2009 + 1 正遇到一些相关问题,感谢啊,大神,求指导.
sunflover + 1 我很赞同!
ljrlove2008 + 1 我很赞同!
tail88 + 1 看到编代码就无法下手了。
Bluesky10 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩.
hjgbil + 1 我很赞同!
sunhao810130 + 1 我很赞同!
wanttobeno + 1 简单明了
luigichli + 1 谢谢@Thanks!
逍遥枷锁 + 1 谢谢@Thanks!
凌云9 + 1 学习了
pnccm + 1 鼓励转贴优秀软件安全工具和文档!
346196247 + 1 热心回复!
sherlock + 1 热心回复!
superu + 1 感谢发布原创作品,吾爱破解论坛因你更精彩.
mjxk + 1 膜拜 vc老师 下次我问c++ 麻烦你来解答哦 .
1434930788 + 1 666666
蚯蚓翔龙 + 1 感谢分享
349875904 + 1 我很赞同!
小生我怕怕 + 1 吾爱破解因你而更加精彩,非常不错的DIY
Monitor + 1 感谢发布原创作品,吾爱破解论坛因你更精彩.
吾爱扣扣 + 1 仔细的看完了,如果自己要实践起来还是败在.
微笑嘻嘻 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩.
q5we66fg + 1 鼓励转贴优秀软件安全工具和文档!
丨皮卡丘丶 + 1 谢谢@Thanks!
吃饭睡觉打豆豆 + 1 说好带我一起飞呢?
鸵鸟的梦想 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩.
唯唯 + 1 需要这项技术。

查看全部评分

本帖被以下淘专辑推荐:

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

吃饭睡觉打豆豆 发表于 2015-7-28 21:07

回帖奖励 +1 CB吾爱币

苏紫方璇大神又出新帖了,对于我这看不懂的人,然而并没有什么卵用,我是来领CB币的,最后膜拜大神。。

点评

打豆豆大牛说笑了  发表于 2015-7-28 22:06
丶夜猫 发表于 2015-7-30 19:10
修改方法是:
使用资源编辑器(本例用的ResHacker)给记事本添加菜单项,开启时间和关闭时间,并且在后面填上菜单的ID(十分重要)

@苏紫方璇 大大
为毛我托我C:\Windows 里的记事本  在Resource Hacker是木有菜单这个项的啊。。。。
3(]{N@YHNNCQUN6EG(AZE1U.png

然而托你附件里的则是有菜单项的,
吃兔子de胡萝卜 发表于 2015-7-28 20:24

回帖奖励 +1 CB吾爱币

虽然不是很懂,但知道技术的一定要顶
c1143973391 发表于 2015-7-28 20:25

回帖奖励 +1 CB吾爱币

没搞明白啥意思,但看上去好流弊
小想哟 发表于 2015-7-28 20:26

回帖奖励 +1 CB吾爱币

感谢楼主的无私分享
xugong 发表于 2015-7-28 20:30

回帖奖励 +1 CB吾爱币

楼主太厉害了,谢谢分享
2217936322 发表于 2015-7-28 20:33

回帖奖励 +1 CB吾爱币

你能在XX写上一篇学习心得可能就能挽救一个准备放弃的人,技术是共进的,如果学到东西然后悄无声息,那么论坛久而久之将没有人气。

表示喜欢这句话,不过个人观点 好东西自己藏着掖着

点评

这话是咱论坛的大牛小生说的  发表于 2015-7-28 20:38
@小七 发表于 2015-7-28 20:37

回帖奖励 +1 CB吾爱币

学习了,感谢分享
首席鉴淫师 发表于 2015-7-28 20:53

回帖奖励 +1 CB吾爱币

好像然并软~
头像被屏蔽
hnicf 发表于 2015-7-28 20:55

回帖奖励 +1 CB吾爱币

这个也是很不错的
亿联网络 发表于 2015-7-28 20:55

回帖奖励 +1 CB吾爱币

感谢楼主  又学到了PE知识
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2025-4-5 20:05

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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