[分享] 修改磁盘中的PE文件,增加一个API函数!

[复制链接]
  • TA的每日心情
    开心
    2014-4-2 21:30
  • 签到天数: 3 天

    [LV.2]九品芝麻官

    534

    主题

    400

    回帖

    7742

    积分

    Intohard Team

    Rank: 7Rank: 7Rank: 7

    积分
    7742
    发表于 2012-4-13 22:54:05 | 显示全部楼层 |阅读模式
    添加新节,可以先计算然后再添加。这样麻烦点。而是直接把映象加大到一个固定值。
    1. ;*********************************************************************
    2. ;添加一个新节,把导入表复制到新节中,更改导入表rva,oep到新加的api函数中然后跳回去
    3. ;by onepc/153785587
    4. ;添加新节参照玩命的代码,添加api函数参照lordpe手动添加一个api然后用winhex打开观看变化的内容
    5. ;然后根据它的变化写出来的。
    6. ;想到那里就写那里,写完之后就不想再去分类写子程序了。给初学的参考下。因我也是初学的。有注释
    7. ;还有就是修改之后启动慢了好多。map时可以映小的+
    8. ;感谢924792768[QQ]
    9. ;*********************************************************************
    10. .386
    11. .model flat,stdcall
    12. option casemap:none
    13. ;*********************************************************************
    14. include windows.inc
    15. include user32.inc
    16. include kernel32.inc
    17. includelib user32.lib
    18. includelib kernel32.lib
    19. include comdlg32.inc
    20. includelib comdlg32.lib
    21. ;*********************************************************************
    22. _OpenFile proto ;打开文件并映射文件到内存
    23. _FileAlign proto dwVirSize : DWORD, dwAlign : DWORD
    24. _RvaToOffset proto _lpNtHeader:DWORD,_RvaAddr:DWORD
    25. _CheckPeInfo proto _lpMem:DWORD ;检查是否是PE文件
    26. _SetSection proto  _lpNtHeader:DWORD,_RvaAddr:DWORD
    27. ;*********************************************************************


    28. dwSectionSize equ 100h

    29. .data
    30. szCreateFileError db '打开文件失败',0
    31. szCreateFileMappingError db '创建文件映射失败',0
    32. szMapViewOfFileError db '映射文件到内存失败',0
    33. szError db 'ERROR',0
    34. szInvalPe db '无效PE格式',0

    35. szNewSectionName db 'onepc',0

    36. szWz db 'http://www.baidu.com/index.php?tn=onepc_pg',0
    37. szShell32 db 'Shell32.dll',0
    38. szShellExecuteA db 'ShellExecuteA',0

    39. szFmat db '%08x',0

    40. szFilter  db  'Text Files(*.exe)',0,'*.exe',0,'Dll Files(*.dll)',0,'*.dll',0,0
    41. .data?
    42. hInstance dd ?

    43. szBuffer db MAX_PATH dup (?)

    44. .code



    45. ;*********************************************************************
    46. _OpenFile proc
    47.       local @hFile:DWORD,@hFileMap:DWORD
    48.       local @lpMem:DWORD
    49.       local @szFileNameBuf[MAX_PATH]:BYTE
    50.       local @stFile:OPENFILENAME
    51.     pushad
    52.           invoke RtlZeroMemory,addr @szFileNameBuf,sizeof @szFileNameBuf
    53.           invoke RtlZeroMemory,addr @stFile,sizeof @stFile
    54.           mov @stFile.lStructSize,sizeof @stFile
    55.           ;push hMain
    56.           ;pop @stFile.hwndOwner
    57.           ;mov @stFile.hwndOwner,hMin
    58.           mov @stFile.lpstrFilter,offset szFilter
    59.           lea eax,@szFileNameBuf
    60.           mov @stFile.lpstrFile,eax
    61.           mov @stFile.nMaxFile,MAX_PATH
    62.           mov @stFile.Flags,OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST
    63.           invoke GetOpenFileName,addr @stFile
    64.           .if !eax      ;getopenfilename打开成功的话返回非0值
    65.              popad
    66.              ret
    67.           .endif
    68.          
    69.       invoke CreateFile,addr @szFileNameBuf,GENERIC_READ+GENERIC_WRITE,\
    70.                                         FILE_SHARE_READ+FILE_SHARE_WRITE,\
    71.                                         NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL
    72.      .if eax==INVALID_HANDLE_VALUE
    73.           jmp CreateFileError
    74.      .endif
    75.      mov @hFile,eax
    76.      invoke GetFileSize,@hFile,NULL
    77.      .if !eax ;等于0失败
    78.          jmp CreateFileError
    79.      .endif
    80.      add eax,2000h
    81.      xchg eax,ecx
    82.      invoke CreateFileMapping,@hFile,NULL,PAGE_READWRITE,0,ecx,NULL ; 这里若是都设0表示是以原文件的尺寸映射到内存中
    83.      .if !eax
    84.          jmp CreateFileMapError
    85.      .endif
    86.      mov @hFileMap,eax
    87.      invoke MapViewOfFile,@hFileMap,FILE_MAP_READ+FILE_MAP_WRITE+FILE_MAP_COPY,NULL,NULL,NULL
    88.      .if !eax
    89.          jmp MapViewOfFileError
    90.      .endif
    91.          mov @lpMem,eax
    92.          
    93. ;*********************************************************************         
    94.      invoke _CheckPeInfo,@lpMem  ;检查PEINFO
    95. ;*********************************************************************
    96.             
    97. ;*********************************************************************
    98. ;*********************************************************************     
    99.       ExitOpenFile:
    100.                  invoke UnmapViewOfFile, @lpMem
    101.                  invoke CloseHandle, @hFileMap
    102.                  invoke CloseHandle, @hFile  
    103.            popad  
    104.            ret
    105. ;*********************************************************************           
    106.       CreateFileError:
    107.               lea eax,szCreateFileError
    108.               jmp ShowError
    109.       CreateFileMapError:
    110.               lea eax,szCreateFileMappingError
    111.               jmp ShowError
    112.       MapViewOfFileError:
    113.               lea eax,szMapViewOfFileError
    114.               jmp ShowError
    115.       ShowError:
    116.               invoke MessageBox,NULL,eax,addr szError,MB_OK
    117.               jmp ExitOpenFile
    118. ;*********************************************************************
    119. _OpenFile endp
    120. ;*********************************************************************



    121. _CheckPeInfo proc _lpMem:DWORD ;起始地址
    122.         local @lpNtHeader:DWORD ;NTHEADER
    123.         local @dwSectionNum:DWORD ;原来节数目
    124.         local @dwSectionAlign:DWORD ;节对齐值
    125.         local @dwFileAlign:DWORD ;文件对齐值
    126.         local @dwStartSection:DWORD ;原始节的起始位置
    127.         local @dwNewStartSection:DWORD ;新节超始位置
    128.         local @dwNewVaddr:DWORD ;新节的内存偏移值
    129.         local @dwNewFaddr:DWORD ;新节的文件偏移值
    130.         local @dwShell32:DWORD ;Shell32.dll名所在的文件的文件偏移 含lpMem
    131.         local @dwShellExecuteA:DWORD ;指向shellexecuteA的地址
    132.         local @dwDllNameAddr:DWORD ;
    133.         local @dwShellExecuteAddr:DWORD
    134.         local @dwNewImprotable:DWORD ;新的导入表位置
    135.         local @dwSaveOep:DWORD ;旧入口点
    136.         local @dwNewOep:DWORD ;新入口点
    137.         local @dwImageBase:DWORD ;基址
    138.         
    139.      mov esi,_lpMem
    140.      assume esi:ptr IMAGE_DOS_HEADER
    141.      .if [esi].e_magic!='ZM'
    142.          jmp PeError
    143.      .endif
    144.      add esi,[esi].e_lfanew ;指向NTHEADER
    145.      mov @lpNtHeader,esi
    146.      assume esi:ptr IMAGE_NT_HEADERS
    147.      .if WORD PTR [esi].Signature!='EP'
    148.          jmp PeError
    149.      .endif
    150.     movzx ecx,[esi].FileHeader.NumberOfSections
    151.     mov @dwSectionNum,ecx
    152. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;   
    153.     push [esi].OptionalHeader.ImageBase  ;基址
    154.     pop @dwImageBase
    155.     push [esi].OptionalHeader.AddressOfEntryPoint ;oep
    156.     pop @dwSaveOep
    157. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    158.     inc [esi].FileHeader.NumberOfSections ;节加1

    159.     push [esi].OptionalHeader.SectionAlignment
    160.     pop @dwSectionAlign ;内存对齐值
    161.     push [esi].OptionalHeader.FileAlignment
    162.     pop @dwFileAlign ;文件对齐值
    163. ;    mov ebx,[esi].OptionalHeader.SizeOfImage
    164. ;    add ebx,@dwSectionAlign
    165. ;    mov [esi].OptionalHeader.SizeOfImage,ebx
    166.    
    167.    
    168.     add esi,sizeof IMAGE_NT_HEADERS ;esi指向节表
    169.     assume esi:PTR IMAGE_SECTION_HEADER
    170.     mov @dwStartSection,esi ;保存第一个节表值
    171.     mov ebx,sizeof IMAGE_SECTION_HEADER ;一个节表大小
    172.     mov eax,@dwSectionNum ;有N个节表
    173.     mul ebx ;eax的值就是N个节表的大小
    174.     add esi,eax ;esi指向是要新加的节表的起始位置
    175.     mov @dwNewStartSection,esi ;新节表起始位置
    176.     lea edi,[esi].Name1
    177.     lea esi,szNewSectionName
    178.        SetSectionValue:
    179.             lodsb ;把esi指向的字节一个一个装入al
    180.             test al,al
    181.             jz ExitSetSectionName
    182.             stosb ;从al里一个一个地传到edi中
    183.         jmp SetSectionValue

    184. ExitSetSectionName:
    185.     mov esi,@dwNewStartSection
    186.     push 0E00000E0h    ;设置节块属性为可读可写可执行   C0000040
    187.     pop [esi].Characteristics
    188.     push dwSectionSize    ;设置内存中节块大小
    189.     pop [esi].Misc.VirtualSize
    190. ;***************************************************************************

    191.    
    192.     invoke _FileAlign,dwSectionSize,@dwFileAlign ;返回的是文件对齐后的值
    193.     mov [esi].SizeOfRawData,eax  ;文件对齐值      
    194. ;    invoke _FileAlign,dwSectionSize,@dwSectionAlign ;实际大小除于节对齐,那么返回的是节对齐之后的值
    195. ;    mov ecx,eax ;节对齐之后的值保存在ecx中
    196.    
    197.     sub @dwNewStartSection,sizeof IMAGE_SECTION_HEADER ;上一节的偏移
    198.     mov eax,@dwNewStartSection
    199.     assume eax:PTR IMAGE_SECTION_HEADER
    200.    
    201.     mov ecx,[eax].Misc.VirtualSize ;上节的实际大小
    202.     push eax
    203.     invoke _FileAlign,ecx,@dwSectionAlign ;对齐之后的大小
    204.     mov ecx,eax
    205.     pop eax
    206.    
    207.     add ecx,[eax].VirtualAddress  ;上面ecx是节对齐后的大小 加上 上一节的内存偏移,那么ecx现在的值就是新节的内存偏移地址
    208.      
    209.     mov [esi].VirtualAddress,ecx ;新节内存偏移
    210.     mov @dwNewVaddr,ecx ;保存新节内存偏移
    211.    
    212.     mov ecx,[eax].PointerToRawData ;上一节的文件偏移
    213.     mov ebx,[eax].SizeOfRawData ;上一节的文件对齐的大小
    214.     add ecx,ebx
    215.     mov [esi].PointerToRawData,ecx ;新节文件偏移
    216.     mov @dwNewFaddr,ecx ;保存新节的文件偏移
    217.     push ecx ;新了文件偏移
    218. ;***************************************************************************
    219.     mov ecx,[esi].Misc.VirtualSize ;新节的没对齐的大小
    220.     add ecx,[esi].VirtualAddress ;新节内存偏移
    221.     invoke _FileAlign,ecx,@dwSectionAlign  ;返回对齐之后的值,就是整个镜像的大小
    222.     mov ecx,eax
    223.     mov eax,@lpNtHeader
    224.     assume eax:PTR IMAGE_NT_HEADERS
    225.     mov [eax].OptionalHeader.SizeOfImage,ecx   ;镜像大小
    226. ;***************************************************************************
    227.     pop ecx;新了文件偏移
    228.     mov edi,ecx  ;;;;;;;
    229. ;    invoke wsprintf,addr szBuffer,addr szFmat,edi
    230. ;    invoke MessageBox,NULL,addr szBuffer,addr szBuffer,0
    231.     add edi,_lpMem ;在内存中的新节的文件偏移的位置
    232. ;    invoke wsprintf,addr szBuffer,addr szFmat,edi
    233. ;    invoke MessageBox,NULL,addr szBuffer,addr szBuffer,0
    234. push edi   
    235.     mov ecx,[esi].SizeOfRawData ;文件对齐后的大小给ecx , 目的是要把它填零
    236.     xor eax, eax
    237.     cld
    238.     rep stosb
    239.     ;s:stosb
    240.     ;loop s
    241. ;***************************************************************************   
    242. ;***************************************************************************
    243. ;添加字符串
    244. invoke lstrlen,addr szWz ;不包含终止符的长度
    245. ;invoke wsprintf,addr szBuffer,addr szFmat,eax
    246. ;invoke MessageBox,NULL,addr szBuffer,addr szBuffer,0
    247. pop edi ;这个是新节的文件偏移起如位置
    248. mov ecx,eax ;长度
    249. lea esi,szWz
    250. cld
    251. rep movsb
    252. ;edi已加上了szWz的长度的位置了。
    253. ;invoke wsprintf,addr szBuffer,addr szFmat,edi
    254. ;invoke MessageBox,NULL,addr szBuffer,addr szBuffer,0
    255. ;***************************************************************************
    256. ;复制导入表结构到此




    257. ;***************************************************************************
    258. add edi,6 ;其实已算出它多长
    259. ;**********************************************************************
    260. ;**********************************************************************
    261. mov eax,edi
    262. sub eax,_lpMem ;
    263. sub eax,@dwNewFaddr ;对节头的偏移量
    264. mov @dwDllNameAddr,eax ;对节头的偏移量

    265. mov eax,@dwNewVaddr ;新节内存偏移+偏移量
    266. add eax,@dwDllNameAddr
    267. xchg eax,@dwDllNameAddr
    268. ;**********************************************************************
    269. ;**********************************************************************




    270. mov @dwShell32,edi  ;指向shell32.dll的起始位置
    271. invoke lstrlen,addr szShell32
    272. mov ecx,eax ;长度
    273. lea esi,szShell32
    274. cld
    275. rep movsb
    276. inc edi ;加一个0字节  shell32.dll结尾 edi的文件偏移是加上镜像地址的
    277. ;**********************************************************************
    278. ;**********************************************************************
    279. mov eax,edi
    280. sub eax,_lpMem ;shellexecutea文件偏移量
    281. sub eax,@dwNewFaddr ;对节头的偏移量
    282. mov @dwShellExecuteAddr,eax ;对节头的偏移量
    283. ;mov @dwShellExecuteA,edi ;指向ShellExecuteA的起始位置
    284. ;**********************************************************************
    285. ;**********************************************************************


    286. add edi,2 ;这二个值是Hint,填零

    287. invoke lstrlen,addr szShellExecuteA
    288. mov ecx,eax ;长度
    289. lea esi,szShellExecuteA
    290. cld
    291. rep movsb
    292. ;add edi,5 ;指向下一行 准备放导入表
    293. inc edi ;加一个0 shellexecutea以0结尾空字符


    294. mov eax,@dwNewVaddr ;新节内存偏移+偏移量=指向shellexecute的前二位 即hitn
    295. add eax,@dwShellExecuteAddr ;比如内存偏移是4000 + 6 那么rva就是4006了
    296. mov DWORD PTR [edi],eax

    297. ;**********************************************************************
    298. ;**********************************************************************
    299. mov eax,edi ;edi现在是指向指向shellexeute偏移的偏移地址
    300. sub eax,_lpMem ;文件偏移量
    301. sub eax,@dwNewFaddr ;对节头的偏移量
    302. mov @dwShellExecuteAddr,eax ;对节头的偏移量 注:这里只是用同一个变量。
    303. ;**********************************************************************
    304. ;**********************************************************************

    305. add edi,8
    306. ;;;;;;;;;;;;;;;;; 注意这里
    307. ;;还有前面的变量偏移加上四就是到导入表的偏移变量
    308. add eax,8
    309. mov @dwNewImprotable,eax ;保存偏移量


    310.       mov edx,@lpNtHeader
    311.       assume edx:ptr IMAGE_NT_HEADERS
    312.       mov ebx,[edx].OptionalHeader.DataDirectory[sizeof IMAGE_DATA_DIRECTORY].VirtualAddress ;导入表RVA
    313.       invoke _SetSection,@lpNtHeader,ebx
    314.       invoke _RvaToOffset,@lpNtHeader,ebx ;把RVA转为文件偏移,返回的eax的值就是文件偏移
    315.       push eax ;导入表文件偏移
    316.       add eax,_lpMem   ;eax是导入表的文件偏移,所以加上_lpMem,那么现在eax就是指向导入表
    317.       
    318. ;;;;;;;;;;;;;;;;;      
    319.        mov esi,eax ;源
    320. ;;;;;;;;;;;;;;;;; 注意这里
    321.       
    322.        mov edx,eax
    323.        assume edx:ptr IMAGE_IMPORT_DESCRIPTOR ;IMAGE_IMPORT_DESCRIPTOR最后一个是全0的结构
    324.        ;***
    325.           .while [edx].OriginalFirstThunk || [edx].TimeDateStamp || [edx].ForwarderChain || [edx].FirstThunk || [edx].Name1
    326.                add edx,sizeof IMAGE_IMPORT_DESCRIPTOR
    327.           .endw ;全0时退出
    328. ;       add edx,20 ;全0的结构 一个导入表的结构是20字节 不要加
    329.        sub edx,_lpMem ;导入表结尾的文件偏移
    330.        pop eax ;导入表文件偏移
    331.        sub edx,eax ;edx导入表大小

    332. mov ecx,edx ;长度
    333. cld
    334. rep movsb
    335. ;复制之前的导入表到新节中完成

    336. ;edi现在的位置就可以写入新的导入表结构
    337.   mov edx,edi
    338. assume edx:ptr IMAGE_IMPORT_DESCRIPTOR
    339. mov eax,@dwNewVaddr ;新节内存偏移+偏移量
    340. add eax,@dwShellExecuteAddr ;这里指向-指向shellexecuteaddr的rva
    341. ;;;;;;;
    342. mov @dwShellExecuteAddr,eax ;存回去,下面用
    343. ;;;;;;;
    344.   mov [edx].OriginalFirstThunk,eax ;设成相同
    345.   mov [edx].TimeDateStamp,0
    346.   mov [edx].ForwarderChain,0
    347.   mov ecx,@dwDllNameAddr
    348.   mov [edx].Name1,ecx  ;指向dll文件的Rva偏移地址。这里的是新节的RVA
    349.   mov [edx].FirstThunk,eax ;设成相同
    350. ;这里设置新增导入表完成


    351. ;***************************************************************************
    352. ;***************************************************************************
    353. ;***************************************************************************
    354. ;***************************************************************************
    355. ;更改oep
    356. add edi,50  ;20*2=40 +10 预多
    357. mov edx,edi  ;用edx保存文件里的起始位置
    358. sub edi,_lpMem
    359. sub edi,@dwNewFaddr ;对节头的偏移量
    360. add edi,@dwNewVaddr ;加上新节的RVA 那就是入口点了
    361. mov @dwNewOep,edi
    362. mov WORD PTR [edx],016Ah
    363. add edx,2
    364. mov WORD PTR [edx],006Ah
    365. add edx,2
    366. mov WORD PTR [edx],006Ah
    367. add edx,2
    368. mov BYTE PTR [edx],68h
    369. add edx,1
    370. mov ecx,@dwNewVaddr;网址在新节0偏移处
    371. add ecx,@dwImageBase ;rva+基址 就是装载到内存中的实际地址
    372. mov DWORD PTR [edx],ecx
    373. add edx,4
    374. mov WORD PTR [edx],006Ah
    375. add edx,2
    376. mov WORD PTR [edx],006Ah
    377. add edx,2
    378. mov BYTE PTR [edx],0E8h
    379. add edx,1
    380. mov DWORD PTR [edx],00000005h ;因为下边还有一条jmp指令,预长点 ;call
    381. add edx,4
    382. mov BYTE PTR [edx],0E9h    ;jmp oldoep
    383. add edx,1
    384. ;=============================================================
    385. mov ecx,@dwSaveOep ;旧的oep
    386. add ecx,@dwImageBase ;ecx装入内存后的地址  要跳到的目的地址
    387. mov eax,edx
    388. add eax,4 ;这里是已加上jmp指令的长度了
    389. sub eax,_lpMem
    390. sub eax,@dwNewFaddr ;对新节的偏移值
    391. add eax,@dwNewVaddr ;rva值
    392. add eax,@dwImageBase ;装入内存中的地址  本身jmp地址+指令长度
    393. sub ecx,eax
    394. ;=============================================================
    395. mov DWORD PTR [edx],ecx
    396. add edx,4
    397. ;=============================================================
    398. ;0000000A5处
    399. mov WORD PTR [edx],25FFh ;这个jmp是跳到dll里去的。后面跟的地址是导入表中API函数的地址
    400. add edx,2
    401. mov eax,@dwShellExecuteAddr ;指向指向API的rva值
    402. add eax,@dwImageBase ;装入内存中的地址
    403. mov DWORD PTR [edx],eax





    404. ;jmp计算:目的地址-(本身jmp的起始地址+本身指令长度)=jmp后面的数据

    405. ;call xxxxxxx变成机器码的话这个是在文件里存放的。这个表标的是
    406. ;比如当前的call代码的起始地址是00401041    汇编这个CALL 0040104A
    407. ;那么机器码就是:目标地址(0040104A)-起始地址+5字节(call指令长度)=00000004
    408. ;就变成了call E8 04000000 这个机器码了






    409. ;***************************************************************************
    410. ;***************************************************************************
    411. ;***************************************************************************
    412. mov esi,@lpNtHeader
    413. assume esi:ptr IMAGE_NT_HEADERS
    414. ;;;;;;更改oep
    415. mov ecx,@dwNewOep
    416. mov [esi].OptionalHeader.AddressOfEntryPoint,ecx

    417. mov eax,@dwNewVaddr ;新节内存偏移+偏移量
    418. add eax,@dwNewImprotable
    419. mov [esi].OptionalHeader.DataDirectory[sizeof IMAGE_DATA_DIRECTORY].VirtualAddress,eax   ;设置新的导入表rva值
    420. ;再把IAT清零
    421. mov [esi].OptionalHeader.DataDirectory[12*(sizeof IMAGE_DATA_DIRECTORY)].VirtualAddress,0
    422. mov [esi].OptionalHeader.DataDirectory[12*(sizeof IMAGE_DATA_DIRECTORY)].isize,0










    423. ;***************************************************************************
    424. ExitPeInfo:
    425.     assume edx:nothing
    426.     assume eax:nothing
    427.     assume esi:nothing
    428.   ret

    429. PeError:
    430.    lea eax,szInvalPe
    431.    invoke MessageBox,NULL,eax,addr szError,MB_OK
    432.    jmp ExitPeInfo   

    433. _CheckPeInfo endp


    434. ;*********************************************************************
    435. ;*********************************************************************
    436. _RvaToOffset proc uses edi ebx _lpNtHeader:DWORD,_RvaAddr:DWORD
    437.              local @dwSetionNum
    438.        mov edi,_lpNtHeader ;***********
    439.        assume edi:ptr IMAGE_NT_HEADERS
    440.        movzx eax,[edi].FileHeader.NumberOfSections
    441.        mov @dwSetionNum,eax
    442.        add edi,sizeof IMAGE_NT_HEADERS
    443.        assume edi:ptr IMAGE_SECTION_HEADER
    444.        mov edx,_RvaAddr
    445.           .while @dwSetionNum>0
    446.                      mov eax,[edi].VirtualAddress
    447.                      add eax,[edi].SizeOfRawData
    448.                  .if (edx>=[edi].VirtualAddress) && (edx<eax)
    449.                      mov ebx,[edi].VirtualAddress
    450.                      sub edx,ebx
    451.                      mov eax,[edi].PointerToRawData ;节头的文件偏移
    452.                      add eax,edx   ;节头的文件偏移+对节头的偏移 即已把RVA转换成了文件偏移

    453.                      jmp @F
    454.                  .endif   
    455.                 dec @dwSetionNum
    456.                 add edi,sizeof IMAGE_SECTION_HEADER ;指向下一个节头
    457.           .endw  
    458.        @@:assume edi:nothing
    459.      ret
    460. _RvaToOffset endp
    461. ;*********************************************************************
    462. ;*********************************************************************
    463. ;设置可写可读
    464. _SetSection proc uses edi edx eax ebx _lpNtHeader:DWORD,_RvaAddr:DWORD
    465.              local @dwSetionNum
    466.        mov edi,_lpNtHeader ;***********
    467.        assume edi:ptr IMAGE_NT_HEADERS
    468.        movzx eax,[edi].FileHeader.NumberOfSections
    469.        mov @dwSetionNum,eax
    470.        add edi,sizeof IMAGE_NT_HEADERS
    471.        assume edi:ptr IMAGE_SECTION_HEADER
    472.        mov edx,_RvaAddr
    473.           .while @dwSetionNum>0
    474.                      mov eax,[edi].VirtualAddress
    475.                      add eax,[edi].SizeOfRawData
    476.                  .if (edx>=[edi].VirtualAddress) && (edx<eax)

    477.                     push 0C0000040h
    478.                     pop [edi].Characteristics

    479.                      jmp @F
    480.                  .endif   
    481.                 dec @dwSetionNum
    482.                 add edi,sizeof IMAGE_SECTION_HEADER ;指向下一个节头
    483.           .endw  
    484.        @@:assume edi:nothing
    485.      ret
    486. _SetSection endp
















    487. _FileAlign proc uses ecx edx dwVirSize : DWORD, dwAlign : DWORD     
    488.     mov ecx, dwAlign  ;对齐值
    489.     mov eax, dwVirSize ;写入的实值大小
    490.     xor edx, edx
    491.     div ecx ;用没有对齐的实际值除以对齐值,若余数(放在edx中)等于0,能整除说明它的大小刚好就用 商*对齐值 =这个就是大小
    492.     cmp edx, 0
    493.     jz AlreadyAligned
    494.     inc eax    ;若余数不等于0,说明(商+1) *对齐值就可以放值对齐后的大小
    495. AlreadyAligned:
    496.     mul ecx      ;对齐后的值放在eax中
    497.     ret
    498. _FileAlign endp
    499. ;例:没对齐的大小是100   对齐值是200 那么 100/200 edx存的余数不为0 则 要商(eax+1)*对齐值就可以存放这个100的大小
    500. ;即是(0+1) *200=200即经对齐后的大小是200

    501. ;*********************************************************************
    502. ;*********************************************************************
    503. ;添加API函数
    504. ;用lordpe添加了导入表结构看了下,里面的导入表大小无相关
    505. ;IAT那里可以清零
    506. ;*********************************************************************
    507. ;*********************************************************************
    508. ;_AddImportTableAPI proc
    509. ;   
    510. ;
    511. ;
    512. ;_AddImportTableAPI endp



    513. ;*********************************************************************
    514. start:
    515.    invoke GetModuleHandle,NULL
    516.    mov hInstance,eax
    517.    invoke _OpenFile
    518.    invoke ExitProcess,NULL
    519. end start
    520. ;*********************************************************************
    复制代码
  • TA的每日心情
    开心
    昨天 08:48
  • 签到天数: 3576 天

    [LV.Master]三朝元老

    35

    主题

    6001

    回帖

    2万

    积分

    [INTOHARD]旅长

    Rank: 9Rank: 9Rank: 9

    积分
    21003
    发表于 2012-4-14 00:54:17 | 显示全部楼层
    我真想学习一下
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2014-3-3 09:34
  • 签到天数: 601 天

    [LV.9]二品侍郎

    30

    主题

    1744

    回帖

    8837

    积分

    [INTOHARD]团长

    Rank: 8Rank: 8

    积分
    8837
    QQ
    发表于 2012-4-14 09:22:42 | 显示全部楼层
    看不懂 、、、、、
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 08:48
  • 签到天数: 3576 天

    [LV.Master]三朝元老

    35

    主题

    6001

    回帖

    2万

    积分

    [INTOHARD]旅长

    Rank: 9Rank: 9Rank: 9

    积分
    21003
    发表于 2012-4-14 14:30:09 | 显示全部楼层
    看不懂啊啊,
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2020-11-23 19:23
  • 签到天数: 79 天

    [LV.6]五品郎中

    0

    主题

    870

    回帖

    868

    积分

    [INTOHARD]连长

    Rank: 4

    积分
    868
    发表于 2014-3-1 12:15:35 | 显示全部楼层
    参考学习 总结分享
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    21

    回帖

    16

    积分

    [INTOHARD]工兵

    Rank: 1

    积分
    16
    发表于 2017-9-12 18:28:07 | 显示全部楼层
    好难啊   
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

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