SymEncrypt.asm
上传用户:hbtcygglw
上传日期:2007-01-07
资源大小:281k
文件大小:8k
源码类别:

其他

开发平台:

Delphi

  1. .386p
  2. extrn   _ntohl@4: near
  3. extrn   _htonl@4: near
  4. extrn   _memset : near
  5. extrn   _rand : near
  6. ; Segment type: Pure code
  7. _text segment para public 'CODE' use32
  8. assume cs:_text
  9. assume es:nothing, ss:nothing, ds:_text, fs:nothing, gs:nothing
  10. TeaEncrypt proc near
  11. pTemp = dword ptr -10h
  12. var_C = dword ptr -0Ch
  13. var_8 = dword ptr -8
  14. var_4 = dword ptr -4
  15. pBuf1 = dword ptr  8
  16. arg_8 = dword ptr  0Ch
  17. arg_C = dword ptr  10h
  18. push ebp
  19. mov ebp, esp
  20. sub esp, 10h //alloc stack for local var
  21. push ebx
  22. push esi
  23. mov esi, [ebp+pBuf1] //esi=pBuf1;
  24. push edi
  25. push dword ptr [esi] //
  26. call _ntohl@4 //
  27. push dword ptr [esi+4] //
  28. mov edi, eax //edi=ntohl(pBuf1[0]);
  29. call _ntohl@4 //
  30. mov ebx, eax //ebx=ntohl(pBuf[1]);
  31. mov eax, [ebp+arg_8] //eax=arg_8
  32. lea ecx, [ebp+pTemp] //ecx=ebp-pTemp;
  33. lea esi, [ebp+pTemp] //esi=ebppTemp;
  34. sub eax, ecx //eax=arg_8-ebp+pTemp;
  35. mov [ebp+pBuf1], 4 //pBuf1=4;
  36. mov [ebp+arg_8], eax //arg_8=arg_8-pTemp;
  37. jmp short loc_0_43D04D
  38. loc_0_43D04A:
  39. mov eax, [ebp+arg_8] //eax=arg_8;
  40. loc_0_43D04D:
  41. push dword ptr [eax+esi] //arg_8-pTemp+pTemp;
  42. call _ntohl@4
  43. mov [esi], eax //*esi=ntohl(arg_8);
  44. add esi, 4 //esi+=4;   notice! pdwBuf++;
  45. dec [ebp+pBuf1] //pBuf1--;
  46. jnz short loc_0_43D04A //while(pBuf1<>0);
  47. push 10h //push 16;
  48. xor eax, eax //eax=0;
  49. pop ecx //ecx=16;
  50. loc_0_43D064:
  51. mov edx, ebx //e
  52. mov esi, ebx
  53. shr edx, 5 //edx=htohl(edx>>5);
  54. add edx, [ebp+var_C] //edx+=var_C;
  55. sub eax, 61C88647h //eax-=0x61c88647
  56. shl esi, 4 //esi<<4;
  57. add esi, [ebp+pTemp] //
  58. xor edx, esi
  59. lea esi, [eax+ebx]
  60. xor edx, esi
  61. add edi, edx
  62. mov edx, edi
  63. mov esi, edi
  64. shr edx, 5
  65. add edx, [ebp+var_4]
  66. shl esi, 4
  67. add esi, [ebp+var_8]
  68. xor edx, esi
  69. lea esi, [eax+edi]
  70. xor edx, esi
  71. add ebx, edx
  72. dec ecx
  73. jnz short loc_0_43D064
  74. push edi
  75. call _htonl@4
  76. mov esi, [ebp+arg_C]
  77. push ebx
  78. mov [esi], eax
  79. call _htonl@4
  80. mov [esi+4], eax
  81. pop edi
  82. pop esi
  83. pop ebx
  84. leave
  85. retn
  86. TeaEncrypt endp
  87. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  88. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  89.             public  _SymmetryEncrypt
  90. _SymmetryEncrypt proc near
  91. pBuf3 = byte ptr -14h
  92. pBuf2 = byte ptr -0Dh
  93. pBuf1 = byte ptr -0Ch 随机数缓冲区指针?
  94. i         = dword ptr -4 DWORD left byte number
  95. arg_0 = dword ptr  8              DWORD Length?
  96. arg_4 = dword ptr  0Ch DWORD PlainText Buffer Length   UNKNOW
  97. arg_8 = dword ptr  10h DWORD pointer unknow
  98. arg_C = dword ptr  14h DWORD Buffer pinter
  99. arg_10 = dword ptr  18h DWORD
  100. //处理数据包长度
  101. push ebp
  102. mov ebp, esp
  103. sub esp, 14h //alloc local var
  104. mov eax, [ebp+arg_4] //eax=arg_4
  105. push ebx
  106. push esi
  107. push edi
  108. push 8
  109. add eax, 0Ah //eax=arg_4+10;
  110. pop ebx //ebx=8;
  111. cdq //edx=signed bit of eax
  112. mov ecx, ebx //ecx=8//估计是数据包长度/8
  113. idiv ecx //eax=arg_4/8   edx=arg_4 mod 8
  114. test edx, edx //edx=0?
  115. mov [ebp+i], edx //i=arg_4 mod 8
  116. jz short loc_0_43D182 //if(i!=0){
  117. mov eax, ebx // eax=8;
  118. sub eax, edx // eax=8-(arg_4 mod 8)
  119. mov [ebp+i], eax // i=eax
  120. //}
  121. loc_0_43D182:
  122. call _rand
  123. mov ecx, eax //ecx=rand()
  124. mov eax, [ebp+i] //eax=i
  125. and cl, 0F8h //cl&=0xf8  cl=8
  126. push 1
  127. or cl, al //cl=8|al
  128. pop edi //edi=1
  129. mov [ebp+pBuf1], cl //将(数据包长度or随机数)存入缓冲区[0]
  130. //pBuf1[0]=(BYTE)rand()|8;
  131. mov ecx, eax //ecx=i
  132. dec eax //eax--;
  133. test ecx, ecx
  134. jz short loc_0_43D1AE //
  135. //if(i==0)goto
  136. lea esi, [eax+1] //esi=i;
  137. //生成随机数缓冲区
  138. loc_0_43D1A1: //do {
  139. call _rand //
  140. mov [ebp+edi+pBuf1], al // pBuf1[edi]=rand();
  141. inc edi // edi++;
  142. dec esi // esi--;
  143. jnz short loc_0_43D1A1 //while(esi!=0);
  144. //处理完成后
  145. loc_0_43D1AE:
  146. push ebx //push 8??
  147. lea eax, [ebp+pBuf3] //eax=pBuf3;
  148. push 0 //
  149. push eax
  150. call _memset //memset(pBuf3,0,ebx),ebx is length of pBuf3
  151. mov esi, [ebp+arg_10] //esi=arg_10
  152. lea eax, [ebp+pBuf3] //eax=pBuf3;
  153. add esp, 0Ch //restore stack
  154. mov [ebp+i], eax //i=pBuf3
  155. and dword ptr [esi], 0 //*arg_10=0
  156. mov [ebp+arg_10], 1 //arg_10=1
  157. loc_0_43D1D0: //do {
  158. cmp edi, ebx
  159. jge short loc_0_43D1E3 //  if(edi<ebx){
  160. call _rand
  161. mov [ebp+edi+pBuf1], al // pBuf1[edi]=rand()
  162. inc edi // edi++
  163. inc [ebp+arg_10] // arg_10++
  164. //  }
  165. cmp edi, ebx
  166. loc_0_43D1E3:
  167. jnz short loc_0_43D21C //  if(edi==ebx){
  168. mov ecx, [ebp+i] // ecx=i i=pBuf3;
  169. lea eax, [ebp+pBuf1] // eax=pBuf1
  170. xor edi, edi // edi=0;
  171. sub ecx, eax // ecx=i-pBuf1; ecx=pBuf3-pBuf1;
  172. loc_0_43D1EF: //  do{
  173. lea eax, [ebp+edi+pBuf1] //
  174. mov dl, [ecx+eax] //
  175. xor [eax], dl // pBuf1[edi]^=pBuf3[edi];
  176. inc edi // edi++
  177. cmp edi, ebx //
  178. jl short loc_0_43D1EF //  }while(edi<ebx);
  179. push [ebp+arg_C] //  push arg_C
  180. lea eax, [ebp+pBuf1] //  eax=pBuf1
  181. push [ebp+arg_8] //  push arg_8
  182. push eax
  183. call TeaEncrypt //  TeaEncrypt(pBuf1,arg_8,arg_c);
  184. mov eax, [ebp+arg_C] //  eax=arg_C;
  185. add [esi], ebx //  *esi+=ebx;maybe ebx=8
  186. add esp, 0Ch //  restore stack
  187. xor edi, edi //  edi=0;
  188. add [ebp+arg_C], ebx //  arg_C+=ebx;
  189. mov [ebp+i], eax // //  i=arg_C;
  190. loc_0_43D21C: //
  191. cmp [ebp+arg_10], 2
  192. jle short loc_0_43D1D0 //}while(arg_10>=2);
  193. loc_0_43D222:
  194. cmp [ebp+arg_4], 0
  195. jz short loc_0_43D279 //while(arg_4!=0){
  196. cmp edi, ebx //  if(edi<ebx){
  197. jge short loc_0_43D23E //
  198. mov eax, [ebp+arg_0] // eax=arg_0;
  199. inc edi // edi++;
  200. inc [ebp+arg_0] // arg_0++;
  201. dec [ebp+arg_4] // arg_4--;
  202. mov al, [eax] //
  203. cmp edi, ebx //
  204. mov [ebp+edi+pBuf2], al // pBuf2[edi]=*arg_0;
  205. //  }
  206. loc_0_43D23E:
  207. jnz short loc_0_43D222 //  if(edi!=ebx)continue;
  208. mov ecx, [ebp+i] //  ecx=i;
  209. lea eax, [ebp+pBuf1] //  eax=pBuf1;
  210. xor edi, edi //  edi=0;
  211. sub ecx, eax //  ecx=arg_C-pBuf1;
  212. loc_0_43D24A: //  do {
  213. lea eax, [ebp+edi+pBuf1] // eax=pBuf1+edi
  214. mov dl, [ecx+eax] // dl=arg_C+edi;
  215. xor [eax], dl // pBuf1[edi]^=arg_C[edi];
  216. inc edi // edi++;
  217. cmp edi, ebx //
  218. jl short loc_0_43D24A //  while(edi>ebx);
  219. push [ebp+arg_C] //  
  220. lea eax, [ebp+pBuf1]
  221. push [ebp+arg_8]
  222. push eax
  223. call TeaEncrypt //  TeaEncrypt(pBuf1,arg_8,arg_c);
  224. mov eax, [ebp+arg_C] //  eax=arg_C;
  225. add [esi], ebx //  *esi+=ebx;
  226. add esp, 0Ch
  227. xor edi, edi //  edi+0;
  228. add [ebp+arg_C], ebx //  arg_C+=ebx;
  229. mov [ebp+i], eax //  i=arg_C;
  230. jmp short loc_0_43D222 //}arg_4!=0;
  231. loc_0_43D279:
  232. mov [ebp+arg_10], 1 //arg_10=1;
  233. loc_0_43D280: //do{
  234. cmp edi, ebx //
  235. jge short loc_0_43D28F //  if(edi<ebx){
  236. and [ebp+edi+pBuf1], 0 //   pBuf1[edi]=0;
  237. inc edi //   edi++;
  238. inc [ebp+arg_10] //   arg_10++;
  239. cmp edi, ebx //  }
  240. loc_0_43D28F:
  241. jnz short loc_0_43D2C8 //  else if(edi==ebx){
  242. mov ecx, [ebp+i] //   ecx=arg_C;
  243. lea eax, [ebp+pBuf1] //   eax=pBuf1;
  244. xor edi, edi //   edi=0;
  245. sub ecx, eax //   ecx=i-pBuf1;
  246. loc_0_43D29B: //   do{
  247. lea eax, [ebp+edi+pBuf1] //
  248. mov dl, [ecx+eax] //
  249. xor [eax], dl //   pBuf1[edi]^=arg_c[edi];
  250. inc edi //   edi++;
  251. cmp edi, ebx
  252. jl short loc_0_43D29B //   while(edi>ebx);
  253. push [ebp+arg_C] //
  254. lea eax, [ebp+pBuf1]
  255. push [ebp+arg_8]
  256. push eax
  257. call TeaEncrypt //   TeaEncrypt(pBuf1,arg_8,arg_c);
  258. mov eax, [ebp+arg_C] //   eax=arg_c;
  259. add [esi], ebx //   *esi+=ebx;
  260. add esp, 0Ch //  
  261. xor edi, edi //   edi=0;
  262. add [ebp+arg_C], ebx //   arg_c+=ebx;
  263. mov [ebp+i], eax //   i=arg_c;
  264. loc_0_43D2C8: //   }
  265. cmp [ebp+arg_10], 7
  266. jle short loc_0_43D280 //}while(arg_10>=7);
  267. pop edi
  268. pop esi
  269. pop ebx
  270. leave
  271. retn
  272. _SymmetryEncrypt endp
  273. _text   ends