首页
社区
课程
招聘
PEDIY:打造myHiew
发表于: 2004-11-7 14:43 56945

PEDIY:打造myHiew

2004-11-7 14:43
56945
收藏
免费 7
支持
分享
最新回复 (80)
雪    币: 239
活跃值: (160)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
26
怎么我在地址
409000:
那里输入
va jmp 401000
总是提示操作错误

我输入
api call WriteFile
就很正确

是不是那个va操作还有BUG呢?

具体文件在附件中,请大哥指点一下,谢谢!!!附件:Update.rar
2004-11-10 21:39
0
雪    币: 319
活跃值: (2459)
能力值: ( LV12,RANK:980 )
在线值:
发帖
回帖
粉丝
27
赞!
2004-11-11 08:42
0
雪    币: 135
活跃值: (226)
能力值: ( LV12,RANK:330 )
在线值:
发帖
回帖
粉丝
28
最初由 dssz 发布
怎么我在地址
409000:
那里输入
va jmp 401000
总是提示操作错误
........


发现一个严重的大BUG

处理va前缀时不小心把==写成=了。。。。。
--------------------------------------
addr=VAtoFixedOfs(addr,srcaddr);
if(addr=0xFFFFFFFF)goto invalid;//导致总是invalid....
--------------------------------------
在myHiew.cpp原代码里搜索if(addr=0xFFFFFFFF),把它替换成if(addr==0xFFFFFFFF)应该就会正常(一共有4处)

我现在在网吧,没有VC,明天到学校修补再重新上传

非常感谢兄弟的提醒!
2004-11-11 21:36
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
29
没有什么好说的。一个字“顶”,楼主真乃强人也!
2004-11-11 23:21
0
雪    币: 208
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
30
最初由 DonQuixote 发布


为了写这个,逃了两个星期所有不点名的课。。。
现在要忙着看高数线数,拖了好多页没学


精神可嘉! 有关hview asm va offset的输入,我以前就特烦hview,现在解决了
2004-11-12 08:28
0
雪    币: 239
活跃值: (160)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
31
最初由 DonQuixote 发布


发现一个严重的大BUG

处理va前缀时不小心把==写成=了。。。。。
........


很感谢大哥为我们CRACKER们所做的贡献,特别是这个hiew软件的,一直是我最喜欢用的工具之一,现在经过大哥的修改好,真的好用多了,再次表示衷心的感谢!!

我实在太兴奋了,马上装了一个VC,按大哥提示的方法修改了一下代码,重新编译,现在把编译后的DLL放上来给大家测试。

附件:myHiew.rar
2004-11-12 14:02
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
32
不顶是罪过!
2004-11-12 17:19
0
雪    币: 135
活跃值: (226)
能力值: ( LV12,RANK:330 )
在线值:
发帖
回帖
粉丝
33
谢谢dssz

用dssz的DLL更新了附件

请管理员帮忙删除旧的附件,地址是
http://bbs.pediy.com/upload/file/2004/11/myHiew.rar_529.rar

http://bbs.pediy.com/upload/file/2004/11/myHiew.rar_614.rar
2004-11-12 21:02
0
雪    币: 239
活跃值: (160)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
34
按大哥修改的方法,我重新编译过DLL后,VA的错误得到修正

但RVA具体是什么意思,我还是不明白怎样用,

请大哥如有空能否把各个功能都样例子说明一下,因为我测试过
我在409000地址里输入

RVA JMP 1000 或 RVA JMP 401000

都不能正确输入,提示汇编错误

详情大哥可在这个附件中的409000中再测试一下

谢谢附件:Update.rar
2004-11-12 21:32
0
雪    币: 47147
活跃值: (20445)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
35
最初由 DonQuixote 发布
谢谢dssz

用dssz的DLL更新了附件

请管理员帮忙删除旧的附件,地址是
........


