首页
社区
课程
招聘
[求助]IDA这个反汇编谁可以帮我看看算法是怎样的,最好写出C的算法描述
发表于: 2009-9-7 16:40 4811

[求助]IDA这个反汇编谁可以帮我看看算法是怎样的,最好写出C的算法描述

2009-9-7 16:40
4811
.text:00000012 ; =============== S U B R O U T I N E =======================================
.text:00000012
.text:00000012
.text:00000012 sub_12          proc near
.text:00000012
.text:00000012 SubStr          = byte ptr  8        //局部变量 类型char
.text:00000012 arg_5           = byte ptr  9        //局部变量 类型char
.text:00000012 arg_6           = byte ptr  0Ah        //局部变量 类型char
.text:00000012 arg_7           = byte ptr  0Bh        //局部变量 类型char
.text:00000012 arg_8           = byte ptr  0Ch        //局部变量 类型char
.text:00000012 Str             = byte ptr  88h        //局部变量 类型char
.text:00000012 arg_85          = byte ptr  89h        //局部变量 类型char
.text:00000012 arg_18C         = dword ptr  190h  //传入的参数 类型char*
.text:00000012
.text:00000012                 mov     ecx, 40h ; '@' 40H十进制是64
.text:00000017                 xor     eax, eax
.text:00000019                 lea     edi, [esp+arg_85]
.text:00000020                 mov     [esp+Str], dl  //Str赋值只有这个
.text:00000027                 mov     ebx, [esp+arg_18C]  //ebx下面窜扫描用到
.text:0000002E                 rep stosd  //将EAX中的值存入ES:EDI所指目标串中,同时EDI按DF的值自动加4或减4. 若加上前缀REP,每存储一次ECX减1,直到ECX为零时结束
.text:00000030                 stosw
.text:00000032                 stosb
.text:00000033                 mov     al, 54h ; 'T'
.text:00000035                 mov     edi, ebx  //函数参数KEY
.text:00000037                 mov     [esp+SubStr], al
.text:0000003B                 mov     [esp+arg_7], al //多余的
.text:0000003F                 or      ecx, 0FFFFFFFFh  //ecx=0FFFFFFFFh
.text:00000042                 xor     eax, eax
.text:00000044                 repne scasb  //搜索目标字符 ax/al 搜索数据 esx:edi 目标串 cx    串长度,就是在KEY中找字符'T'
.text:00000046                 not     ecx //ecx=0       
.text:00000048                 dec     ecx //ecx=-1
.text:00000049                 mov     [esp+arg_5], 45h ; 'E'  //多余的
.text:0000004E                 cmp     ecx, edx  //edx是什么,下面还要用到
.text:00000050                 mov     [esp+arg_6], 53h ; 'S'  //多余的
.text:00000055                 mov     [esp+arg_8], dl                //多余的
.text:00000059                 jle     short loc_7A  //(有符号数比较)小于或等于转移
.text:0000005B                 lea     edx, [esp+Str]
.text:00000062                 push    esi  //保存esi的值
.text:00000063                 mov     eax, ebx // ebx是KEY地址
.text:00000065                 sub     edx, ebx        /edx是什么
.text:00000067                 mov     esi, ecx //ecx是'T'出现的位置?
.text:00000069
.text:00000069 loc_69:                                 ; CODE XREF: sub_12+65j
.text:00000069                 mov     bl, [eax] 取KEY字符到bl
.text:0000006B                 xor     bl, 5  //5d的二进制是101b
.text:0000006E                 mov     cl, bl
.text:00000070                 mov     [eax], bl
.text:00000072                 mov     [edx+eax], cl
.text:00000075                 inc     eax
.text:00000076                 dec     esi  //esi是引用计数
.text:00000077                 jnz     short loc_69
.text:00000079                 pop     esi  //恢复esi的值
.text:0000007A
.text:0000007A loc_7A:                                 ; CODE XREF: sub_12+47j
.text:0000007A                 lea     eax, [esp+SubStr]
.text:0000007E                 lea     ecx, [esp+Str]
.text:00000085                 push    eax             ; SubStr
.text:00000086                 push    ecx             ; Str
.text:00000087                 call    _strstr  //在字符串Str中查找子串SubStr 如果找到则返回指向子串SubStr第一次出现处的指针,如果没有找到,则返回NULL

.text:0000008C                 add     esp, 8
.text:0000008F                 neg     eax  //0 - eax ->eax。当eax = 0时,CF清0,当eax != 0时, CF置1
.text:00000091                 sbb     eax, eax //eax - eax - CF ->eax。当eax = 0时,结果eax = 0,当eax != 0时,eax为0,否则eax非0
.text:00000093                 pop     edi
.text:00000094                 neg     eax  //0 - eax ->eax。当eax = 0时,CF清0,当eax != 0时, CF置1
.text:00000096                 mov     ds:?IsOemVersion@@3KA, eax ; ulong IsOemVersion
.text:0000009B                 xor     eax, eax
.text:0000009D                 pop     ebx
.text:0000009E                 add     esp, 184h
.text:000000A4                 retn
.text:000000A4 sub_12          endp ; sp-analysis failed
.text:000000A4
.text:000000A4 ; ---------------------------------------------------------------------------

还有这个函数的调用是这样的
DWORD RegestOEM(char *Key);

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 0
活跃值: (954)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
弱弱的说一句,你为什么不能内联ASM呢?只要参数传进去,在弄个返回值,根本就不需要逆呀。
2009-9-9 17:17
0
雪    币: 372
活跃值: (36)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
因为这个函数在LIB库里面 软件要注册才可以用
2009-9-9 19:26
0
雪    币: 2290
活跃值: (20)
能力值: ( LV9,RANK:150 )
在线值:
发帖
回帖
粉丝
4
IDA本身就有一个反汇编插件Hex-Rays Decompiler,
你可以直接用它把这个函数反编译成C语言函数,然后放到你自己的注册机代码里,
应该是能编译通过的
2009-9-10 13:06
0
游客
登录 | 注册 方可回帖
返回
//