吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 42262|回复: 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++] 纯文本查看 复制代码
ATOM RegisterClassEx(  CONST WNDCLASSEX *lpwcx  // class data);

而其中WNDCLASSEX为一个结构体
这个结构体的定义为
[C++] 纯文本查看 复制代码
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++] 纯文本查看 复制代码
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++] 纯文本查看 复制代码
/*
以下代码由苏紫方璇编写。我尽量在每行都做详细的注释
*/


#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, 下载次数: 256)
最后的最后,以上是本人的一点拙见,如果有什么错误和不足之处,还请各位批评指出,如果各位觉得学到了什么,还请不要吝啬手中的热心和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 楼主的想法和实践方法非常新颖!
E_eYYF + 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, 2024-4-19 10:48

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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