首页
学习
活动
专区
工具
TVP
发布

Eureka的技术时光轴

专栏作者
338
文章
685482
阅读量
39
订阅数
RP3 make kernel
https://www.raspberrypi.com/documentation/computers/linux_kernel.html Raspberry Pi 2/3 Default Build Configuration cd linux KERNEL=kernel7 make bcm2709_defconfig Build and install the kernel, modules and Device Tree blobs; this step takes a long time... make -j4 zImage modules dtbs sudo make modules_install sudo cp arch/arm/boot/dts/*.dtb /boot/ sudo cp arch/arm/boot/dts/overlays/*.dtb* /boot/overlays/ sudo cp arch/arm/boot/dts/overlays/README /boot/overlays/ sudo scripts/mkknlimg arch/arm/boot/zImage /boot/$KERNEL.img
战神伽罗
2022-05-11
3510
优化Linux bootloader速度的究极之路:从GRUB到EFI Stub
Linux著名的GRUB已立n代,2.0以后已经是最受欢迎的bootloader,很多Linux发行版都用它作为缺省的bootloader。GRUB2功能强大,全面支持UEFI启动,甚至是安全启动,实在是行走江湖、杀人越货的必备武器。但于此同时,强大的功能让它越发臃肿,为Linux快速启动带来了负面影响。
战神伽罗
2020-08-11
3.1K0
看完秒懂,“数字签名”入侵那点事儿!
关于可信代码数字签名如何计算PE文件哈希值的细节,参阅本文档后面的“Calculating the PE Image Hash”。
战神伽罗
2020-07-03
2.5K0
在ring0调用Ring3的代码
作者:VXK/CVC.GB 时间:2005-02-05 每次上driverdevelop总看到有人问怎么在Ring0下调用Ring3的代码—— Ring3使用Ring0已经是地球人全知道的事情了,但是ring0下使用ring3的代码 恐怕很少有人知道,Ratter和Benny这两个高人以及Elzc的作者Elzcor各自提出 过一种方法。总结起来就是三种方法,Zombie在2004年也提出过一个方法看起 来像是Ratter和Elzcor的方法结合而成~ 当然说其本质都是一种思想把ring3代码搞到ring3的空间去执行,听起来 大家也好像有所明白了吧,Benny的方法是在Ring0的向Ring3进程插入代码执行, Ratter则是Hook KAPIZ等待用户层调用发生把ring3代码放回Ring3空间,利用 KeUserModeCallBack来执行,Elzcor则是自己建立一个进程把代码内存感染到 进程执行。Zombie取两家之长搞的~。 今天我来向大家介绍的更像是Ratter和Benny的方法结合,对于Benny的方法, 我不完全采用,我采用的思想仍然是代码放回Ring3空间~ 首先无论如何我们都要有一个进程~ 习习~Windows提供强大的kernel函数帮我们虐待用户~ PsSetCreateProcessNotifyRoutine摄定好NotifyRoutine在创建进程时我们就 可以yy进程了~ 通过DDK文档MSDN的大叔的帮助,这个函数 PsSetCreateProcessNotifyRoutine有两个参数 返回值是NTSTATUS型,第一个参数是回调函数NotifyRoutine,第二个参数是Bool型的 如果第二个参数为False表示设定NotifyRoutine,为True就是取消~ NotifyRoutine的形式如下 NotifyRoutine proc dwParentId:DWORD, dwProcessId:DWORD, bCreate:BOOL 这样我们就可以获得一个进程了~~xixi~~ 我们的NotifyRoutine只处理dwProcessId和dwProcessId,对bCreate不用理,通过使用ps 函数PsLookupProcessByProcessId得到PEPROCESS结构(得不到结构的不处理),再取进程Name 如果是Explore且插入标识无就开始我们的插入~(选Explore的原因我就不用说了吧?) 插入时我采用Ratter的方法,于是乎就要用KeAttachProcess,Attach到进程然后开始 工作~~呵呵~~ 插完了就用回调CallBackUserMode~~然后DetachProcess... KeUserModeCallBack的参数 NTSTATUS KeUserModeCallback ( IN ULONG ApiNumber, IN PVOID InputBuffer, IN ULONG InputLength, OUT PVOID *OutputBuffer, IN PULONG OutputLength ) 可能看不出来怎么使它返回UserMode执行任意代码,但是如果你看看win2ksrc/private/ntos/ke/i386/ 下的callback.c和callout.asm就会发现世界真奇妙~~~居然KiCallUserMode回调的是~~~~~xixi~~~~ 我不说了,大家应该自己研究一下吧~ 另外我提一下参数传递的问题,这里使用KeUserModeCallBack必须要用有效的InputBuffer和OutputBuffer 当KeUserModeCallBack发生时,调用我们的Ring3代码参数传入的方式好像是PUSH进来的 KiCallUserMode中回调USER的时KiServiceExit回自动的飞向我们的代码~ 类似发生下面的事情~ ( ;这些代码并非真的在KiCallUserMode里存在~ ;只是我个人的猜测,因为softice跟到最后到处是[ebx+xxx],[esi+xxx]这样的东西~ ;实在难说~做后使用jmp _KiServiceExit返回ring3的代码更是头大~ ;不过分析的说可能是栈传入参数~ ;如果看ntos/ke/i386/下的分析,估计会更头大~它的栈传递和stack变换等等搞的很晕~~ ;不过可以肯定的说,就是已经到了ring3了,我们自己做个检测不就行了? ;hehe~具体到底是怎么传递的呢?大家做个检测吧,我不说了~ ;正确的函数传递方式:Kernel是怎么运行我们的函数的~ push Outlength push lpOutBuffer push Inlengt
战神伽罗
2019-10-09
1K0
BT、BTS、BTR、BTC: 位测试指令
;BT(Bit Test): 位测试 ;BTS(Bit Test and Set): 位测试并置位 ;BTR(Bit Test and Reset): 位测试并复位 ;BTC(Bit Test and Complement): 位测试并取反
战神伽罗
2019-08-09
2.8K0
完美实现GetProcAddress
我们知道kernel32.dll里有一个GetProcAddress函数,可以找到模块中的函数地址,函数原型是这样的: WINBASEAPI FARPROC WINAPI GetProcAddress( IN HMODULE hModule, IN LPCSTR lpProcName ); hModule 是模块的句柄,说白了就是内存中dll模块的首地址 loProcName 一般指函数名称的字符串地址,也可能是指序号,如何区分呢? 我们这样 if (((DWORD)lpProcName& 0xFFFF0000) == 0) { //这里是序号导出的; } { //这里是函数名称导出的 } 最终真找到匹配的函数地址,然后返回就ok了,但是前提是你需要了解PE的导出表 下面简单说一下,首先从PE里找到下面这个结构,如果不知道如何找的话,建议在坛子里搜索一下PE结构解析的文章,找到这个结构应该还是很简单的 typedef struct _IMAGE_EXPORT_DIRECTORY { DWORD Characteristics; DWORD TimeDateStamp; WORD MajorVersion; WORD MinorVersion; DWORD Name; DWORD Base; DWORD NumberOfFunctions; DWORD NumberOfNames; DWORD AddressOfFunctions; // RVA from base of image DWORD AddressOfNames; // RVA from base of image DWORD AddressOfNameOrdinals; // RVA from base of image } IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY; 具体什么意思呢? 虽然, kanxue老大在这里写的很漂亮了都 http://www.pediy.com/tutorial/chap8/Chap8-1-7.htm 我还是打算啰嗦一下 Base 函数以序号导出的时候的序号基数,从这个数开始递增 NumberOfFunctions 本dll一共有多少个导出函数,不管是以序号还是以函数名导出 NumberOfFunctions 本dll中以能够以函数名称导出的函数个数(注意,说一下,其实函数里的每一个函数都能通过序号导出,但是为了兼容性等等,也给一些函数提供用函数名称来导出) AddressOfFunctions 指向一个DWORD数组首地址,共有NumberOfFunctions 个元素,每一个元素都是一个函数地址 AddressOfNames 指向一个DWORD数组首地址,共有NumberOfNames个元素,每一个元素都是一个字符串(函数名字符串)首地址 AddressOfNameOrdinals指向一个WORD数组首地址,共有NumberOfNames个元素,每一个元素都是一个函数序号 我们说的最后俩数组,其实是一种一一对应的关系,假如分别叫 dwNames[] 和 dwNamesOrdinals[], 假如dwNames[5]的值(这个指是一个地址,前面都说了)指向的字符串等于“GetValue”,那么dwNamesOrdinals[5]的值(这个指是一个序号,前面都说了),就是GetValue导出函数的序号啦,那么怎样找到地址呢? 这时候就需要用到第一个数组了,假如名字叫dwFuncAddress[], GetValue的导出地址就是 dwFuncAddress[dwNamesOrdinals[5]] + 模块基址 好了,啰嗦了这么多,看代码:
战神伽罗
2019-07-24
2.4K0
暴力搜索x64 ssdt 以及挂钩HOOK
IDA加载ntoskrnl.exe 微软符号,进入,jump by name,随便输入一个,比如zwwritefile,层层跟踪,进入,可以发现
战神伽罗
2019-07-24
2.2K0
pcduino ubuntu install os
http://www.yortnoswad.org/blog/2014/10/29/fedora-on-pcduino3-nano/
战神伽罗
2019-07-24
8500
N种内核注入DLL的思路及实现
内核注入,技术古老但很实用。现在部分RK趋向无进程,玩的是SYS+DLL,有的无文件,全部存在于内存中。可能有部分人会说:“都进内核了.什么不能干?”。是啊,要是内核中可以做包括R3上所有能做的事,软件开发商们也没必要做应用程序了。有时,我们确实需要R3程序去干驱动做起来很困难或者没必要驱动中去做的事,进程 / DLL是不错的选择,但进程目标太大,所以更多的同学趋向于注DLL。 若要开发安全软件、小型工具,可借鉴其思路,Anti Rootkits时,在某些极端情况下,可使用同样的技术发现、清除RK,保证用户电脑的正常使用。在此,我将探讨几种内核注入DLL的思路及实现原理。 (1) APC技术 给一个Alertbale的用户态线程插APC,让其执行其中的ShellCode,来执行我们的代码。这个方法简单易行,但是不够稳定,兼容性不好。测试中发现经常出现Explorer.exe等插崩溃的情况,而且有杀软在的情况下,插入有时会被拦截,起不到应有的效果。(可参考我以前逆过的一个驱动:逆向fuck.sys--编译通过--源码) (2) 内核Patch [url=file://KnownDLLs/Kernel32.dll]\\KnownDLLs\\Kernel32.dll[/url] CreateThread [url=file://KnownDLLs/]\\KnownDLLs[/url]是系统加载时对象管理器加载最新磁盘DLL到内存的,当其他进程想调用某个DLL时,就不用重复从磁盘加载了,而会从这里映射一份到自己的进程空间中去。这样给我们做全局Patch提供了一个很好的机会: ZwOpenSection打开 [url=file://KnownDlls/kernel32.dll]\\KnownDlls\\kernel32.dll[/url],调用ZwMapViewOfSection映射一份到自己进程空间,然后寻找kernel32.dll在内存中代码节的空隙,选择这里作为我们fake函数的存储Buffer。修改CreateThread函数的开头5字节跳转到这个间隙,当系统任何一个线程创建时,会走到CreateThread函数,然后执行空隙中的ShellCode,其负责调用LoadLibrary加载我们的DLL。DLL一经加载,会发IOCTL通知本驱动,让驱动卸载HOOK。这样就完成了内核注DLL的过程。测试时发现Svchost.exe进程调用CreateThread函数很频繁,所以触发也会很快,基本1秒不到就能将DLL加载进去,而我们的HOOK也卸掉了。所以稳定性提高不少。示意图如下:
战神伽罗
2019-07-24
2.2K0
关于新版本cuckoo hook位置变动的思考
最近跟队友更新monitor版本,发现新版本将Zwxxx的hook位置移到了ntxxx的位置,其实做的是同一件事,为什么要如此?带着疑问我用OD进行了追踪。
战神伽罗
2019-07-24
5490
完美实现GetProcAddress
我们知道kernel32.dll里有一个GetProcAddress函数,可以找到模块中的函数地址,函数原型是这样的: WINBASEAPI FARPROC WINAPI GetProcAddress( IN HMODULE hModule, IN LPCSTR lpProcName ); hModule 是模块的句柄,说白了就是内存中dll模块的首地址 loProcName 一般指函数名称的字符串地址,也可能是指序号,如何区分呢? 我们这样 if (((DWORD)lpProcName& 0xFFFF0000) == 0) { //这里是序号导出的; } { //这里是函数名称导出的 } 最终真找到匹配的函数地址,然后返回就ok了,但是前提是你需要了解PE的导出表 下面简单说一下,首先从PE里找到下面这个结构,如果不知道如何找的话,建议在坛子里搜索一下PE结构解析的文章,找到这个结构应该还是很简单的 typedef struct _IMAGE_EXPORT_DIRECTORY { DWORD Characteristics; DWORD TimeDateStamp; WORD MajorVersion; WORD MinorVersion; DWORD Name; DWORD Base; DWORD NumberOfFunctions; DWORD NumberOfNames; DWORD AddressOfFunctions; // RVA from base of image DWORD AddressOfNames; // RVA from base of image DWORD AddressOfNameOrdinals; // RVA from base of image } IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY; 具体什么意思呢? 虽然, kanxue老大在这里写的很漂亮了都 http://www.pediy.com/tutorial/chap8/Chap8-1-7.htm 我还是打算啰嗦一下 Base 函数以序号导出的时候的序号基数,从这个数开始递增 NumberOfFunctions 本dll一共有多少个导出函数,不管是以序号还是以函数名导出 NumberOfFunctions 本dll中以能够以函数名称导出的函数个数(注意,说一下,其实函数里的每一个函数都能通过序号导出,但是为了兼容性等等,也给一些函数提供用函数名称来导出) AddressOfFunctions 指向一个DWORD数组首地址,共有NumberOfFunctions 个元素,每一个元素都是一个函数地址 AddressOfNames 指向一个DWORD数组首地址,共有NumberOfNames个元素,每一个元素都是一个字符串(函数名字符串)首地址 AddressOfNameOrdinals指向一个WORD数组首地址,共有NumberOfNames个元素,每一个元素都是一个函数序号 我们说的最后俩数组,其实是一种一一对应的关系,假如分别叫 dwNames[] 和 dwNamesOrdinals[], 假如dwNames[5]的值(这个指是一个地址,前面都说了)指向的字符串等于“GetValue”,那么dwNamesOrdinals[5]的值(这个指是一个序号,前面都说了),就是GetValue导出函数的序号啦,那么怎样找到地址呢? 这时候就需要用到第一个数组了,假如名字叫dwFuncAddress[], GetValue的导出地址就是 dwFuncAddress[dwNamesOrdinals[5]] + 模块基址 好了,啰嗦了这么多,看代码: DWORD MyGetProcAddress( HMODULE hModule, // handle to DLL module LPCSTR lpProcName // function name ) { int i=0; PIMAGE_DOS_HEADER pImageDosHeader = NULL; PIMAGE_NT_HEADERS pImageNtHeader = NULL; PIMAGE_EXPORT_DIRECTORY pImageExportDirectory = NULL; pImageDosHeader=(PIMAGE_DOS_HEADER)hModule; pImageNtHeader=(PIMAGE_NT_HEADERS)((DWORD)hModule+pImageDosHeader->e_lfanew); pImageExportDirectory=(PIMAGE_EXPORT_DIREC
战神伽罗
2019-07-24
1.4K0
使用Windbg调试内核
Windbg是微软开发的免费源码级调试工具。Windbg可以用于Kernel模式调试和用户模式调试,还可以调试Dump文件。
战神伽罗
2019-07-24
1.5K0
没有更多了
社区活动
腾讯技术创作狂欢月
“码”上创作 21 天,分 10000 元奖品池!
Python精品学习库
代码在线跑,知识轻松学
博客搬家 | 分享价值百万资源包
自行/邀约他人一键搬运博客,速成社区影响力并领取好礼
技术创作特训营·精选知识专栏
往期视频·千货材料·成员作品 最新动态
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档