谢谢告知,己删除。
2004-11-12 22:33
0
雪    币: 135
活跃值: (226)
能力值: ( LV12,RANK:330 )
在线值:
发帖
回帖
粉丝
36
又一个BUG:(
谢谢dssz的测试!

重新传了附件

再次麻烦删下附件bbs.pediy.com/upload/file/2004/11/myHiew.rar_175.rar,谢谢!
2004-11-12 22:41
0
雪    币: 239
活跃值: (160)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
37
最初由 DonQuixote 发布
又一个BUG:(
谢谢dssz的测试!

重新传了附件

........


测试了好几个功能,感觉都很好,就是不明白"标签"是怎样创建和使用的

我按F11以后只能看到一个黑黑的窗口,在窗口底下有F1,F2,F3,ESC的说明,其他就什么都看不到了,大哥能改变一下那个窗口的颜色吗,最好就用它原来的颜色(蓝色),这样会清楚很多。

请大哥有空举点例子说明一下就好了,谢谢!!!

2004-11-13 01:12
0
雪    币: 135
活跃值: (226)
能力值: ( LV12,RANK:330 )
在线值:
发帖
回帖
粉丝
38
标签是在汇编窗口里输入
deflb string
来定义的,这个伪指令把当前位置定义为名字=string的标签
然后就可以用valb ofslb这些前缀或者cinvoke/sinvoke或者@*标记来使用这个标签

按F11时可以查看当前已经定义的标签,可能你没有定义标签,所以什么也没有

文章的最后有一个用myHiew加密记事本的例子,有完整的代码,可以直接F12进去,那段程序要从Entry那里开始看

注意标签必须先定义才能使用,所以为了能直接F12,只好把标签标记的代码写在前面,而使用标签的代码写在后面

颜色可以在myHiew.cpp里修改,具体就是函数PrintLable的这两行:
                                SetString(buf[line],80,str,FOREGROUND_RED);
                                if(i==n)SetString(buf[line],80,str,FOREGROUND_RED|BACKGROUND_BLUE);

FOREGROUND_RED是文字颜色,BACKGROUND_BLUE是背景
这些颜色是winconsole.h里预定义的
2004-11-14 17:32
0
雪    币: 239
活跃值: (160)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
39
最初由 DonQuixote 发布
标签是在汇编窗口里输入
deflb string
来定义的,这个伪指令把当前位置定义为名字=string的标签
然后就可以用valb ofslb这些前缀或者cinvoke/sinvoke或者@*标记来使用这个标签

........


怎么我在VC的安装目录下找不到winconsole.h文件,请问哪能下载到呢?

如我想改为  白色低,黑色字,应该怎样改呢?
2004-11-14 20:08
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
40
学习
ING
2004-11-15 11:46
0
雪    币: 135
活跃值: (226)
能力值: ( LV12,RANK:330 )
在线值:
发帖
回帖
粉丝
41
最初由 dssz 发布



怎么我在VC的安装目录下找不到winconsole.h文件,请问哪能下载到呢?

........


抱歉,我记错了,是wincon.h
里面包括与控制台有关的头文件定义
颜色定义是在144-151左右,不过只有很少的几种
就是
FOREGROUND_RED FOREGROUND_BLUE FOREGROUND_GREEN
BACKGROUND_RED BACKGROUND_BLUE BACKGROUND_GREEN
可以异或来获得颜色

白色应该就是RED+BLUE+GREEN,不定义好像就是黑色

在VC里双击标示符,点右键,goto define/reference(好像是这个样子,记不清了),就可以跳到定义/引用的地方去
2004-11-18 22:27
0
雪    币: 239
活跃值: (160)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
42
最初由 DonQuixote 发布


抱歉,我记错了,是wincon.h
里面包括与控制台有关的头文件定义
颜色定义是在144-151左右,不过只有很少的几种
........


修改了一下以后,个人感觉清楚很多。

修改代码如下,有兴趣的兄弟也可这样修改。

                                SetString(buf[line],80,str,BACKGROUND_RED| BACKGROUND_BLUE| BACKGROUND_GREEN);
                                if(i==n)SetString(buf[line],80,str,BACKGROUND_BLUE| BACKGROUND_GREEN);

                SetString(buf[line],80,"",BACKGROUND_RED| BACKGROUND_BLUE| BACKGROUND_GREEN);
       

        SetString(buf[line],80,"******** [F1=Delete Current] [F2=Delete All] [F3=Paste VA] [ESC=Return] ********",BACKGROUND_RED| BACKGROUND_BLUE| BACKGROUND_GREEN);

再次感谢 DonQuixote !!!
2004-11-19 13:01
0
雪    币: 239
活跃值: (160)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
43
我按下F11以后出现这个标签对话框(我测试的时候不是每次按F11都能得到标签对话框,有时候刚开始的时候可以,当用HVIEW修改了几个文件后,再启动HVIEW,再按F11就不能呼出标签对话框了,要重新启动电脑又OK了。)。

我在测试F12的粘贴功能,一直测试都不成功,请大哥指点一下。

我就复制 mov eax,12345678
然后在hview中按F12,怎么都不成功(无论我是否按F3,F2)

我把我的错误提示的图贴出来!
2004-11-19 17:29
0
雪    币: 489
活跃值: (112)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
44
今天写一个 sincoke SystemTimeToTzSpecificLocalTime/eax/...的函数,就是不成功,看了一下,输入表中有这个函数.为什么?找原因如下:
	char tmp[100];
	char sign[20];
	char ins[20];
	char operand[50];

和其他的一些定义,buffer稍嫌太小,溢出啦,满啦:D.比如上面的API调用,50字节容不开了.ins[20]也容不开API的名字.建议老大改一下:)

再加上第2个建议:
楼主不要偷懒: DWORD WINAPI KeyInput(void*string)线程中,最好加上线程同步的互斥量(临界区就足够啦).因为我的爱机较慢,所以在GetThunkByName()时,KeyInput()可能已经插入N个指令啦.
2004-11-25 18:20
0
雪    币: 135
活跃值: (226)
能力值: ( LV12,RANK:330 )
在线值:
发帖
回帖
粉丝
45
to dssz:
谢谢兄弟的测试和建议
不过你的问题我一直没想明白是怎么回事,也可能是多线程同步的问题
(网吧的机器不会这样啊
你单步调试下看看GetLastError是多少,代码是这里:
#define assert(a) if(!a){MsgOut("myHiew.dll Error:" #a " return FALSE");return 0;}
BOOL InputClipData()
{
        assert(OpenClipboard(NULL));
        HANDLE hMem=GetClipboardData(CF_TEXT);
        assert(hMem);
        char*ptr=(char*)GlobalLock(hMem);
        assert(ptr);
        strcpy(cliptext,ptr);
        assert(GlobalUnlock(hMem));//那个红窗口都是这行出错导致的
        assert(CloseClipboard());

        CreateThread(NULL,0,KeyInput,cliptext,NULL,NULL);

        return 1;
}

to NoneName:
谢谢兄弟的测试和建议,明天就改!
2004-11-25 20:27
0
雪    币: 135
活跃值: (226)
能力值: ( LV12,RANK:330 )
在线值:
发帖
回帖
粉丝
46
to dssz:
谢谢兄弟的测试和建议
不过你的问题我一直没想明白是怎么回事,也可能是多线程同步的问题
(网吧的机器不会这样啊
你单步调试下看看GetLastError是多少,代码是这里:
#define assert(a) if(!a){MsgOut("myHiew.dll Error:" #a " return FALSE");return 0;}
BOOL InputClipData()
{
        assert(OpenClipboard(NULL));
        HANDLE hMem=GetClipboardData(CF_TEXT);
        assert(hMem);
        char*ptr=(char*)GlobalLock(hMem);
        assert(ptr);
        strcpy(cliptext,ptr);
        assert(GlobalUnlock(hMem));//那个红窗口就是这行出错导致的
        assert(CloseClipboard());

        CreateThread(NULL,0,KeyInput,cliptext,NULL,NULL);

        return 1;
}

to NoneName:
谢谢兄弟的测试和建议,明天就改!
2004-11-25 20:28
0
雪    币: 239
活跃值: (160)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
47
最初由 DonQuixote 发布
to dssz:
谢谢兄弟的测试和建议
不过你的问题我一直没想明白是怎么回事,也可能是多线程同步的问题
(网吧的机器不会这样啊
你单步调试下看看GetLastError是多少,代码是这里:
........


我应该在哪调用GetLastError呢,是不是这样改?

#define assert(a) if(!a){MsgOut("myHiew.dll Error:" #a " return FALSE");return 0;}
BOOL InputClipData()
{
  assert(OpenClipboard(NULL));
  HANDLE hMem=GetClipboardData(CF_TEXT);
  assert(hMem);
  char*ptr=(char*)GlobalLock(hMem);
  assert(ptr);
  strcpy(cliptext,ptr);

int ReTurn=GlobalUnlock(hMem) ;//从这里开始修改
GetLastError();         //放在这里看返回值吗?
assert(ReTurn);//那个红窗口就是这行出错导致的

  assert(CloseClipboard());
  CreateThread(NULL,0,KeyInput,cliptext,NULL,NULL);

  return 1;
}

我还发现,当那个红色框出来以后,如我不退出HVIEW,那么我在其他的程序都不能调用 剪贴板 了,也就是说,出现那个红色框以后,如我不退出,再启动写字板程序(note.exe),怎样复制都不成功,可能剪贴板一直被HVIEW占用着,所以note.exe调用不成功。

我在同一台电脑里,有3个不同的操作系统,在98 ,ME下测试不成功,在XP下测试成功,不知道是不是这个F12的功能需要的函数一定要在纯32位的操作系统下才能正常使用呢?

*******************************************************************

另外还有几点建议

1:要是能保存F11中的标签内容,下次再修改这个文件的时候可重新载入就更方便了,不用重新再设置标签了。(这个功能就象OLLYDBG中的断点保存保存功能一样),对于需要多次修改的程序,不用每次重复写标签很方便的。

2:在标签对话框中,现在有了删除标签功能,能否增加一个手工输入标签的功能呢,也就是说 在标签对话框中输入 deflb a1==0x401000,那么就能定义一个新的标签,不用每次去到那个地址才能设置

3:程序中虽然有了VA RVA的功能,但因为我们一般DIYPE的时候,都是先增加空白代码,然后知道空白代码在文件中的OFFSET地址
然后再在要修改的地址跳到空白代码的OFFSET地址中去的。

举例如下:
地址1: offset1: 5000        va1: 402000
地址2: offset2: 8000        va2: 406000

如我想在地址1(5000)跳到地址2(8000)中,那么我在地址1(5000)处输入: jmp 8000 因为根据文件地址差,
hview中只能跳到:va1+(0ffet2-0ffset1)=402000+(8000-5000)=405000(不是我想要的406000地址)

当然根据大哥的VA JMP 406000能跳到对准确的地址中去,但能否大哥增加一下功能 输入:ofs jmp 8000就能等效jmp va2 呢?

这样我们知道文件中绝对地址以后就能马上写入跳转,不用首先把OFFSET地址转换到VA地址,再用VA JMP 了

2004-11-25 21:19
0
雪    币: 239
活跃值: (160)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
48
我用调试器跟踪了一下,大致情况如下,请大哥指点一下,问题在什么地方呢?

.100036F0: FF1508E00010                 call        GlobalLock ;KERNEL32.dll   
.100036F6: 85C0                         test        eax,eax                    
.100036F8: 7512                         jne        .01000370C  -----  (1)      
.100036FA: 68E8010110                   push        0100101E8  -----  (2)      
.100036FF: FF1550000110                 call        d,[10010050]               
.10003705: 83C404                       add         esp,004 ;" "               
.10003708: 33C0                         xor         eax,eax                    
.1000370A: 5B                           pop         ebx                        
.1000370B: C3                           retn                                   
.1000370C: 56                           push        esi                        
.1000370D: 57                           push        edi                        
.1000370E: 8BF8                         mov         edi,eax                    
.10003710: 83C9FF                       or          ecx,-001 ;" "              
.10003713: 33C0                         xor         eax,eax                    
.10003715: 53                           push        ebx                        
.10003716: F2AE                         repne       scasb                     
.10003718: F7D1                         not         ecx                        
.1000371A: 2BF9                         sub         edi,ecx                    
.1000371C: 8BC1                         mov         eax,ecx                    
.1000371E: 8BF7                         mov         esi,edi                    
.10003720: BF20100110                   mov         edi,010011020  -----  (3)  
.10003725: C1E902                       shr         ecx,002 ;" "               
.10003728: F3A5                         repe        movsd                     
.1000372A: 8BC8                         mov         ecx,eax                    
.1000372C: 83E103                       and         ecx,003 ;" "               
.1000372F: F3A4                         repe        movsb          //这里如按F10就出来那个红色的对话框(按F8没有)
.10003731: FF1504E00010                 call        GlobalUnlock ;KERNEL32.dll //入口参数正确(指向hMem)
.10003737: 5F                           pop         edi  //上面的GlobalUnlock函数返回EAX为0
.10003738: 5E                           pop         esi                        
.10003739: 85C0                         test        eax,eax //上面函数返回EAX=0,这里是Z=0                  
.1000373B: 7512                         jne        .01000374F  -----  (1)      
.1000373D: 68B4010110                   push        0100101B4  -----  (2)      
.10003742: FF1550000110                 call        d,[10010050]               
.10003748: 83C404                       add         esp,004 ;" "               
.1000374B: 33C0                         xor         eax,eax                    
.1000374D: 5B                           pop         ebx                        
.1000374E: C3                           retn                                   
.1000374F: FF1534E10010                 call        CloseClipboard ;USER32.dll
.10003755: 85C0                         test        eax,eax                    
.10003757: 7512                         jne        .01000376B  -----  (3)      
.10003759: 6884010110                   push        010010184  -----  (4)      
.1000375E: FF1550000110                 call        d,[10010050]               
.10003764: 83C404                       add         esp,004 ;" "               
.10003767: 33C0                         xor         eax,eax                    
.10003769: 5B                           pop         ebx                        
.1000376A: C3                           retn
2004-11-26 21:16
0
雪    币: 239
活跃值: (160)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
49
//为了避免在剪贴板中的内存问题,我换一种方法测试,使用读文件的方法
//预先建立在HVIEW的目录下的a.txt文件,里面就是我们要复制到hview中的内容,我测试的时候,只写了一行,MOV EAX,12345678
//我修改的代码如下

#define assert(a) if(!a){MsgOut("myHiew.dll Error:" #a " return FALSE");return 0;}
BOOL InputClipData()
{

HANDLE hFile=CreateFile("a.txt" , GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0 , NULL);
//因为只是测试,所以偷懒,没有检测返回值了
ReadFile(hFile, cliptext, 1000, &dwreadfilea, NULL);//dwreadfilea为全局变量,我声明为DWORD dwreadfilea

//动态跟踪发现已经成功把文件中的内容读到cliptext中

CloseHandle(hFile);

/*
        assert(OpenClipboard(NULL));
        HANDLE hMem=GetClipboardData(CF_TEXT);
        assert(hMem);
        char*ptr=(char*)GlobalLock(hMem);
        assert(ptr);
        strcpy(cliptext,ptr);
        assert(GlobalUnlock(hMem));
        assert(CloseClipboard());
*/

        CreateThread(NULL,0,KeyInput,cliptext,NULL,NULL);   //动态跟踪,发现这里创建线程失败,返回EAX=0
        return 1;
}
2004-11-26 23:41
0
雪    币: 135
活跃值: (226)
能力值: ( LV12,RANK:330 )
在线值:
发帖
回帖
粉丝
50
to dssz:
谢谢兄弟的测试和建议,我会把123加进入

复制剪贴版的问题很奇怪,代码我是从MSDN里COPY的,只是加上了assert而已,而且在WIN98下试过没有问题
你调试的时候用OD加载,停在call

GlobalUnlock这里,F8经过,然后OD的寄存器窗口里就会出现LastErr:********这一行,这个就是GetLastError()的值了
或者是在代码里加上对GetLastError()的调用也一样
2004-11-28 20:56
0
游客
登录 | 注册 方可回帖
返回
//