能力值:
( LV12,RANK:650 )
|
-
-
2 楼
OA->VA
可以WriteProcessMemery
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
很多书上都有啊
而且网上很多教材di
多看看吧
呵呵
我是懒得写了
(其实是写不来:)
|
能力值:
( LV12,RANK:660 )
|
-
-
4 楼
最初由 RoBa 发布 OA->VA 可以WriteProcessMemery OA->VA,能具体说明一下怎么转换吗?谢谢。
|
能力值:
( LV9,RANK:690 )
|
-
-
5 楼
罗云彬大哥写的
.const
szNotFound db '无法查找',0
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 将 RVA 转换成实际的数据位置
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_RVAToOffset proc _lpFileHead,_dwRVA
local @dwReturn
pushad
mov esi,_lpFileHead
assume esi:ptr IMAGE_DOS_HEADER
add esi,[esi].e_lfanew
assume esi:ptr IMAGE_NT_HEADERS
mov edi,_dwRVA
mov edx,esi
add edx,sizeof IMAGE_NT_HEADERS
assume edx:ptr IMAGE_SECTION_HEADER
movzx ecx,[esi].FileHeader.NumberOfSections
;********************************************************************
; 扫描每个节区并判断 RVA 是否位于这个节区内
;********************************************************************
.repeat
mov eax,[edx].VirtualAddress
add eax,[edx].SizeOfRawData ;eax = Section End
.if (edi >= [edx].VirtualAddress) && (edi < eax)
mov eax,[edx].VirtualAddress ;eax= Section start
sub edi,eax ;edi = offset in section
mov eax,[edx].PointerToRawData
add eax,edi ;eax = file offset
jmp @F
.endif
add edx,sizeof IMAGE_SECTION_HEADER
.untilcxz
assume edx:nothing
assume esi:nothing
mov eax,-1
@@:
mov @dwReturn,eax
popad
mov eax,@dwReturn
ret
_RVAToOffset endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 查找 RVA 所在的节区
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_GetRVASection proc _lpFileHead,_dwRVA
local @dwReturn
pushad
mov esi,_lpFileHead
assume esi:ptr IMAGE_DOS_HEADER
add esi,[esi].e_lfanew
assume esi:ptr IMAGE_NT_HEADERS
mov edi,_dwRVA
mov edx,esi
add edx,sizeof IMAGE_NT_HEADERS
assume edx:ptr IMAGE_SECTION_HEADER
movzx ecx,[esi].FileHeader.NumberOfSections
;********************************************************************
; 扫描每个节区并判断 RVA 是否位于这个节区内
;********************************************************************
.repeat
mov eax,[edx].VirtualAddress
add eax,[edx].SizeOfRawData ;eax = Section End
.if (edi >= [edx].VirtualAddress) && (edi < eax)
mov eax,edx ;eax= Section Name
jmp @F
.endif
add edx,sizeof IMAGE_SECTION_HEADER
.untilcxz
assume edx:nothing
assume esi:nothing
mov eax,offset szNotFound
@@:
mov @dwReturn,eax
popad
mov eax,@dwReturn
ret
_GetRVASection endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
能力值:
( LV12,RANK:650 )
|
-
-
6 楼
不好意思打错了
是FO(File Offset)->VA(Virtual Address)
很多PE软件都有这个功能的.
|
能力值:
( LV12,RANK:660 )
|
-
-
7 楼
呵呵,谢谢大家的帮忙。我终于找到了一种比较简便的方法,这是较为简单的文件补丁,还有一种内存补丁我会继续研究,有结果再和大家分享。
以下代码在VC6.0+WIN2000下编译通过。
#include <stdio.h>
main()
{
FILE *pFile = fopen("E:\\破解\\RegisterTest.exe", "r+b"); //此处为要打补丁的目标文件
fseek(pFile, 0x1559, SEEK_SET); // 定位文件偏移
long lPos = ftell(pFile); // 调试用于查看返回文件位置,此句可以省略
char szFlag[2];
fread(szFlag, 1, 2, pFile); // 可以在此处读出要改写的地方,注意此句过后文件指针向后移了2个字节
fseek(pFile, -2, SEEK_CUR); // 将指针返回要改写的地方
szFlag[0] = (char)0x90; // 要替换的内容,这里将空操作写入
szFlag[1] = (char)0x90;
int nID = fwrite(szFlag, 1, 2, pFile); // 写入文件,成功则返回写入的字节个数
fclose(pFile);
return 0;
}
以上是小弟的瞎忙误撞的一点偶得,有失误愚钝之处还望大侠不吝赐教。
|
能力值:
( LV9,RANK:210 )
|
-
-
8 楼
最笨的方法是坐取出目?文件的??陪你要修改的??咄行比?(最好樘?)相同的地方咄行修改
|
|
|