【文章标题】: PEDIY技术之新思路(一)_简单实现记事本自动保存
【简单介绍】:在不改动记事本原代码的前提下,另类实现给记事本添加自动保存的功能(为什么要拿这个开刀,因为它简单,作为开篇比较好,前几天newjueqi写过关于这个功能实现的pediy文章,相信大家也比较熟悉),我为什么说它是个思路呢,是这样的,我觉得很多pediy的实现大多都是在原来代码区块里面改来该去,操作繁杂不说,空间也不一定够,而且很容易出错,所以这种改动的功能放到新的区块里面会更方便,而且编译产生二进制文件,在一次写进去,比直接修改代码来得容易和方便了。而且它至少还有两个好处:1 就是如果程序加了壳,这个时候你肯定不能直接改动代码,但是用这种方法却可以(你可以试下给记事本加个壳,把入口改一下,再按如下方法进行处理),2 经过如下方法处理后的程序,peid什么都查不出来了,或者会误判
【文章作者】: moonife
【读者对象】:都看看吧
【文章难度】:3/10(我自己定义的)
【作者邮箱】: moonife@163.com
【作者QQ号】: 765496322
【下载地址】: 附件
【编写语言】: win32 asm
【使用工具】: AddSection(我自己刚写的,附件里有)
【操作平台】: xp-sp3
【作者说明】:我有一个不知道是好不好的习惯,就是任何事都想要改进一下,可以更快捷和方便的完成,当然很多事也就只是想想,并没有实现的能力和条件,不过现在这个我算是成功实现了吧,所以就拿出来分享一下,希望可以给各位产生点价值。说真的,我都不知道如何去很好的描述这种思路,所以还是来具体的实现过程吧,各位自己体会了!有不足之处,还恳请各位大虾指正!谢谢了
*******************************************实现过程*********************************************
一 实现过程简介:
1 编写实现功能的代码, 产生功能代码编译后的数据文件
2 给记事本增加一个新的区块,并把数据文件写入,并更改记事本入口地址为新区块开头,执行完功能功能代码后返回原入口地址
二 具体操作过程:
-----------------------1 编写实现功能的代码, 产生功能代码编译后的数据文件----------------------------
下面是实现此功能的win32 asm 代码并给出比较详细的注译
; MakeData.asm
;***********************************************************************
.586
.model flat,stdcall
option casemap:none
;***********************************************************************
include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib
include xlib.inc ;这个头文件来自 forgot & heXer 两位大牛的,主要是利用PEB原理搜索API和初始化库,
;为了更方便,我把罗云彬大哥的仿invoke指令宏定义加进去,具体使用见后面的AutoSave.asm
;因为篇幅关系,这个头文件就不贴了,附件里有
;***********************************************************************
.data?
hOutFile dd ?
BytesWritten dd ?
.const
szCaption db 'Info',0
szContext db 'success',0
szOutFileName db 'notepad.data',0
;***********************************************************************
.code
include AutoSave.asm ;这里把实现功能代码引入,编译并产生数据文件,下面的应该都看懂,就不讲了
start:
invoke CreateFile,offset szOutFileName,GENERIC_READ or GENERIC_WRITE,\
FILE_SHARE_READ,\
NULL,CREATE_ALWAYS,\
FILE_ATTRIBUTE_NORMAL,NULL
mov hOutFile,eax
invoke WriteFile,hOutFile,offset REMOTE_CODE_START,REMOTE_CODE_LENGTH,addr BytesWritten,NULL
invoke MessageBox,0,offset szContext,offset szCaption,MB_OK
invoke ExitProcess,0
end start
;******************************************************************************
;AutoSave.asm
REMOTE_CODE_START equ this byte
;******************Infect code start***************************
call @F
@@:
pop ebx
sub ebx,offset @B ;relocation
initX XFL_MAX, "user32" ;引用xlib.inc里面的宏操作,功能是加载user32.dll库和初始化
lea eax,szContextR[ebx]
lea ecx,szCaptionR[ebx]
invokex MessageBoxA,0,eax,ecx,MB_YESNO ;功能开启选择对话框,注意这里是invokex哦,它不会进行参数检查,如果API进行字符处理,
;要加A或W
.if eax==IDNO
push Ret_Entry[ebx] ;返回原入口地址
ret
.else
lea edi, [ebx + offset AutoSaveThread]
invokex CreateThread,NULL,0,edi,NULL,NULL,NULL ;产生一个线程,这个比较关键,关闭记事本后才退出,你应该想到它要干什么了吧
push Ret_Entry[ebx]
ret
.endif
;>>>>>>>>>>>>>>>>线程定义>>>>>>>>>>>>>>>>>>>>>>>>>>>>
AutoSaveThread proc uses ebx edi esi ecx
call @F
@@:
pop ebx
sub ebx,offset @B ;特别注意这里也需要重定位
initX XFL_MAX, "user32"
.while 1 ;无限循环
lea edi, [ebx + offset szClassNmae]
invokex FindWindowA,edi,NULL ;查找记事本的窗口获得句柄
.if eax
mov ecx,eax
xor eax,eax
mov ax,3 ;保持菜单项的ID,用资源编辑工具可以获得
invokex SendMessageA,ecx,WM_COMMAND,eax,0 ;给保存菜单项发送消息
.endif
invokex Sleep, 10000 ;约多长时间循环一次,你可以按需改动
.endw
mov eax,TRUE
ret
AutoSaveThread endp
;>>>>>>>>>>>>>>>>这里定义用到的数据>>>>>>>>>>>>>>>>>>>>>>>>>>>>
szContextR db '是否开启自动保存?',0
szCaptionR db 'AutoSave',0
szClassNmae db 'Notepad',0 ;记事本主窗口的类名
Ret_Entry dd 0100739Dh ;记事本的原入口地址,用lordpe等pe工具就可以得到
;******************Infect code end***************************
REMOTE_CODE_END equ this byte
REMOTE_CODE_LENGTH equ offset REMOTE_CODE_END - offset REMOTE_CODE_START
******2 给记事本增加一个新的区块,并把数据文件写入,并更改记事本入口地址为新区块开头,执行完功能功能代码后返回原入口地址******
运行附件里面的AddSection ,目标文件选择记事本程序,数据文件选择第一步中产生的notepad.data文件,并选上写入数据文件和更新入口地址,填写区块名字,然后生成,会在目标文件目录下生成 xxx@.exe文件,就ok了;如下图:
******************************************the end****************************************************************
Ps:不足之处还请给我指正一下,在这里要特别感谢forgot & heXer & 罗云彬 等无数大牛的无私奉献,再次感谢看雪学院!应该会有下一篇的吧,或者哪位用这种思路实现更多更好PEDIY
附件文件清单:AutoSave.asm , MakeData.asm,xlib.inc,AddSection.exe,(最终生成的)notepad@.exe,还有本文档。
写于:2009-4-2
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课